[FFmpeg-devel] [PATCH] Additional probing based on sequence header and group startcodes

Jai Menon jmenon86
Sun Jun 14 12:22:07 CEST 2009


On Sun, Jun 14, 2009 at 10:16 AM, Baptiste
Coudurier<baptiste.coudurier at gmail.com> wrote:
> Baptiste Coudurier wrote:
>> Jai Menon wrote:
>>> On Sat, Jun 13, 2009 at 10:21 PM, Baptiste
>>> Coudurier<baptiste.coudurier at gmail.com> wrote:
>>>> Jai Menon wrote:
>>>>> On Sat, Jun 13, 2009 at 9:29 PM, Baptiste
>>>>> Coudurier<baptiste.coudurier at gmail.com> wrote:
>>>>>> Michael Niedermayer wrote:
>>>>>>> On Sat, Jun 13, 2009 at 08:27:26PM +0000, Jai Menon wrote:
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> I'm not too familiar with the probing mechanism so any help is
>>>>>>>> appreciated. This might not be the right way to do it. Also, this
>>>>>>>> fixes issue 1185 and possibly others.
>>>>>>> [...]
>>>>>>>> diff --git a/libavformat/utils.c b/libavformat/utils.c
>>>>>>>> index dc18885..0096343 100644
>>>>>>>> --- a/libavformat/utils.c
>>>>>>>> +++ b/libavformat/utils.c
>>>>>>>> @@ -339,6 +339,9 @@ static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score)
>>>>>>>> ? ? ? ? ?} else if (!strcmp(fmt->name, "dts")) {
>>>>>>>> ? ? ? ? ? ? ?st->codec->codec_id = CODEC_ID_DTS;
>>>>>>>> ? ? ? ? ? ? ?st->codec->codec_type = CODEC_TYPE_AUDIO;
>>>>>>>> + ? ? ? ?} else if (!strcmp(fmt->name, "mpeg")) {
>>>>>>>> + ? ? ? ? ? ?st->codec->codec_id = CODEC_ID_MPEG2VIDEO;
>>>>>>>> + ? ? ? ? ? ?st->codec->codec_type = CODEC_TYPE_VIDEO;
>>>>>>>> ? ? ? ? ?}
>>>>>>>> ? ? ?}
>>>>>>>> ? ? ?return !!fmt;
>>>>>>> this part is ok and can be commited seperately
>>>>>> Humm, what if stream contain H264 ? "mpeg" is mpeg ps demuxer.
>>>>> Do you have any samples where avc isn't muxed with ES type 0x1b set in
>>>>> the stream map? I had thought about this too and hoped if nothing else
>>>>> to get a sample. And what should be done in this case? should the
>>>>> probing be done in the demuxer?
>>>>>
>>>> No I don't have a sample. Thing is if "mpeg" matches this does not say
>>>> that stream contains mpeg2video. This case is handled by mpegvideo
>>>> probe. If this stream is not matched for a reason, the reason should be
>>>> in mpegvideo probe.
>>> Thanks for the explanation, I added the modifications to the mpegvideo
>>> probe code in raw.c.
>>> Patch attached.
>>>
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> From ab037622f26b512c79c4f0f1edd7c2974ea6368e Mon Sep 17 00:00:00 2001
>>> From: Jai Menon <jai at retroficial.org>
>>> Date: Sun, 14 Jun 2009 13:27:29 +0000
>>> Subject: [PATCH 2/2] add additional probing based on group startcode.
>>>
>>> ---
>>> ?libavformat/raw.c | ? ?6 +++++-
>>> ?1 files changed, 5 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/libavformat/raw.c b/libavformat/raw.c
>>> index f086581..265d9cb 100644
>>> --- a/libavformat/raw.c
>>> +++ b/libavformat/raw.c
>>> @@ -309,6 +309,7 @@ static int mpegvideo_probe(AVProbeData *p)
>>> ?{
>>> ? ? ?uint32_t code= -1;
>>> ? ? ?int pic=0, seq=0, slice=0, pspack=0, pes=0;
>>> + ? ?int gop = 0;
>>> ? ? ?int i;
>>>
>>> ? ? ?for(i=0; i<p->buf_size; i++){
>>> @@ -319,13 +320,16 @@ static int mpegvideo_probe(AVProbeData *p)
>>> ? ? ? ? ? ? ?case PICTURE_START_CODE: ? pic++; break;
>>> ? ? ? ? ? ? ?case ? SLICE_START_CODE: slice++; break;
>>> ? ? ? ? ? ? ?case ? ?PACK_START_CODE: pspack++; break;
>>> + ? ? ? ? ? ?case ? ?GOP_START_CODE: ?gop++; ? ? break;
>>> ? ? ? ? ? ? ?}
>>> ? ? ? ? ? ? ?if ? ? ((code & 0x1f0) == VIDEO_ID) ? pes++;
>>> ? ? ? ? ? ? ?else if((code & 0x1e0) == AUDIO_ID) ? pes++;
>>> ? ? ? ? ?}
>>> ? ? ?}
>>> ? ? ?if(seq && seq*9<=pic*10 && pic*9<=slice*10 && !pspack && !pes)
>>> - ? ? ? ?return AVPROBE_SCORE_MAX/2+1; // +1 for .mpg
>>> + ? ? ? ?return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg
>>> + ? ?if(pic*9<=slice*10 && pes && !gop)
>>> + ? ? ? ?return AVPROBE_SCORE_MAX/2+1;
>>> ? ? ?return 0;
>>
>> Humm I don't get it, in mpeg2video, gop start code has good chance to be
>> present. Why are you checking for !gop and pes. If a pes is present it's
>> probably PS or TS.
>>
>> What are you trying to achieve ?
>>
>
> Ok, after analyzing the file, it need the +2, since the elementary
> stream is incorrectly detected as dts. So either fix dts to not detect
> it or raise score.

Yes, dts == 51 there. And i tried with some 20 raw mpeg[12] videos and
dts hits 25 and 51 _very_ frequently. I'm inclined to call it a bug.
We should have more intelligent probing there.


-- 
Regards,

Jai



More information about the ffmpeg-devel mailing list