[FFmpeg-devel] [PATCH v4 3/3] aadec: improve seeking in mp3 content

Michael Niedermayer michael at niedermayer.cc
Wed Jul 11 21:09:33 EEST 2018


On Sat, Jul 07, 2018 at 07:41:29PM +0200, Karsten Otto wrote:
> MP3 frames may not be aligned to aa chunk boundaries. When seeking,
> calculate the expected frame offset in the target chunk. Adjust the
> timestamp and truncate the next packet accordingly.
> 
> This solution works for the majority of tested audio material. For
> some rare encodings with mp3 padding or embedded id3 tags, it will
> mispredict the correct offset, and at worst skip an extra frame.
> ---
>  libavformat/aadec.c | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/libavformat/aadec.c b/libavformat/aadec.c
> index e3c03bc522..2b9e4e526c 100644
> --- a/libavformat/aadec.c
> +++ b/libavformat/aadec.c
> @@ -37,6 +37,7 @@
>  #define TEA_BLOCK_SIZE 8
>  #define CHAPTER_HEADER_SIZE 8
>  #define TIMEPREC 1000
> +#define MP3_FRAME_SIZE 104
>  
>  typedef struct AADemuxContext {
>      AVClass *class;
> @@ -50,6 +51,7 @@ typedef struct AADemuxContext {
>      int64_t current_chapter_size;
>      int64_t content_start;
>      int64_t content_end;
> +    int seek_offset;
>  } AADemuxContext;
>  
>  static int get_second_size(char *codec_name)
> @@ -230,6 +232,7 @@ static int aa_read_header(AVFormatContext *s)
>      ff_update_cur_dts(s, st, 0);
>      avio_seek(pb, start, SEEK_SET);
>      c->current_chapter_size = 0;
> +    c->seek_offset = 0;
>  
>      return 0;
>  }
> @@ -295,12 +298,13 @@ static int aa_read_packet(AVFormatContext *s, AVPacket *pkt)
>      if (c->current_chapter_size <= 0)
>          c->current_chapter_size = 0;
>  
> -    ret = av_new_packet(pkt, written);
> +    ret = av_new_packet(pkt, written - c->seek_offset);
>      if (ret < 0)
>          return ret;
> -    memcpy(pkt->data, buf, written);
> +    memcpy(pkt->data, buf + c->seek_offset, written - c->seek_offset);

what if written < c->seek_offset ? or is this impossible ?

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

While the State exists there can be no freedom; when there is freedom there
will be no State. -- Vladimir Lenin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20180711/213042d8/attachment.sig>


More information about the ffmpeg-devel mailing list