[FFmpeg-devel] [PATCH 3/5] mp3dec: parse initial silence padding information from lame tag
Nicolas George
nicolas.george at normalesup.org
Thu Jul 5 17:58:58 CEST 2012
Le septidi 17 messidor, an CCXX, Michael Niedermayer a écrit :
> And pass the information on to the lavf core.
>
> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> ---
> libavformat/mp3dec.c | 28 ++++++++++++++++++++++++++++
> 1 file changed, 28 insertions(+)
>
> diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c
> index 61405f7..bc62694 100644
> --- a/libavformat/mp3dec.c
> +++ b/libavformat/mp3dec.c
> @@ -31,6 +31,8 @@
>
> typedef struct {
> int64_t filesize;
> + int start_pad;
> + int end_pad;
They look to be used only locally (and, for end_pad, only in debug output).
Do you have a reason to put them in the context?
> } MP3Context;
>
> /* mp3 read */
> @@ -82,6 +84,7 @@ static int mp3_read_probe(AVProbeData *p)
> */
> static int mp3_parse_vbr_tags(AVFormatContext *s, AVStream *st, int64_t base)
> {
> + MP3Context *mp3 = s->priv_data;
> uint32_t v, spf;
> unsigned frames = 0; /* Total number of frames in file */
> unsigned size = 0; /* Total number of bytes in the stream */
> @@ -107,6 +110,20 @@ static int mp3_parse_vbr_tags(AVFormatContext *s, AVStream *st, int64_t base)
> frames = avio_rb32(s->pb);
> if(v & 0x2)
> size = avio_rb32(s->pb);
> + if(v & 4)
> + avio_skip(s->pb, 100);
> + if(v & 8)
> + avio_skip(s->pb, 4);
> +
> + v = avio_rb32(s->pb);
> + if(v == MKBETAG('L', 'A', 'M', 'E')) {
> + avio_skip(s->pb, 21-4);
> + v= avio_rb24(s->pb);
> + mp3->start_pad = v>>12;
> + mp3-> end_pad = v&4095;
> + st->skip_samples = mp3->start_pad + 528 + 1;
> + av_log(s, AV_LOG_DEBUG, "pad %d %d\n", mp3->start_pad, mp3-> end_pad);
> + }
> }
>
> /* Check for VBRI tag (always 32 bytes after end of mpegaudio header) */
> @@ -206,6 +223,16 @@ static int mp3_read_packet(AVFormatContext *s, AVPacket *pkt)
> return ret;
> }
>
> +static int read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
> +{
> + MP3Context *mp3 = s->priv_data;
> + AVStream *st = s->streams[stream_index];
> +
> + st->skip_samples = (mp3->start_pad + 528 + 1) * (timestamp <= 0);
st->skip_samples = timestamp <= 0 ? mp3->start_pad + 528 + 1 : 0
would look more readable to my eyes.
> +
> + return -1;
> +}
> +
> AVInputFormat ff_mp3_demuxer = {
> .name = "mp3",
> .long_name = NULL_IF_CONFIG_SMALL("MPEG audio layer 2/3"),
> @@ -213,6 +240,7 @@ AVInputFormat ff_mp3_demuxer = {
> .read_probe = mp3_read_probe,
> .read_header = mp3_read_header,
> .read_packet = mp3_read_packet,
> + .read_seek = read_seek,
> .flags = AVFMT_GENERIC_INDEX,
> .extensions = "mp2,mp3,m2a", /* XXX: use probe */
> };
I am no MP3 expert, though.
Regards,
--
Nicolas George
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20120705/1957d225/attachment.asc>
More information about the ffmpeg-devel
mailing list