/**
 * init the component, this must be done first
 */
void txt_init_lib()
{
  int error;
  txtdata = calloc(1, sizeof(*txtdata));
  assert(txtdata != NULL); 
  txtdata->m_decoder = vbi_decoder_new();
  assert(txtdata->m_decoder != NULL);
  error = vbi_event_handler_add(txtdata->m_decoder, VBI_EVENT_TTX_PAGE, event_handler, NULL);
  txtdata->m_demuxer = vbi_dvb_pes_demux_new( NULL , NULL );
  assert(txtdata->m_demuxer != NULL);
}
Ejemplo n.º 2
0
static gboolean
gst_teletextdec_sink_setcaps (GstPad * pad, GstCaps * caps)
{
  GstTeletextDec *teletext = GST_TELETEXTDEC (gst_pad_get_parent (pad));
  GstStructure *structure = gst_caps_get_structure (caps, 0);
  const gchar *mimetype = gst_structure_get_name (structure);

  GST_DEBUG_OBJECT (teletext, "%s:%s, caps=%" GST_PTR_FORMAT,
      GST_DEBUG_PAD_NAME (pad), caps);

  if (g_strcmp0 (mimetype, "private/teletext") == 0) {
    teletext->process_buf_func = gst_teletextdec_process_telx_buffer;
    goto accept_caps;
  } else if (g_strcmp0 (mimetype, "video/mpeg") == 0) {
    gint version;
    gboolean is_systemstream;

    if (!gst_structure_get_int (structure, "mpegversion", &version) ||
        !gst_structure_get_boolean (structure, "systemstream",
            &is_systemstream))
      goto refuse_caps;

    if (version != 2 || !is_systemstream)
      goto refuse_caps;

    teletext->process_buf_func = gst_teletextdec_process_pes_buffer;
    teletext->demux = vbi_dvb_pes_demux_new (gst_teletextdec_convert, teletext);
    goto accept_caps;
  } else
    goto refuse_caps;

accept_caps:
  {
    gst_object_unref (teletext);
    return gst_teletextdec_push_preroll_buffer (teletext);
  }

refuse_caps:
  {
    GST_ERROR_OBJECT (teletext,
        "pad %s refused renegotiation to %" GST_PTR_FORMAT,
        GST_PAD_NAME (pad), caps);
    gst_object_unref (teletext);
    return FALSE;
  }
}
Ejemplo n.º 3
0
/*****************************************************************************
 * Open: probe the decoder and return score
 *****************************************************************************
 * Tries to launch a decoder and return score so that the interface is able
 * to chose.
 *****************************************************************************/
