[FFmpeg-devel] [PATCHv2 4/4] lavc: add teletext decoder using libzvbi
Marton Balint
cus at passwd.hu
Tue Aug 6 19:45:32 CEST 2013
On Mon, 5 Aug 2013, Michael Niedermayer wrote:
> On Sun, Aug 04, 2013 at 06:37:47PM +0200, Marton Balint wrote:
>> Based on a patch by Wolfram Gloger <wmglo at dent.med.uni-muenchen.de>.
>> http://lists.ffmpeg.org/pipermail/ffmpeg-devel/2012-December/136677.html
>>
>> The original patch was rebased by Tudor SUCIU <tudor.suciu at gmail.com>.
>>
>> Lots of additional features and fixes are made by me.
>>
>> Signed-off-by: Marton Balint <cus at passwd.hu>
>> ---
>> Changelog | 1 +
>> configure | 5 +
>> libavcodec/Makefile | 1 +
>> libavcodec/allcodecs.c | 1 +
>> libavcodec/avcodec.h | 6 +
>> libavcodec/teletextdec.c | 468 +++++++++++++++++++++++++++++++++++++++++++++++
>> libavformat/mpegts.c | 8 +
>> libavformat/version.h | 2 +-
>> 8 files changed, 491 insertions(+), 1 deletion(-)
>> create mode 100644 libavcodec/teletextdec.c
>>
>> diff --git a/Changelog b/Changelog
>> index 48f93c7..0cbfffb 100644
>> --- a/Changelog
>> +++ b/Changelog
>> @@ -8,6 +8,7 @@ version <next>
>> - ffprobe -show_programs option
>> - compand filter
>> - RTMP seek support
>> +- dvb teletext decoder
>>
>>
>> version 2.0:
>> diff --git a/configure b/configure
>> index 539c581..0895b61 100755
>> --- a/configure
>> +++ b/configure
>> @@ -241,6 +241,7 @@ External library support:
>> --enable-libxvid enable Xvid encoding via xvidcore,
>> native MPEG-4/Xvid encoder exists [no]
>> --enable-libzmq enable message passing via libzmq [no]
>> + --enable-libzvbi enable teletext support via libzvbi [no]
>> --enable-openal enable OpenAL 1.1 capture support [no]
>> --enable-opencl enable OpenCL code
>> --enable-openssl enable openssl [no]
>> @@ -1204,6 +1205,7 @@ EXTERNAL_LIBRARY_LIST="
>> libxavs
>> libxvid
>> libzmq
>> + libzvbi
>> openal
>> opencl
>> openssl
>> @@ -2031,6 +2033,7 @@ libxavs_encoder_deps="libxavs"
>> libxvid_encoder_deps="libxvid"
>> libutvideo_decoder_deps="libutvideo"
>> libutvideo_encoder_deps="libutvideo"
>> +teletext_decoder_deps="libzvbi"
>>
>> # demuxers / muxers
>> ac3_demuxer_select="ac3_parser"
>> @@ -4206,6 +4209,7 @@ enabled libx264 && require libx264 x264.h x264_encoder_encode -lx264 &
>> enabled libxavs && require libxavs xavs.h xavs_encoder_encode -lxavs
>> enabled libxvid && require libxvid xvid.h xvid_global -lxvidcore
>> enabled libzmq && require_pkg_config libzmq zmq.h zmq_ctx_new
>> +enabled libzvbi && require libzvbi libzvbi.h vbi_decoder_new -lzvbi
>> enabled openal && { { for al_libs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do
>> check_lib 'AL/al.h' alGetError "${al_libs}" && break; done } ||
>> die "ERROR: openal not found"; } &&
>> @@ -4596,6 +4600,7 @@ echo "threading support ${thread_type-no}"
>> echo "safe bitstream reader ${safe_bitstream_reader-no}"
>> echo "SDL support ${sdl-no}"
>> echo "opencl enabled ${opencl-no}"
>> +echo "libzvbi enabled ${libzvbi-no}"
>> echo "texi2html enabled ${texi2html-no}"
>> echo "perl enabled ${perl-no}"
>> echo "pod2man enabled ${pod2man-no}"
>> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
>> index 31477ac..62fb250 100644
>> --- a/libavcodec/Makefile
>> +++ b/libavcodec/Makefile
>> @@ -719,6 +719,7 @@ OBJS-$(CONFIG_LIBWAVPACK_ENCODER) += libwavpackenc.o
>> OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o
>> OBJS-$(CONFIG_LIBXAVS_ENCODER) += libxavs.o
>> OBJS-$(CONFIG_LIBXVID_ENCODER) += libxvid.o
>> +OBJS-$(CONFIG_TELETEXT_DECODER) += teletextdec.o
>>
>> # parsers
>> OBJS-$(CONFIG_AAC_PARSER) += aac_parser.o aac_ac3_parser.o \
>> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
>> index 5cdf778..daf5915 100644
>> --- a/libavcodec/allcodecs.c
>> +++ b/libavcodec/allcodecs.c
>> @@ -470,6 +470,7 @@ void avcodec_register_all(void)
>> REGISTER_ENCDEC (SUBRIP, subrip);
>> REGISTER_DECODER(SUBVIEWER, subviewer);
>> REGISTER_DECODER(SUBVIEWER1, subviewer1);
>> + REGISTER_DECODER(TELETEXT, teletext);
>> REGISTER_DECODER(TEXT, text);
>> REGISTER_DECODER(VPLAYER, vplayer);
>> REGISTER_DECODER(WEBVTT, webvtt);
>> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
>> index ae6625f..0704639 100644
>> --- a/libavcodec/avcodec.h
>> +++ b/libavcodec/avcodec.h
>> @@ -1001,6 +1001,12 @@ enum AVPacketSideDataType {
>> * follow the timestamp specifier of a WebVTT cue.
>> */
>> AV_PKT_DATA_WEBVTT_SETTINGS,
>> +
>> + /**
>> + * PES header of the packet generated by the mpegts demuxer. Only set for
>> + * dvb teletext subtitles. (libzvbi needs also the pes header for decoding)
>> + */
>> + AV_PKT_DATA_MPEGTS_PESHEADER,
>
> why does libzvbi need the header ?
The way I see it it does some sanity checks on it (length, etc) and
decodes the PTS in the PES header. The decoder later uses that PTS to
provide timestamp information to libzvbi which detects dropped vbi frames
if the difference is too big (or small) between two pts values.
>
> what if the stream comes from a non PES based container ?
> like if someone transcodes mpeg->mkv/nut whatever and then tries to
> play that
Probably we should create a fake PES header based on the packet pts, and
feed it to libzvbi.
However, because of the fix pts stuff in the mpegts demuxer some errors in
the packet pts values are possible which errors may be misdetected as
frame drops by libzvbi.
So probably the best thing we can do is if we always pass 0 as PTS to
libzvbi to disable this desync feature of it, and accept the possibly of
corrupt pages in case of a packet loss.
What do you think, should I remove the pes header side data entirely, or
keep it in the demuxer, but if it does not exist in the decoder, then
generate the fake PES header?
Thanks,
Marton
More information about the ffmpeg-devel
mailing list