From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 442244283F for ; Wed, 4 May 2022 23:47:20 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 57D9768B277; Thu, 5 May 2022 02:47:17 +0300 (EEST) Received: from avasout-ptp-002.plus.net (avasout-ptp-002.plus.net [84.93.230.235]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5577868002D for ; Thu, 5 May 2022 02:47:09 +0300 (EEST) Received: from davids-macbook-pro-4.local ([80.229.167.224]) by smtp with SMTP id mOhxnDrZPO2rimOhynWgC6; Thu, 05 May 2022 00:47:09 +0100 X-Clacks-Overhead: "GNU Terry Pratchett" X-CM-Score: 0.00 X-CNFS-Analysis: v=2.4 cv=Zs/+lv3G c=1 sm=1 tr=0 ts=6273107d a=kGmXhoCkr3jB6KbzR35ddQ==:117 a=kGmXhoCkr3jB6KbzR35ddQ==:17 a=emhf11hzAAAA:8 a=2cw5aPlIdaEzE1zavXEA:9 a=CjuIK1q_8ugA:10 a=oXpFOLvHeOhgG0KdW9kA:9 a=HLUCug_QN4oeKp6PugZw:22 Date: Thu, 5 May 2022 00:47:01 +0100 From: David Fletcher To: "FFmpeg development discussions and patches" Message-ID: <20220505004701.75011573@davids-macbook-pro-4.local> Organization: Megapico X-Mailer: Claws Mail 3.17.5 (GTK+ 2.24.32; x86_64-apple-darwin17.7.0) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="MP_/h.1rr_cGhUfAlB7n5V_tQQg" X-CMAE-Envelope: MS4xfBBNjRs6G9TsGFxlq50tcz0oO5O5VJWpw3pY/Z07/hyZ62PR5arJ1EeIYxe8PLvjWXpzMls7GIhF2slbcN+Lb+tq6V3f5MzoKjeu0TGGdhCCbNAEL4fo 34Aa5fd4oArbblVNfz0Xf5UXY6wPHWIDSrcC34uS5Gy2S/yxL/XDyHjoWh9z2GcIIOAFXjnWEw/nhPVpXDUWNIrjP5KOz7IhoZM= Subject: Re: [FFmpeg-devel] PATCH - libmad MP3 decoding support X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: --MP_/h.1rr_cGhUfAlB7n5V_tQQg Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Content-Disposition: inline > Andreas Rheinhardt wrote: > > David Fletcher: > > Following today's posts about help with submitting patches I realised I > > sent the libmad patch yesterday in the wrong format. Apologies, I was > > not familiar with the git format patches. > > > > Hopefully the attached version is now in the correct format against the > > current master branch. > > > > The bug report about why this exists is at the following link, including > > a link to sample distorted audio from decoding an mp3 stream on ARMv4 > > hardware: https://trac.ffmpeg.org/ticket/9764 > > > > Best regards, David. > > > > > > > diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c > > index c47133aa18..e3df6178c8 100644 > > --- a/libavcodec/allcodecs.c > > +++ b/libavcodec/allcodecs.c > > @@ -744,6 +744,7 @@ extern const FFCodec ff_libcodec2_decoder; > > extern const FFCodec ff_libdav1d_decoder; > > extern const FFCodec ff_libdavs2_decoder; > > extern const FFCodec ff_libfdk_aac_encoder; > > +extern const AVCodec ff_libmad_decoder; > > extern const FFCodec ff_libfdk_aac_decoder; > > extern const FFCodec ff_libgsm_encoder; > > extern const FFCodec ff_libgsm_decoder; > > This should look weird to you. Now you've pointed it out - yes, it does! This error was matched by a similar use of AVCodec in place of FFCodec in the libmaddec.c file. It seems these structures have enough in common that I'd got away with it running without noticing this. > > > > > diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h > > index 8b317fa121..be70f4a71c 100644 > > --- a/libavcodec/codec_id.h > > +++ b/libavcodec/codec_id.h > > @@ -519,6 +519,7 @@ enum AVCodecID { > > AV_CODEC_ID_FASTAUDIO, > > AV_CODEC_ID_MSNSIREN, > > AV_CODEC_ID_DFPWM, > > + AV_CODEC_ID_LIBMAD, > > > > /* subtitle codecs */ > > AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID > > pointing at the start of subtitle codecs. > > This makes no sense: Your decoder is still expected to decode MP3 and > not a new, previously unsupported format. This was left over from some development experiments while I was working out how to integrate libmad. It was not used and needed to be removed. The ff_libmad_decoder structure in libmaddec.c already used AV_CODEC_ID_MP3 and never mentioned AV_CODEC_ID_LIBMAD. > > > diff --git a/libavcodec/libmaddec.c b/libavcodec/libmaddec.c > > new file mode 100644 > > index 0000000000..7082c53f4d > > --- /dev/null > > +++ b/libavcodec/libmaddec.c > > @@ -0,0 +1,181 @@ > > +/* > > + * MP3 decoder using libmad > > + * Copyright (c) 2022 David Fletcher > > + * > > + * This file is part of FFmpeg. > > + * > > + * FFmpeg is free software; you can redistribute it and/or > > + * modify it under the terms of the GNU Lesser General Public > > + * License as published by the Free Software Foundation; either > > + * version 2.1 of the License, or (at your option) any later version. > > + * > > + * FFmpeg is distributed in the hope that it will be useful, > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > > + * Lesser General Public License for more details. > > + * > > + * You should have received a copy of the GNU Lesser General Public > > + * License along with FFmpeg; if not, write to the Free Software > > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA > > 02110-1301 USA > > + */ > > + > > +#include > > + > > +#include "libavutil/channel_layout.h" > > +#include "libavutil/common.h" > > +#include "avcodec.h" > > +#include "internal.h" > > +#include "decode.h" > > + > > +#define MAD_BUFSIZE (32 * 1024) > > +#define MIN(a, b) ((a) < (b) ? (a) : (b)) > > + > > +typedef struct libmad_context { > > + uint8_t input_buffer[MAD_BUFSIZE+MAD_BUFFER_GUARD]; > > + struct mad_synth synth; > > + struct mad_stream stream; > > + struct mad_frame frame; > > + struct mad_header header; > > + int got_header; > > +}libmad_context; > > + > > +/* utility to scale and round samples to 16 bits */ > > +static inline signed int mad_scale(mad_fixed_t sample) > > +{ > > + /* round */ > > + sample += (1L << (MAD_F_FRACBITS - 16)); > > + > > + /* clip */ > > + if (sample >= MAD_F_ONE) > > + sample = MAD_F_ONE - 1; > > + else if (sample < -MAD_F_ONE) > > + sample = -MAD_F_ONE; > > + > > + /* quantize */ > > + return sample >> (MAD_F_FRACBITS + 1 - 16); > > +} > > + > > +static av_cold int libmad_decode_init(AVCodecContext *avc) > > +{ > > + libmad_context *mad = avc->priv_data; > > + > > + mad_synth_init (&mad->synth); > > + mad_stream_init (&mad->stream); > > + mad_frame_init (&mad->frame); > > + mad->got_header = 0; > > + > > + return 0; > > +} > > + > > +static av_cold int libmad_decode_close(AVCodecContext *avc) > > +{ > > + libmad_context *mad = avc->priv_data; > > + > > + mad_synth_finish(&mad->synth); > > + mad_frame_finish(&mad->frame); > > + mad_stream_finish(&mad->stream); > > + > > + mad = NULL; > > This is pointless as the lifetime of this pointer ends with returning > from this function anyway. Thanks for pointing this out - removed now. > > > + > > + return 0; > > +} > > + > > +static int libmad_decode_frame(AVCodecContext *avc, void *data, > > + int *got_frame_ptr, AVPacket *pkt) > > +{ > > + AVFrame *frame = data; > > + libmad_context *mad = avc->priv_data; > > + struct mad_pcm *pcm; > > + mad_fixed_t const *left_ch; > > + mad_fixed_t const *right_ch; > > + int16_t *output; > > + int nsamples; > > + int nchannels; > > + size_t bytes_read = 0; > > + size_t remaining = 0; > > + > > + if (!avc) > > + return 0; > > A codec can presume the AVCodecContext to not be NULL. > > > + > > + if (!mad) > > + return 0; > > + > > Similarly, every codec can presume the Codec's private data to be > allocated (and be retained between calls to the same AVCodecContext > instance). > (Furthermore, the initialization of mad presumes avc to be not NULL, > which makes the above check pointless.) I'd played it safe by including checks on things - but since you've confirmed that AVCodecContext will not be NULL and private data will always be allocated these can be removed. > > > + remaining = mad->stream.bufend - mad->stream.next_frame; > > + memmove(mad->input_buffer, mad->stream.next_frame, remaining); > > + bytes_read = MIN(pkt->size, MAD_BUFSIZE - remaining); > > + memcpy(mad->input_buffer+remaining, pkt->data, bytes_read); > > + > > + if (bytes_read == 0){ > > + *got_frame_ptr = 0; > > + return 0; > > + } > > + > > + mad_stream_buffer(&mad->stream, mad->input_buffer, remaining + > > bytes_read); > > + mad->stream.error = 0; > > + > > + if(!mad->got_header){ > > + mad_header_decode(&mad->header, &mad->stream); > > + mad->got_header = 1; > > + avc->frame_size = 32 * (mad->header.layer == MAD_LAYER_I ? 12 : > > \ > > + ((mad->header.layer == MAD_LAYER_III && > > \ > > + (mad->header.flags & > > MAD_FLAG_LSF_EXT)) ? 18 : 36)); > > + avc->sample_fmt = AV_SAMPLE_FMT_S16; > > + if(mad->header.mode == MAD_MODE_SINGLE_CHANNEL){ > > + avc->channel_layout = AV_CH_LAYOUT_MONO; > > + avc->channels = 1; > > + }else{ > > + avc->channel_layout = AV_CH_LAYOUT_STEREO; > > + avc->channels = 2; > > + } > > + } > > + > > + frame->channel_layout = avc->channel_layout; > > + frame->format = avc->sample_fmt; > > + frame->channels = avc->channels; > > + frame->nb_samples = avc->frame_size; > > + > > + if ((ff_get_buffer(avc, frame, 0)) < 0) > > + return 0; > > Return the error. Modified to return the error now > > > + > > + if (mad_frame_decode(&mad->frame, &mad->stream) == -1) { > > + *got_frame_ptr = 0; > > + return mad->stream.bufend - mad->stream.next_frame; > > + } > > + > > + mad_synth_frame (&mad->synth, &mad->frame); > > + > > + pcm = &mad->synth.pcm; > > + output = (int16_t *)frame->data[0]; > > + nsamples = pcm->length; > > + nchannels = pcm->channels; > > + left_ch = pcm->samples[0]; > > + right_ch = pcm->samples[1]; > > + while (nsamples--) { > > + *output++ = mad_scale(*(left_ch++)); > > + if (nchannels == 2) { > > + *output++ = mad_scale(*(right_ch++)); > > + } > > + //Players should recognise mono and play through both channels > > + //Writing the same thing to both left and right channels here > > causes > > + //memory issues as it creates double the number of samples > > allocated. > > + } > > + > > + *got_frame_ptr = 1; > > + > > + return mad->stream.bufend - mad->stream.next_frame; > > +} > > + > > +AVCodec ff_libmad_decoder = { > > + .name = "libmad", > > + .long_name = NULL_IF_CONFIG_SMALL("libmad MP3 decoder"), > > + .wrapper_name = "libmad", > > + .type = AVMEDIA_TYPE_AUDIO, > > + .id = AV_CODEC_ID_MP3, > > + .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16, > > AV_SAMPLE_FMT_NONE }, > > + .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, > > + .priv_data_size = sizeof(libmad_context), > > + .init = libmad_decode_init, > > + .close = libmad_decode_close, > > + .decode = libmad_decode_frame > > +}; > > This should not even compile with latest master. > > - Andreas Hi Andreas, Many thanks for your review and help to improve this. I've inserted comments/replies above, and an updated version of the patch file is attached. It compiles and runs, and I've just converted a range of mp3 files with it. I've realised I was suppressing some warnings when I compiled previously, including about deprecated code in use of avc->channel_layout and avc->channels. I've made updates to use the avc->ch_layout and avc->ch_layout.nb_channels in the updated patch. Could you take another look? Best regards, David. --MP_/h.1rr_cGhUfAlB7n5V_tQQg Content-Type: application/octet-stream; name=libmad_v2-git-master.patch Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=libmad_v2-git-master.patch RnJvbSAyMTEyYzgyYzI2MGRiZTczMWRmNDYxOWNkMTdjNjdlMmZmMjgwY2Y4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBGbGV0Y2hlciA8ZGF2aWRAbWVnYXBpY28uY28udWs+ CkRhdGU6IFRodSwgNSBNYXkgMjAyMiAwMDowNzowNyArMDEwMApTdWJqZWN0OiBbUEFUQ0hdIFBh dGNoZWQgdG8gd29yayB3aXRoIGxpYm1hZCBNUDMgZGVjb2RpbmcgY29kZWMgKHVwZGF0ZSAyKQoK U2lnbmVkLW9mZi1ieTogRGF2aWQgRmxldGNoZXIgPGRhdmlkQG1lZ2FwaWNvLmNvLnVrPgotLS0K IGNvbmZpZ3VyZSAgICAgICAgICAgICAgfCAgIDQgKwogbGliYXZjb2RlYy9NYWtlZmlsZSAgICB8 ICAgMSArCiBsaWJhdmNvZGVjL2FsbGNvZGVjcy5jIHwgICAxICsKIGxpYmF2Y29kZWMvbGlibWFk ZGVjLmMgfCAxNzQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDQg ZmlsZXMgY2hhbmdlZCwgMTgwIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWJh dmNvZGVjL2xpYm1hZGRlYy5jCgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmlu ZGV4IDE5Njg3M2M0YWEuLmQ1ZjViNzk2MTQgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9j b25maWd1cmUKQEAgLTI0NSw2ICsyNDUsNyBAQCBFeHRlcm5hbCBsaWJyYXJ5IHN1cHBvcnQ6CiAg IC0tZW5hYmxlLWxpYmtsdmFuYyAgICAgICBlbmFibGUgS2VybmVsIExhYnMgVkFOQyBwcm9jZXNz aW5nIFtub10KICAgLS1lbmFibGUtbGlia3ZhemFhciAgICAgIGVuYWJsZSBIRVZDIGVuY29kaW5n IHZpYSBsaWJrdmF6YWFyIFtub10KICAgLS1lbmFibGUtbGlibGVuc2Z1biAgICAgIGVuYWJsZSBs ZW5zZnVuIGxlbnMgY29ycmVjdGlvbiBbbm9dCisgIC0tZW5hYmxlLWxpYm1hZCAgICAgICAgICBl bmFibGUgTVAzIGRlY29kaW5nIHZpYSBsaWJtYWQgW25vXQogICAtLWVuYWJsZS1saWJtb2RwbHVn ICAgICAgZW5hYmxlIE1vZFBsdWcgdmlhIGxpYm1vZHBsdWcgW25vXQogICAtLWVuYWJsZS1saWJt cDNsYW1lICAgICAgZW5hYmxlIE1QMyBlbmNvZGluZyB2aWEgbGlibXAzbGFtZSBbbm9dCiAgIC0t ZW5hYmxlLWxpYm9wZW5jb3JlLWFtcm5iIGVuYWJsZSBBTVItTkIgZGUvZW5jb2RpbmcgdmlhIGxp Ym9wZW5jb3JlLWFtcm5iIFtub10KQEAgLTE3NzUsNiArMTc3Niw3IEBAIEVYVEVSTkFMX0xJQlJB UllfR1BMX0xJU1Q9IgogICAgIGZyZWkwcgogICAgIGxpYmNkaW8KICAgICBsaWJkYXZzMgorICAg IGxpYm1hZAogICAgIGxpYnJ1YmJlcmJhbmQKICAgICBsaWJ2aWRzdGFiCiAgICAgbGlieDI2NApA QCAtMzMzOSw2ICszMzQxLDcgQEAgbGlianhsX2RlY29kZXJfZGVwcz0ibGlianhsIGxpYmp4bF90 aHJlYWRzIgogbGlianhsX2VuY29kZXJfZGVwcz0ibGlianhsIGxpYmp4bF90aHJlYWRzIgogbGli a3ZhemFhcl9lbmNvZGVyX2RlcHM9ImxpYmt2YXphYXIiCiBsaWJtb2RwbHVnX2RlbXV4ZXJfZGVw cz0ibGlibW9kcGx1ZyIKK2xpYm1hZF9kZWNvZGVyX2RlcHM9ImxpYm1hZCIKIGxpYm1wM2xhbWVf ZW5jb2Rlcl9kZXBzPSJsaWJtcDNsYW1lIgogbGlibXAzbGFtZV9lbmNvZGVyX3NlbGVjdD0iYXVk aW9fZnJhbWVfcXVldWUgbXBlZ2F1ZGlvaGVhZGVyIgogbGlib3BlbmNvcmVfYW1ybmJfZGVjb2Rl cl9kZXBzPSJsaWJvcGVuY29yZV9hbXJuYiIKQEAgLTY1NzIsNiArNjU3NSw3IEBAIGlmIGVuYWJs ZWQgbGlibWZ4OyB0aGVuCiBmaQogCiBlbmFibGVkIGxpYm1vZHBsdWcgICAgICAgICYmIHJlcXVp cmVfcGtnX2NvbmZpZyBsaWJtb2RwbHVnIGxpYm1vZHBsdWcgbGlibW9kcGx1Zy9tb2RwbHVnLmgg TW9kUGx1Z19Mb2FkCitlbmFibGVkIGxpYm1hZCAgICAgICAgICAgICYmIHJlcXVpcmUgbGlibWFk ICJtYWQuaCIgbWFkX2RlY29kZXJfaW5pdCAtbG1hZAogZW5hYmxlZCBsaWJtcDNsYW1lICAgICAg ICAmJiByZXF1aXJlICJsaWJtcDNsYW1lID49IDMuOTguMyIgbGFtZS9sYW1lLmggbGFtZV9zZXRf VkJSX3F1YWxpdHkgLWxtcDNsYW1lICRsaWJtX2V4dHJhbGlicwogZW5hYmxlZCBsaWJteXNvZmEg ICAgICAgICAmJiB7IGNoZWNrX3BrZ19jb25maWcgbGlibXlzb2ZhIGxpYm15c29mYSBteXNvZmEu aCBteXNvZmFfbmVpZ2hib3Job29kX2luaXRfd2l0aHN0ZXBkZWZpbmUgfHwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICByZXF1aXJlIGxpYm15c29mYSBteXNvZmEuaCBteXNvZmFfbmVp Z2hib3Job29kX2luaXRfd2l0aHN0ZXBkZWZpbmUgLWxteXNvZmEgJHpsaWJfZXh0cmFsaWJzOyB9 CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL01ha2VmaWxlIGIvbGliYXZjb2RlYy9NYWtlZmlsZQpp bmRleCBjZmFhNmYxOTZhLi4xZTQzNDIyMmQ5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL01ha2Vm aWxlCisrKyBiL2xpYmF2Y29kZWMvTWFrZWZpbGUKQEAgLTEwNjUsNiArMTA2NSw3IEBAIE9CSlMt JChDT05GSUdfTElCSUxCQ19FTkNPREVSKSAgICAgICAgICAgICs9IGxpYmlsYmMubwogT0JKUy0k KENPTkZJR19MSUJKWExfREVDT0RFUikgICAgICAgICAgICAgKz0gbGlianhsZGVjLm8gbGlianhs Lm8KIE9CSlMtJChDT05GSUdfTElCSlhMX0VOQ09ERVIpICAgICAgICAgICAgICs9IGxpYmp4bGVu Yy5vIGxpYmp4bC5vCiBPQkpTLSQoQ09ORklHX0xJQktWQVpBQVJfRU5DT0RFUikgICAgICAgICAr PSBsaWJrdmF6YWFyLm8KK09CSlMtJChDT05GSUdfTElCTUFEX0RFQ09ERVIpICAgICAgICAgICAg ICs9IGxpYm1hZGRlYy5vCiBPQkpTLSQoQ09ORklHX0xJQk1QM0xBTUVfRU5DT0RFUikgICAgICAg ICArPSBsaWJtcDNsYW1lLm8KIE9CSlMtJChDT05GSUdfTElCT1BFTkNPUkVfQU1STkJfREVDT0RF UikgICs9IGxpYm9wZW5jb3JlLWFtci5vCiBPQkpTLSQoQ09ORklHX0xJQk9QRU5DT1JFX0FNUk5C X0VOQ09ERVIpICArPSBsaWJvcGVuY29yZS1hbXIubwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9h bGxjb2RlY3MuYyBiL2xpYmF2Y29kZWMvYWxsY29kZWNzLmMKaW5kZXggYzQ3MTMzYWExOC4uMGI4 NDMwZGI5MiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hbGxjb2RlY3MuYworKysgYi9saWJhdmNv ZGVjL2FsbGNvZGVjcy5jCkBAIC03NDQsNiArNzQ0LDcgQEAgZXh0ZXJuIGNvbnN0IEZGQ29kZWMg ZmZfbGliY29kZWMyX2RlY29kZXI7CiBleHRlcm4gY29uc3QgRkZDb2RlYyBmZl9saWJkYXYxZF9k ZWNvZGVyOwogZXh0ZXJuIGNvbnN0IEZGQ29kZWMgZmZfbGliZGF2czJfZGVjb2RlcjsKIGV4dGVy biBjb25zdCBGRkNvZGVjIGZmX2xpYmZka19hYWNfZW5jb2RlcjsKK2V4dGVybiBjb25zdCBGRkNv ZGVjIGZmX2xpYm1hZF9kZWNvZGVyOwogZXh0ZXJuIGNvbnN0IEZGQ29kZWMgZmZfbGliZmRrX2Fh Y19kZWNvZGVyOwogZXh0ZXJuIGNvbnN0IEZGQ29kZWMgZmZfbGliZ3NtX2VuY29kZXI7CiBleHRl cm4gY29uc3QgRkZDb2RlYyBmZl9saWJnc21fZGVjb2RlcjsKZGlmZiAtLWdpdCBhL2xpYmF2Y29k ZWMvbGlibWFkZGVjLmMgYi9saWJhdmNvZGVjL2xpYm1hZGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAuLjQ4MTJjNWUxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJh dmNvZGVjL2xpYm1hZGRlYy5jCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogTVAzIGRlY29kZXIg dXNpbmcgbGlibWFkCisgKiBDb3B5cmlnaHQgKGMpIDIwMjIgRGF2aWQgRmxldGNoZXIKKyAqCisg KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2 ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBM aWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3 YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y LCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPG1hZC5oPgorCisj aW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGls L2NvbW1vbi5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJjb2RlY19pbnRlcm5h bC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgTUFEX0JVRlNJWkUgKDMyICog MTAyNCkKKyNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisKK3R5cGVk ZWYgc3RydWN0IGxpYm1hZF9jb250ZXh0IHsKKyAgICB1aW50OF90IGlucHV0X2J1ZmZlcltNQURf QlVGU0laRStNQURfQlVGRkVSX0dVQVJEXTsKKyAgICBzdHJ1Y3QgbWFkX3N5bnRoICBzeW50aDsg CisgICAgc3RydWN0IG1hZF9zdHJlYW0gc3RyZWFtOworICAgIHN0cnVjdCBtYWRfZnJhbWUgIGZy YW1lOworICAgIHN0cnVjdCBtYWRfaGVhZGVyIGhlYWRlcjsKKyAgICBpbnQgZ290X2hlYWRlcjsK K31saWJtYWRfY29udGV4dDsJCQorCisvKiB1dGlsaXR5IHRvIHNjYWxlIGFuZCByb3VuZCBzYW1w bGVzIHRvIDE2IGJpdHMgKi8KK3N0YXRpYyBpbmxpbmUgc2lnbmVkIGludCBtYWRfc2NhbGUobWFk X2ZpeGVkX3Qgc2FtcGxlKQoreworICAgICAvKiByb3VuZCAqLworICAgICBzYW1wbGUgKz0gKDFM IDw8IChNQURfRl9GUkFDQklUUyAtIDE2KSk7CisgCisgICAgIC8qIGNsaXAgKi8KKyAgICAgaWYg KHNhbXBsZSA+PSBNQURfRl9PTkUpCisgICAgICAgICBzYW1wbGUgPSBNQURfRl9PTkUgLSAxOwor ICAgICBlbHNlIGlmIChzYW1wbGUgPCAtTUFEX0ZfT05FKQorICAgICAgICAgc2FtcGxlID0gLU1B RF9GX09ORTsKKyAgICAKKyAgICAgLyogcXVhbnRpemUgKi8KKyAgICAgcmV0dXJuIHNhbXBsZSA+ PiAoTUFEX0ZfRlJBQ0JJVFMgKyAxIC0gMTYpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbGli bWFkX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmMpCit7CisgICAgIGxpYm1hZF9jb250 ZXh0ICptYWQgPSBhdmMtPnByaXZfZGF0YTsKKworICAgICBtYWRfc3ludGhfaW5pdCAgKCZtYWQt PnN5bnRoKTsKKyAgICAgbWFkX3N0cmVhbV9pbml0ICgmbWFkLT5zdHJlYW0pOworICAgICBtYWRf ZnJhbWVfaW5pdCAgKCZtYWQtPmZyYW1lKTsKKyAgICAgbWFkLT5nb3RfaGVhZGVyID0gMDsKKwor ICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGxpYm1hZF9kZWNvZGVfY2xv c2UoQVZDb2RlY0NvbnRleHQgKmF2YykKK3sKKyAgICAgbGlibWFkX2NvbnRleHQgKm1hZCA9IGF2 Yy0+cHJpdl9kYXRhOworCisgICAgIG1hZF9zeW50aF9maW5pc2goJm1hZC0+c3ludGgpOworICAg ICBtYWRfZnJhbWVfZmluaXNoKCZtYWQtPmZyYW1lKTsKKyAgICAgbWFkX3N0cmVhbV9maW5pc2go Jm1hZC0+c3RyZWFtKTsKKyAgICAKKyAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGli bWFkX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjLCBBVkZyYW1lICpmcmFtZSwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqcGt0 KQoreworICAgICBsaWJtYWRfY29udGV4dCAqbWFkID0gYXZjLT5wcml2X2RhdGE7CisgICAgIHN0 cnVjdCBtYWRfcGNtICpwY207CisgICAgIG1hZF9maXhlZF90IGNvbnN0ICpsZWZ0X2NoOworICAg ICBtYWRfZml4ZWRfdCBjb25zdCAqcmlnaHRfY2g7CisgICAgIGludDE2X3QgKm91dHB1dDsKKyAg ICAgaW50IG5zYW1wbGVzOworICAgICBpbnQgbmNoYW5uZWxzOworICAgICBpbnQgcmV0OworICAg ICBzaXplX3QgYnl0ZXNfcmVhZCA9IDA7CisgICAgIHNpemVfdCByZW1haW5pbmcgPSAwOworCisg ICAgIHJlbWFpbmluZyA9IG1hZC0+c3RyZWFtLmJ1ZmVuZCAtIG1hZC0+c3RyZWFtLm5leHRfZnJh bWU7CisgICAgIG1lbW1vdmUobWFkLT5pbnB1dF9idWZmZXIsIG1hZC0+c3RyZWFtLm5leHRfZnJh bWUsIHJlbWFpbmluZyk7CisgICAgIGJ5dGVzX3JlYWQgPSBNSU4ocGt0LT5zaXplLCBNQURfQlVG U0laRSAtIHJlbWFpbmluZyk7CisgICAgIG1lbWNweShtYWQtPmlucHV0X2J1ZmZlcityZW1haW5p bmcsIHBrdC0+ZGF0YSwgYnl0ZXNfcmVhZCk7CisgICAgIAorICAgICBpZiAoYnl0ZXNfcmVhZCA9 PSAwKXsKKwkgKmdvdF9mcmFtZV9wdHIgPSAwOworCSByZXR1cm4gMDsKKyAgICAgfQorICAgICAK KyAgICAgbWFkX3N0cmVhbV9idWZmZXIoJm1hZC0+c3RyZWFtLCBtYWQtPmlucHV0X2J1ZmZlciwg cmVtYWluaW5nICsgYnl0ZXNfcmVhZCk7CisgICAgIG1hZC0+c3RyZWFtLmVycm9yID0gMDsKKyAg ICAgCisgICAgIGlmKCFtYWQtPmdvdF9oZWFkZXIpeworCSBtYWRfaGVhZGVyX2RlY29kZSgmbWFk LT5oZWFkZXIsICZtYWQtPnN0cmVhbSk7CisJIG1hZC0+Z290X2hlYWRlciA9IDE7CisJIGF2Yy0+ ZnJhbWVfc2l6ZSA9IDMyICogKG1hZC0+aGVhZGVyLmxheWVyID09IE1BRF9MQVlFUl9JID8gMTIg OiBcCisJCQkJICgobWFkLT5oZWFkZXIubGF5ZXIgPT0gTUFEX0xBWUVSX0lJSSAmJiBcCisJCQkJ ICAgKG1hZC0+aGVhZGVyLmZsYWdzICYgTUFEX0ZMQUdfTFNGX0VYVCkpID8gMTggOiAzNikpOwor CSBhdmMtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKyAgICAgICAgIGF2X2NoYW5u ZWxfbGF5b3V0X3VuaW5pdCgmYXZjLT5jaF9sYXlvdXQpOworCSBpZihtYWQtPmhlYWRlci5tb2Rl ID09IE1BRF9NT0RFX1NJTkdMRV9DSEFOTkVMKXsKKyAgICAgICAgICAgICBhdmMtPmNoX2xheW91 dCA9IChBVkNoYW5uZWxMYXlvdXQpQVZfQ0hBTk5FTF9MQVlPVVRfTU9OTzsKKyAgICAgICAgICAg ICBhdmMtPmNoX2xheW91dC5uYl9jaGFubmVscyA9IDE7CisJIH1lbHNleworCSAgICAgYXZjLT5j aF9sYXlvdXQgPSAoQVZDaGFubmVsTGF5b3V0KUFWX0NIQU5ORUxfTEFZT1VUX1NURVJFTzsKKyAg ICAgICAgICAgICBhdmMtPmNoX2xheW91dC5uYl9jaGFubmVscyA9IDI7CisJIH0KKyAgICAgfQor ICAgICAKKyAgICAgZnJhbWUtPmNoX2xheW91dCA9IGF2Yy0+Y2hfbGF5b3V0OworICAgICBmcmFt ZS0+Zm9ybWF0ID0gYXZjLT5zYW1wbGVfZm10OworICAgICBmcmFtZS0+Y2hfbGF5b3V0Lm5iX2No YW5uZWxzID0gYXZjLT5jaF9sYXlvdXQubmJfY2hhbm5lbHM7CisgICAgIGZyYW1lLT5uYl9zYW1w bGVzID0gYXZjLT5mcmFtZV9zaXplOyAKKyAgICAgCisgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1 ZmZlcihhdmMsIGZyYW1lLCAwKSkgPCAwKQorCSByZXR1cm4gcmV0OworICAgICAKKyAgICAgaWYg KG1hZF9mcmFtZV9kZWNvZGUoJm1hZC0+ZnJhbWUsICZtYWQtPnN0cmVhbSkgPT0gLTEpIHsKKwkg KmdvdF9mcmFtZV9wdHIgPSAwOworCSByZXR1cm4gbWFkLT5zdHJlYW0uYnVmZW5kIC0gbWFkLT5z dHJlYW0ubmV4dF9mcmFtZTsKKyAgICAgfQorICAgICAKKyAgICAgbWFkX3N5bnRoX2ZyYW1lICgm bWFkLT5zeW50aCwgJm1hZC0+ZnJhbWUpOworICAgICAKKyAgICAgcGNtID0gJm1hZC0+c3ludGgu cGNtOworICAgICBvdXRwdXQgPSAoaW50MTZfdCAqKWZyYW1lLT5kYXRhWzBdOworICAgICBuc2Ft cGxlcyA9IHBjbS0+bGVuZ3RoOworICAgICBuY2hhbm5lbHMgPSBwY20tPmNoYW5uZWxzOworICAg ICBsZWZ0X2NoID0gcGNtLT5zYW1wbGVzWzBdOworICAgICByaWdodF9jaCA9IHBjbS0+c2FtcGxl c1sxXTsKKyAgICAgd2hpbGUgKG5zYW1wbGVzLS0pIHsKKwkgKm91dHB1dCsrID0gbWFkX3NjYWxl KCoobGVmdF9jaCsrKSk7CisJIGlmIChuY2hhbm5lbHMgPT0gMikgeworCSAgICAgKm91dHB1dCsr ID0gbWFkX3NjYWxlKCoocmlnaHRfY2grKykpOworCSB9CisJIC8vUGxheWVycyBzaG91bGQgcmVj b2duaXNlIG1vbm8gYW5kIHBsYXkgdGhyb3VnaCBib3RoIGNoYW5uZWxzCisJIC8vV3JpdGluZyB0 aGUgc2FtZSB0aGluZyB0byBib3RoIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzIGhlcmUgY2F1c2Vz CisJIC8vbWVtb3J5IGlzc3VlcyBhcyBpdCBjcmVhdGVzIGRvdWJsZSB0aGUgbnVtYmVyIG9mIHNh bXBsZXMgYWxsb2NhdGVkLgorICAgICB9CisgICAgIAorICAgICAqZ290X2ZyYW1lX3B0ciA9IDE7 CisgICAgIAorICAgICByZXR1cm4gbWFkLT5zdHJlYW0uYnVmZW5kIC0gbWFkLT5zdHJlYW0ubmV4 dF9mcmFtZTsKK30KKworY29uc3QgRkZDb2RlYyBmZl9saWJtYWRfZGVjb2RlciA9IHsKKyAgICAu cC5uYW1lICAgICAgICAgICA9ICJsaWJtYWQiLAorICAgIC5wLmxvbmdfbmFtZSAgICAgID0gTlVM TF9JRl9DT05GSUdfU01BTEwoImxpYm1hZCBNUDMgZGVjb2RlciIpLAorICAgIC5wLndyYXBwZXJf bmFtZSAgID0gImxpYm1hZCIsCisgICAgLnAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVf QVVESU8sCisgICAgLnAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDMsCisgICAgLnAu c2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBM RV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAucC5jYXBhYmlsaXRpZXMgICA9 IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfQ0hBTk5FTF9DT05GLAorICAgIC5wcml2 X2RhdGFfc2l6ZSA9IHNpemVvZihsaWJtYWRfY29udGV4dCksCisgICAgLmluaXQgICAgICAgICAg ID0gbGlibWFkX2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGxpYm1hZF9kZWNv ZGVfY2xvc2UsCisgICAgRkZfQ09ERUNfREVDT0RFX0NCKGxpYm1hZF9kZWNvZGVfZnJhbWUpCit9 OworCi0tIAoyLjE3LjYKCg== --MP_/h.1rr_cGhUfAlB7n5V_tQQg Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". --MP_/h.1rr_cGhUfAlB7n5V_tQQg--