/** * 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); }
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; } }
/***************************************************************************** * 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; }
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; }