[FFmpeg-devel] [PATCH] DVB Subtitles Fix

Ivan Kalvachev ikalvachev at gmail.com
Wed May 4 22:32:07 CEST 2011


On 5/4/11, Michael Niedermayer <michaelni at gmx.at> wrote:
> On Wed, May 04, 2011 at 07:18:12PM +0100, JULIAN GARDNER wrote:
>>
>>
>>
>>
>> ----- Original Message -----
>> > From: Michael Niedermayer <michaelni at gmx.at>
>> > To: FFmpeg development discussions and patches <ffmpeg-devel at ffmpeg.org>
>> > Cc:
>> > Sent: Wednesday, 4 May 2011, 18:25
>> > Subject: Re: [FFmpeg-devel] [PATCH] DVB Subtitles Fix
>> >
>> > On Wed, May 04, 2011 at 04:11:33PM +0100, JULIAN GARDNER wrote:
>> >>
>> >>
>> >>
>> >>
>> >>  ----- Original Message -----
>> >>  > From: Michael Niedermayer <michaelni at gmx.at>
>> >>  > To: FFmpeg development discussions and patches
>> > <ffmpeg-devel at ffmpeg.org>
>> >>  > Cc:
>> >>  > Sent: Wednesday, 4 May 2011, 15:14
>> >>  > Subject: Re: [FFmpeg-devel] [PATCH] DVB Subtitles Fix
>> >>  >
>> >>  > On Tue, Apr 26, 2011 at 11:34:10PM +0100, JULIAN GARDNER wrote:
>> >>  >>  Ok first patch to fix the decoding and re-encoding of DVB
>> > Subtitles.
>> >>  >>
>> >>  >>  I went through and validated against the spec, my own engine and
>> > fixed the
>> >>  > bits that were failing or wrong.
>> >>  >
>> >>  > please explain how to reproduce the bugs that your patch fixes
>> >>  >
>> >>  > Also please explain more elaborately what and why each change is
>> >> made.
>> >>  >
>> >>
>> >>  I use LIVE and RECORDED streams from various sources which i have
>> >> collected
>> > over the past years, these are put through ffmpeg and then the output
>> > stream is
>> > played out in VLC and a couple of my own receivers which are used in
>> > professional cable networks.
>> >
>> > understood, but does this patch fix any problem with these ffmpeg
>> > generated streams?
>> > Iam asking because id like to reproduce the problem and the fix.
>> >
>> >
>> it fixes all the problems with the encoded streams, also it allows FFMPEG
>> to process a file correctly without bailing out with an error.
>>
>> I can upload a couple of streams if you want for you to see the problems.
>
> thanks, yes this would help me.
>
> if they are small you can upload to our issue tracker
> http://ffmpeg.org/trac/ffmpeg
>
>
>>
>> >>
>> >>  >
>> >>  >>
>> >>  >>  I have tested this on recorded streams and live streams and found
>> > no
>> >>  > problems except for one which i will try and explain about.
>> >>  >>
>> >>  >>  Here in the UK some of our channels use a live speech convertor
>> > where you
>> >>  > see the words appear as they are spoken, now this works fine but the
>> >>
>> > way the
>> >>  > decode/encode works a lot more space is taken by this encoder for
>> >> the
>> > subsequent
>> >>  > encoded stream. In one test the incoming packets made up around 3k
>> >> of
>> > data, but
>> >>  > the amount of data in the output stream was around 15k.
>> >>  >>
>> >>  >>  joolz
>> >>  >
>> >>  >>   ffmpeg.c               |   11 -
>> >>  >>   libavcodec/dvbsub.c    |  103 ++++++++---------
>> >>  >>   libavcodec/dvbsubdec.c |  296
>> >>  > +++++++++++++++++++++++++++++--------------------
>> >>  >>   libavcodec/utils.c     |    3
>> >>  >>   4 files changed, 233 insertions(+), 180 deletions(-)
>> >>  >>  d22a3a04cf764a0b25138652ad82fe484311405f  dvbsubs.diff
>> >>  >>  diff --git a/ffmpeg.c b/ffmpeg.c
>> >>  >>  index 2c69608..e88bcfc 100644
>> >>  >>  --- a/ffmpeg.c
>> >>  >>  +++ b/ffmpeg.c
>> >>  >>  @@ -1092,15 +1092,8 @@ static void
>> > do_subtitle_out(AVFormatContext *s,
>> >>  >>           subtitle_out = av_malloc(subtitle_out_max_size);
>> >>  >>       }
>> >>  >>
>> >>  >>  -    /* Note: DVB subtitle need one packet to draw them and one
>> > other
>> >>  >>  -       packet to clear them */
>> >>  >>  -    /* XXX: signal it in the codec context ? */
>> >>  >>  -    if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
>> >>  >>  -        nb = 2;
>> >>  >>  -    else
>> >>  >>  -        nb = 1;
>> >>  >>  -
>> >>  >>  -    for(i = 0; i < nb; i++) {
>> >>  >>  +    i = 0;
>> >>  >>  +    {
>> >>  >>           sub->pts = av_rescale_q(pts,
>> > ist->st->time_base,
>> >>  > AV_TIME_BASE_Q);
>> >>  >>           // start_display_time is required to be 0
>> >>  >>           sub->pts              +=
>> >>  > av_rescale_q(sub->start_display_time, (AVRational){1, 1000},
>> > AV_TIME_BASE_Q);
>> >>  >
>> >>  > why is this changed?
>> >>  >
>> >>
>> >>  Because only one stream is needed to process DVB Subtitles, i could
>> >> not
>> > work out why you needed this. The NOTE is wrong regarding needed one to
>> > draw and
>> > one to remove
>> >>
>> >>  What you will get from the DVB Stream is a packet with NO regions,
>> >> this is
>> > the one that removes the subtitles from the picture, as per the spec,
>> > there is a
>> > timeout value, which in the ffmpeg engine is always set to 30 seconds,
>> > this
>> > would cause the receiving unit to switch off the display after 30
>> > seconds of no
>> > valid dvb stream.
>> >
>> > Lets assume something generates subtitles, lets say it generates one
>> > displaying "hello world" at start time 0:10 and end time 0:50
>> > If i understand you correctly this needs a packet muxed with time 0:10
>> > and a empty clear packet muxed at time 0:50
>> >
>> > And this loop generates these 2 packets from 1 subtitle with start and
>> > end times.
>> >
>> > You remove it and i dont see how this could still work afterwards
>> > maybe iam missing something ?
>>
>> The subtitles dont have an end time per se, what you have is a display
>> time and a timeout value, this is incase of a stream problem or corruption

>> for a missing packet.
>>
>> now what happens is in you example you would get a display packet with
>> regions/objects/cluts etc and a timeout of 60, then around 50 seconds into
>> the stream you would get a packet which has no objects/regions/cluts. This
>> packet would turn the subs off, now if this packet was corrupted then the
>> timeout would take care of the removal.
>
> I understand that, but this is only so when the source is dvb subs too
> it can be something else.a different subtitle format for example.

This nb variable doesn't have anything with the numbers of streams.

It ensures that in case of DVB output it would write 2 packets.
The first one with the subtitles and the second one with no
regions/segments/cluts.
It does call avcodec_encode_subtitles() twice, so it does get
different packets (I hope).
It is kind of running the whole function twice in a row.

It seems that the dvb encoder have variable "hide_state" that always
inverts itself when called, so every second encoded packet would be
"hide" packet. And It seems that removing this variable is part of
your patch.

So I guess the question is. If the source (input) subtitles are of the
type that have both valid start and end time, how do you output 2
packets (one to show and one to hide) ?
Well, I guess this is mostly problem for the time when we have
ass/ssa->dvb rendering.


More information about the ffmpeg-devel mailing list