static int Open( vlc_object_t *p_this )
{
    decoder_t     *p_dec = (decoder_t *) p_this;
    decoder_sys_t *p_sys = NULL;

    if( p_dec->fmt_in.i_codec != VLC_CODEC_TELETEXT )
        return VLC_EGENERIC;

    p_dec->pf_decode_sub = Decode;
    p_sys = p_dec->p_sys = calloc( 1, sizeof(decoder_sys_t) );
    if( p_sys == NULL )
        return VLC_ENOMEM;

    p_sys->i_key[0] = p_sys->i_key[1] = p_sys->i_key[2] = '*' - '0';
    p_sys->b_update = false;
    p_sys->p_vbi_dec = vbi_decoder_new();
    p_sys->p_dvb_demux = vbi_dvb_pes_demux_new( NULL, NULL );
    vlc_mutex_init( &p_sys->lock );

    if( (p_sys->p_vbi_dec == NULL) || (p_sys->p_dvb_demux == NULL) )
    {
        msg_Err( p_dec, "VBI decoder/demux could not be created." );
        Close( p_this );
        return VLC_ENOMEM;
    }

    /* Some broadcasters in countries with level 1 and level 1.5 still not send a G0 to do 
     * matches against table 32 of ETSI 300 706. We try to do some best effort guessing
     * This is not perfect, but might handle some cases where we know the vbi language 
     * is known. It would be better if people started sending G0 */
    for( int i = 0; ppsz_default_triplet[i] != NULL; i++ )
    {
        if( p_dec->fmt_in.psz_language && !strcasecmp( p_dec->fmt_in.psz_language, ppsz_default_triplet[i] ) )
        {
            vbi_teletext_set_default_region( p_sys->p_vbi_dec, pi_default_triplet[i]);
            msg_Dbg( p_dec, "overwriting default zvbi region: %d", pi_default_triplet[i] );
        }
    }

    vbi_event_handler_register( p_sys->p_vbi_dec, VBI_EVENT_TTX_PAGE | VBI_EVENT_NETWORK |
#ifdef ZVBI_DEBUG
                                VBI_EVENT_CAPTION | VBI_EVENT_TRIGGER |
                                VBI_EVENT_ASPECT | VBI_EVENT_PROG_INFO | VBI_EVENT_NETWORK_ID |
#endif
                                0 , EventHandler, p_dec );

    /* Create the var on vlc_global. */
    p_sys->i_wanted_page = var_CreateGetInteger( p_dec, "vbi-page" );
    var_AddCallback( p_dec, "vbi-page", RequestPage, p_sys );

    /* Check if the Teletext track has a known "initial page". */
    if( p_sys->i_wanted_page == 100 && p_dec->fmt_in.subs.teletext.i_magazine != -1 )
    {
        p_sys->i_wanted_page = 100 * p_dec->fmt_in.subs.teletext.i_magazine +
                               vbi_bcd2dec( p_dec->fmt_in.subs.teletext.i_page );
        var_SetInteger( p_dec, "vbi-page", p_sys->i_wanted_page );
    }
    p_sys->i_wanted_subpage = VBI_ANY_SUBNO;

    p_sys->b_opaque = var_CreateGetBool( p_dec, "vbi-opaque" );
    var_AddCallback( p_dec, "vbi-opaque", Opaque, p_sys );

    p_sys->i_align = var_CreateGetInteger( p_dec, "vbi-position" );
    var_AddCallback( p_dec, "vbi-position", Position, p_sys );

    p_sys->b_text = var_CreateGetBool( p_dec, "vbi-text" );
//    var_AddCallback( p_dec, "vbi-text", Text, p_sys );

    /* Listen for keys */
    var_AddCallback( p_dec->p_libvlc, "key-pressed", EventKey, p_dec );

    es_format_Init( &p_dec->fmt_out, SPU_ES, VLC_CODEC_SPU );
    if( p_sys->b_text )
        p_dec->fmt_out.video.i_chroma = VLC_CODEC_TEXT;
    else
        p_dec->fmt_out.video.i_chroma = VLC_CODEC_RGBA;
    return VLC_SUCCESS;
}
Ejemplo n.º 4
0
vbi_capture *
vbi_capture_dvb_new2		(const char *		device_name,
				 unsigned int		pid,
				 char **		errstr,
				 vbi_bool		trace)
{
	char *error = NULL;
	int saved_errno;
	vbi_capture_dvb *dvb;

	pthread_once (&vbi_init_once, vbi_init);

	if (NULL == errstr)
		errstr = &error;
	*errstr = NULL;

	dvb = vbi_malloc (sizeof (*dvb));
	if (NULL == dvb)
		goto no_memory;

	CLEAR (*dvb);

	dvb->capture.read		= dvb_read;
	dvb->capture.sampling_point	= NULL;
	dvb->capture.debug		= NULL;
	dvb->capture.parameters		= dvb_parameters;
	dvb->capture.update_services	= dvb_update_services;
	dvb->capture.get_scanning	= NULL;
	dvb->capture.flush		= dvb_flush;
	dvb->capture.get_fd		= dvb_get_fd;
	dvb->capture.get_fd_flags	= dvb_get_fd_flags;
	dvb->capture.set_video_path	= NULL;
	dvb->capture._delete		= dvb_delete;

	dvb->fd = -1;

	dvb->do_trace = trace;

	dvb->demux = vbi_dvb_pes_demux_new (/* callback */ NULL,
					    /* user_data */ NULL);
	if (NULL == dvb->demux)
		goto no_memory;

	if (!open_device (dvb, device_name, errstr)) {
		saved_errno = errno;
		goto failed;
	}

	printv ("Opened device %s\n", device_name);

	if (0 != pid) {
		if (-1 == vbi_capture_dvb_filter (&dvb->capture, pid)) {
			saved_errno = errno;
			asprintf (errstr, _("DMX_SET_PES_FILTER failed: %s."),
				  strerror (errno));
			goto failed;
		}
	}

	dvb_flush (&dvb->capture);

	if (errstr == &error) {
		free (error);
		error = NULL;
	}

	return &dvb->capture;

 no_memory:
	asprintf (errstr, _("Virtual memory exhausted."));

	saved_errno = ENOMEM;

	/* fall through */

 failed:
	if (NULL != dvb) {
		dvb_delete (&dvb->capture);
		dvb = NULL;
	}

	if (errstr == &error) {
		free (error);
		error = NULL;
	}

	errno = saved_errno;

	return NULL;
}