[FFmpeg-devel] [PATCH] lavf/mpegtsdec: fix AVPacket.pos when FEC/DVHS/BDAV data is present

Hendrik Leppkes h.leppkes at gmail.com
Fri Aug 31 12:47:03 EEST 2018


On Fri, Aug 31, 2018 at 7:28 AM Rodger Combs <rodger.combs at gmail.com> wrote:
>
> We previously set pos to several bytes before the actual packet sync byte,
> which meant that seeking to pos relied on resync working, which can fail
> if there are 0x47 bytes in the additional data.
>
> The resync issue should probably also be fixed separately.
> ---
>  libavformat/mpegts.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
> index a5cb17ac16..881708b42d 100644
> --- a/libavformat/mpegts.c
> +++ b/libavformat/mpegts.c
> @@ -2581,10 +2581,9 @@ static int handle_packet(MpegTSContext *ts, const uint8_t *packet)
>
>      } else {
>          int ret;
> -        // Note: The position here points actually behind the current packet.

This comment still applies, which is why we substract the packet size
from the position. Probably shouldn't remove it.

>          if (tss->type == MPEGTS_PES) {
>              if ((ret = tss->u.pes_filter.pes_cb(tss, p, p_end - p, is_start,
> -                                                pos - ts->raw_packet_size)) < 0)
> +                                                pos - TS_PACKET_SIZE)) < 0)
>                  return ret;
>          }
>      }

For the record, my code currently relies on AVPacket.pos pointing to
the actual start of BDAV packets from Blu-ray m2ts files so the
position lines up with the Blu-ray playlist metadata, which also has
positions for seamless clip changes etc.
I don't know how all the other cases work, but at least for BDAV the
current value is correct.

- Hendrik


More information about the ffmpeg-devel mailing list