[FFmpeg-devel] [PATCH] AVCHD/H.264 parser: determination of frame type, question about timestamps
Nico Sabbi
Nicola.Sabbi
Fri Jan 23 14:40:57 CET 2009
On Friday 23 January 2009 09:02:20 Ivan Schreter wrote:
> Hi,
>
> Loren Merritt wrote:
> > On Thu, 22 Jan 2009, Ivan Schreter wrote
> >
> >> Your patch is much more elegant, but I changed the following:
> >>> + case NAL_IDR_SLICE:
> >>> + case NAL_SLICE:
> >>> + get_ue_golomb(&h->s.gb);
> >>> + if(get_ue_golomb(&h->s.gb) % 5 == 2)
> >>> + s->pict_type= FF_I_TYPE;
> >>> + else
> >>> + s->pict_type= FF_P_TYPE;
> >>> + return;
> >>> +
> >>
> >> to this:
> >>
> >> + case NAL_IDR_SLICE:
> >> + case NAL_SLICE:
> >> + get_ue_golomb(&h->s.gb);
> >> + s->pict_type=
> >> golomb_to_pict_type[get_ue_golomb(&h->s.gb) % 5]; +
> >> return;
> >>
> >> Reason: Your code didn't correctly set pict_type to FF_B_TYPE
> >> for B-frames, so timing didn't work correctly. Since we already
> >> have mapping array, I simply used it to map it instead of adding
> >> another if statement.
> >
> > Certainly frame type should be fixed, but what does this have to
> > do with timing? H.264 allows any frame types to be reordered, or
> > not, as the encoder pleases.
>
> This part has nothing to do with timing, only with returning proper
> frame type.
>
> There is also a change in mpegts (code from Baptiste):
>
> --- libavformat/mpegts.c (revision 16686)
> +++ libavformat/mpegts.c (working copy)
> @@ -888,7 +888,7 @@
> pes->pts = AV_NOPTS_VALUE;
> pes->dts = AV_NOPTS_VALUE;
> if ((flags & 0xc0) == 0x80) {
> - pes->pts = get_pts(r);
> + pes->dts = pes->pts = get_pts(r);
> r += 5;
> } else if ((flags & 0xc0) == 0xc0) {
> pes->pts = get_pts(r);
>
> this makes sure that frames having only PTS will get the same DTS
> (note: only for mpegts). Otherwise, libavformat gets confused and
> computes wrong DTS timestamps, which in turn results in
> dropping/duplicating frames in ffmpeg.c while recoding.
>
> There are further problems, which my patch doesn't address. Current
> patch only allows decoding progressive AVCHD files from my
> camcorder. Interlaced don't work yet, but without (at least some)
> info I asked for in my previous mail I cannot really analyze the
> problem.
>
> Regards,
>
> Ivan
this patch is wrong: if the DTS is not set in the PES there's no
reason to assum that it's equal to the PTS. If it's a workround for a
bug in the parser the parser should be fixed instead
More information about the ffmpeg-devel
mailing list