OK sthen@.

On 2019/06/27 15:10, Jeremie Courreges-Anglas wrote:
> 
> I couldn't get mpv to read the .m4a files produced by my Android phone.
> 
> --8<--
> ritchie ~$ file zic/phone/France-Sunn-O\)\)\)-Stereolux.m4a
> zic/phone/France-Sunn-O)))-Stereolux.m4a: MPEG ADTS, AAC, v2 LC, 48 kHz, 
> stereo
> # Before:
> ritchie ~/zic/phone$ mpv 'France-Sunn-O)))-Stereolux.m4a'
> Playing: France-Sunn-O)))-Stereolux.m4a
> [ffmpeg/demuxer] aac: Could not find codec parameters for stream 0 (Audio: 
> aac, 0 channels, fltp): unspecified sample rate
> [ffmpeg/demuxer] Consider increasing the value for the 'analyzeduration' and 
> 'probesize' options
>  (+) Audio --aid=1 (aac)
> [lavf] error reading packet.
> [lavf] error reading packet.
> ritchie ~/zic/phone$
> --8<--
> 
> sthen and I found those reports upstream:
> 
>   https://trac.ffmpeg.org/ticket/7869
>   https://trac.ffmpeg.org/ticket/7271
> 
> Applying 
> https://git.videolan.org/?p=ffmpeg.git;a=commitdiff_plain;h=d88193c2196cf5342424aaa7a44b046c71c2527a
> lets mpv play these files again.
> 
> -->8--
> # After:
> ritchie ~$ mpv zic/phone/France-Sunn-O\)\)\)-Stereolux.m4a
> Playing: zic/phone/France-Sunn-O)))-Stereolux.m4a
> [ffmpeg/audio] aac: Input buffer exhausted before END element found
> [ffmpeg/demuxer] aac: Estimating duration from bitrate, this may be inaccurate
>  (+) Audio --aid=1 (aac 2ch 48000Hz)
> [ffmpeg/audio] aac: Input buffer exhausted before END element found
> Error decoding audio.
> AO: [sdl] 48000Hz stereo 2ch s32
> A: 00:00:14 / 03:06:47 (0%)
> -->8--
> 
> 
> ok?
> 
> 
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/graphics/ffmpeg/Makefile,v
> retrieving revision 1.187
> diff -u -p -r1.187 Makefile
> --- Makefile  13 Jun 2019 21:03:55 -0000      1.187
> +++ Makefile  27 Jun 2019 11:24:22 -0000
> @@ -4,7 +4,7 @@ COMMENT=      audio/video converter and strea
>  
>  V=           4.1.3
>  DISTNAME=    ffmpeg-${V}
> -REVISION=    4
> +REVISION=    5
>  EPOCH=               0
>  CATEGORIES=  graphics multimedia
>  MASTER_SITES=        https://ffmpeg.org/releases/
> Index: patches/patch-libavformat_aacdec_c
> ===================================================================
> RCS file: patches/patch-libavformat_aacdec_c
> diff -N patches/patch-libavformat_aacdec_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-libavformat_aacdec_c        27 Jun 2019 11:24:22 -0000
> @@ -0,0 +1,76 @@
> +$OpenBSD$
> +
> +From: James Almer <jamr...@gmail.com>
> +Date: Thu, 25 Apr 2019 22:04:01 +0000 (-0300)
> +Subject: avformat/aacdec: fix demuxing of small frames
> +X-Git-Url: 
> http://git.videolan.org/?p=ffmpeg.git;a=commitdiff_plain;h=d88193c2196cf5342424aaa7a44b046c71c2527a
> +
> +avformat/aacdec: fix demuxing of small frames
> +
> +10 bytes (id3v2 header amount of bytes) were being read before any checks
> +were made on the bitstream. The result was that we were overreading into
> +the next frame if the current one was 8 or 9 bytes long.
> +
> +Fixes tickets #7271 and #7869.
> +
> +Signed-off-by: James Almer <jamr...@gmail.com>
> +
> +
> +Index: libavformat/aacdec.c
> +--- libavformat/aacdec.c.orig
> ++++ libavformat/aacdec.c
> +@@ -20,6 +20,7 @@
> +  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 
> USA
> +  */
> + 
> ++#include "libavutil/avassert.h"
> + #include "libavutil/intreadwrite.h"
> + #include "avformat.h"
> + #include "avio_internal.h"
> +@@ -154,17 +155,8 @@ static int adts_aac_read_packet(AVFormatContext *s, AV
> + {
> +     int ret, fsize;
> + 
> +-    // Parse all the ID3 headers between frames
> +-    while (1) {
> +-        ret = av_get_packet(s->pb, pkt, FFMAX(ID3v2_HEADER_SIZE, 
> ADTS_HEADER_SIZE));
> +-        if (ret >= ID3v2_HEADER_SIZE && ff_id3v2_match(pkt->data, 
> ID3v2_DEFAULT_MAGIC)) {
> +-            if ((ret = handle_id3(s, pkt)) >= 0) {
> +-                continue;
> +-            }
> +-        }
> +-        break;
> +-    }
> +-
> ++retry:
> ++    ret = av_get_packet(s->pb, pkt, ADTS_HEADER_SIZE);
> +     if (ret < 0)
> +         return ret;
> + 
> +@@ -174,8 +166,24 @@ static int adts_aac_read_packet(AVFormatContext *s, AV
> +     }
> + 
> +     if ((AV_RB16(pkt->data) >> 4) != 0xfff) {
> +-        av_packet_unref(pkt);
> +-        return AVERROR_INVALIDDATA;
> ++        // Parse all the ID3 headers between frames
> ++        int append = ID3v2_HEADER_SIZE - ADTS_HEADER_SIZE;
> ++
> ++        av_assert2(append > 0);
> ++        ret = av_append_packet(s->pb, pkt, append);
> ++        if (ret != append) {
> ++            av_packet_unref(pkt);
> ++            return AVERROR(EIO);
> ++        }
> ++        if (!ff_id3v2_match(pkt->data, ID3v2_DEFAULT_MAGIC)) {
> ++            av_packet_unref(pkt);
> ++            return AVERROR_INVALIDDATA;
> ++        }
> ++        ret = handle_id3(s, pkt);
> ++        if (ret < 0)
> ++            return ret;
> ++
> ++        goto retry;
> +     }
> + 
> +     fsize = (AV_RB32(pkt->data + 3) >> 13) & 0x1FFF;
> 
> 
> -- 
> jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to