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 AED7649D0D for ; Fri, 8 Mar 2024 13:51:19 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 814B068CF3F; Fri, 8 Mar 2024 15:51:17 +0200 (EET) Received: from mail-4319.protonmail.ch (mail-4319.protonmail.ch [185.70.43.19]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6B77668CE33 for ; Fri, 8 Mar 2024 15:51:10 +0200 (EET) Date: Fri, 08 Mar 2024 13:50:59 +0000 To: FFmpeg development discussions and patches Message-ID: In-Reply-To: References: Feedback-ID: 33509725:user:proton MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_Va3VneRdI1hpgPbvt1REXvlqicglRJ66SE8mZWvi60k" Subject: Re: [FFmpeg-devel] [PATCH] avformat/aea: Add aea muxer 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: , From: asivery via ffmpeg-devel Reply-To: FFmpeg development discussions and patches Cc: asivery Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: This is a multi-part message in MIME format. --b1_Va3VneRdI1hpgPbvt1REXvlqicglRJ66SE8mZWvi60k Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Thank you for your incredibly thorough and fast response. I've applied all = the corrections you requested. Please let me know if there's anything else = wrong with my patch, and thank you for your time. - asivery On Friday, March 8th, 2024 at 1:06 PM, Andreas Rheinhardt wrote: > asivery via ffmpeg-devel: >=20 > > +typedef struct { > > + int block_count; > > +} AeaMuxerContext; > > + > > +static int aea_init(AVFormatContext *s) > > +{ > > + AeaMuxerContext *c =3D s->priv_data; > > + c->block_count =3D 0; >=20 >=20 > Unnecessary: A muxer's priv_data is always pre-zeroed. >=20 > > + > > + return 0; > > +} > > + > > +static int aea_write_header(AVFormatContext *s) > > +{ > > + AVDictionaryEntry *title_entry; >=20 >=20 > const >=20 > > + int title_length =3D 0, i; > > + char* title_contents; > > + AVStream *st; > > + > > + > > + if (s->nb_streams > 1) { > > + av_log(s, AV_LOG_WARNING, "Got more than one stream to encode, they w= ill be ignored.\n"); >=20 >=20 > We don't ignore extraneous streams, we normally error out if something > like this happens. >=20 > > + } > > + > > + st =3D s->streams[0]; > > + if (st->codecpar->ch_layout.nb_channels !=3D 1 && st->codecpar->ch_la= yout.nb_channels !=3D 2) { > > + av_log(s, AV_LOG_ERROR, "Invalid amount of channels to mux (%d).\n", = st->codecpar->ch_layout.nb_channels); > > + return AVERROR(EINVAL); > > + } > > + > > + if (st->codecpar->sample_rate !=3D 44100) { > > + av_log(s, AV_LOG_ERROR, "Invalid sample rate (%d) AEA only supports 4= 4.1kHz.\n", st->codecpar->sample_rate); > > + return AVERROR(EINVAL); > > + } > > + > > + /* Write magic / > > + avio_wl32(s->pb, 2048); > > + > > + / Write AEA title */ > > + title_entry =3D av_dict_get(st->metadata, "title", NULL, 0); > > + if (title_entry) { > > + title_contents =3D title_entry->value; > > + title_length =3D FFMIN(256, strlen(title_contents)); >=20 >=20 > Don't use strlen() in FFMIN (like many macros, it can evaluate its > argument multiple times). >=20 > > + } > > + > > + if (title_length) { > > + avio_write(s->pb, title_contents, title_length); > > + } >=20 >=20 > No need for this branch, just call this inside the "if (title_entry)" > block above. >=20 > > + > > + for (i =3D 0; i<(256 - title_length); i++) { > > + avio_w8(s->pb, 0); > > + } >=20 >=20 > ffio_fill(). Same below. >=20 > > + > > + /* Write number of frames (zero at header-writing time, will seek lat= er), number of channels / > > + avio_wl32(s->pb, 0); > > + avio_w8(s->pb, st->codecpar->ch_layout.nb_channels); > > + avio_w8(s->pb, 0); > > + > > + / Write flags (meaning unknown) / > > + for(i =3D 0; i<11; i++) { > > + avio_wl32(s->pb, 0); > > + } > > + > > + / Pad the header to 2048 bytes */ > > + for(i =3D 0; i<1738; i++) avio_w8(s->pb, 0); > > + > > + return 0; > > +} > > + > > +static int aea_write_packet(struct AVFormatContext *s, AVPacket *pkt) > > +{ > > + AeaMuxerContext *c =3D s->priv_data; > > + c->block_count++; > > + > > + avio_write(s->pb, pkt->data, pkt->size); > > + return 0; >=20 >=20 > You can avoid this and the whole muxer context by using > ff_raw_write_packet() and relying on AVStream.nb_frames. >=20 > > +} > > + > > +static int aea_write_trailer(struct AVFormatContext *s) > > +{ > > + AVIOContext *pb =3D s->pb; > > + AeaMuxerContext c =3D s->priv_data; > > + if (pb->seekable & AVIO_SEEKABLE_NORMAL) { > > + / Seek to rewrite the block count. */ > > + avio_seek(pb, 260, SEEK_SET); > > + avio_wl32(pb, c->block_count * s->streams[0]->codecpar->ch_layout.nb_= channels); > > + } else { > > + av_log(s, AV_LOG_WARNING, "unable to rewrite AEA header.\n"); > > + } > > + > > + return 0; > > +} > > + > > +const FFOutputFormat ff_aea_muxer =3D { > > + .p.name =3D "aea", > > + .p.long_name =3D NULL_IF_CONFIG_SMALL("MD STUDIO audio"), > > + .priv_data_size =3D sizeof(AeaMuxerContext), > > + .p.extensions =3D "aea", > > + .p.audio_codec =3D AV_CODEC_ID_ATRAC1, > > + .init =3D aea_init, > > + > > + .write_header =3D aea_write_header, > > + .write_packet =3D aea_write_packet, > > + .write_trailer =3D aea_write_trailer, > > + .p.flags =3D AVFMT_GENERIC_INDEX, >=20 >=20 > Makes no sense for a muxer. >=20 > > +}; >=20 >=20 > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >=20 > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". --b1_Va3VneRdI1hpgPbvt1REXvlqicglRJ66SE8mZWvi60k Content-Type: text/x-patch; name=0001-avformat-aea-Add-aea-muxer.patch Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=0001-avformat-aea-Add-aea-muxer.patch RnJvbSBkMjE2M2U3ZDk0M2E1YmE1MzE0OGFhNzNhODEzYTI4ZDM0NjEyNGE0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBhc2l2ZXJ5IDxhc2l2ZXJ5QHByb3Rvbm1haWwuY29tPgpEYXRl OiBGcmksIDggTWFyIDIwMjQgMTQ6NDU6MDIgKzAxMDAKU3ViamVjdDogW1BBVENIXSBhdmZvcm1h dC9hZWE6IEFkZCBhZWEgbXV4ZXIKClNpZ25lZC1vZmYtYnk6IGFzaXZlcnkgPGFzaXZlcnlAcHJv dG9ubWFpbC5jb20+Ci0tLQogbGliYXZmb3JtYXQvTWFrZWZpbGUgICAgICAgICAgICB8ICAgMyAr LQogbGliYXZmb3JtYXQve2FlYS5jID0+IGFlYWRlYy5jfSB8ICAgMAogbGliYXZmb3JtYXQvYWVh ZW5jLmMgICAgICAgICAgICB8IDEwMyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwog bGliYXZmb3JtYXQvYWxsZm9ybWF0cy5jICAgICAgICB8ICAgMSArCiA0IGZpbGVzIGNoYW5nZWQs IDEwNiBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCiByZW5hbWUgbGliYXZmb3JtYXQve2Fl YS5jID0+IGFlYWRlYy5jfSAoMTAwJSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWJhdmZvcm1hdC9h ZWFlbmMuYwoKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L01ha2VmaWxlIGIvbGliYXZmb3JtYXQv TWFrZWZpbGUKaW5kZXggODgxMWEwZmZjOS4uNzBkNTZmMzkxZiAxMDA2NDQKLS0tIGEvbGliYXZm b3JtYXQvTWFrZWZpbGUKKysrIGIvbGliYXZmb3JtYXQvTWFrZWZpbGUKQEAgLTkxLDcgKzkxLDgg QEAgT0JKUy0kKENPTkZJR19BRFRTX01VWEVSKSAgICAgICAgICAgICAgICArPSBhZHRzZW5jLm8g YXBldGFnLm8gaW1nMi5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgaWQzdjJlbmMubwogT0JKUy0kKENPTkZJR19BRFhfREVNVVhFUikgICAgICAgICAgICAg ICArPSBhZHhkZWMubwogT0JKUy0kKENPTkZJR19BRFhfTVVYRVIpICAgICAgICAgICAgICAgICAr PSByYXdlbmMubwotT0JKUy0kKENPTkZJR19BRUFfREVNVVhFUikgICAgICAgICAgICAgICArPSBh ZWEubyBwY20ubworT0JKUy0kKENPTkZJR19BRUFfREVNVVhFUikgICAgICAgICAgICAgICArPSBh ZWFkZWMubyBwY20ubworT0JKUy0kKENPTkZJR19BRUFfTVVYRVIpICAgICAgICAgICAgICAgICAr PSBhZWFlbmMubyByYXdlbmMubwogT0JKUy0kKENPTkZJR19BRkNfREVNVVhFUikgICAgICAgICAg ICAgICArPSBhZmMubwogT0JKUy0kKENPTkZJR19BSUZGX0RFTVVYRVIpICAgICAgICAgICAgICAr PSBhaWZmZGVjLm8gYWlmZi5vIHBjbS5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbW92X2NoYW4ubyByZXBsYXlnYWluLm8KZGlmZiAtLWdpdCBhL2xpYmF2 Zm9ybWF0L2FlYS5jIGIvbGliYXZmb3JtYXQvYWVhZGVjLmMKc2ltaWxhcml0eSBpbmRleCAxMDAl CnJlbmFtZSBmcm9tIGxpYmF2Zm9ybWF0L2FlYS5jCnJlbmFtZSB0byBsaWJhdmZvcm1hdC9hZWFk ZWMuYwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYWVhZW5jLmMgYi9saWJhdmZvcm1hdC9hZWFl bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi5lMDFmYWJjYWNlCi0t LSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvYWVhZW5jLmMKQEAgLTAsMCArMSwxMDMgQEAK Ky8qCisgKiBNRCBTVFVESU8gYXVkaW8gbXV4ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjQg YXNpdmVyeQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1w ZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBt b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGlj CisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u OyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh bCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8g dGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl dCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVk ZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJl YWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImF2 Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgInJhd2VuYy5o IgorI2luY2x1ZGUgIm11eC5oIgorCitzdGF0aWMgaW50IGFlYV93cml0ZV9oZWFkZXIoQVZGb3Jt YXRDb250ZXh0ICpzKQoreworICAgIGNvbnN0IEFWRGljdGlvbmFyeUVudHJ5ICp0aXRsZV9lbnRy eTsKKyAgICBpbnQgdGl0bGVfbGVuZ3RoID0gMDsKKyAgICBjaGFyKiB0aXRsZV9jb250ZW50czsK KyAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICBpZiAocy0+bmJfc3RyZWFtcyA+IDEpIHsKKyAgICAg ICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiR290IG1vcmUgdGhhbiBvbmUgc3RyZWFtIHRv IGVuY29kZS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVS Uk9SKEVJTlZBTCk7CisgICAgfQorICAgIAorICAgIHN0ID0gcy0+c3RyZWFtc1swXTsKKyAgICBp ZiAoc3QtPmNvZGVjcGFyLT5jaF9sYXlvdXQubmJfY2hhbm5lbHMgIT0gMSAmJiBzdC0+Y29kZWNw YXItPmNoX2xheW91dC5uYl9jaGFubmVscyAhPSAyKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9M T0dfRVJST1IsICJJbnZhbGlkIGFtb3VudCBvZiBjaGFubmVscyB0byBtdXggKCVkKS5cbiIsIHN0 LT5jb2RlY3Bhci0+Y2hfbGF5b3V0Lm5iX2NoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJS T1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAh PSA0NDEwMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzYW1w bGUgcmF0ZSAoJWQpIEFFQSBvbmx5IHN1cHBvcnRzIDQ0LjFrSHouXG4iLCBzdC0+Y29kZWNwYXIt PnNhbXBsZV9yYXRlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisK KyAgICAvKiBXcml0ZSBtYWdpYyAqLworICAgIGF2aW9fd2wzMihzLT5wYiwgMjA0OCk7CisgICAg CisgICAgLyogV3JpdGUgQUVBIHRpdGxlICovCisgICAgdGl0bGVfZW50cnkgPSBhdl9kaWN0X2dl dChzdC0+bWV0YWRhdGEsICJ0aXRsZSIsIE5VTEwsIDApOworICAgIGlmICh0aXRsZV9lbnRyeSkg eworICAgICAgICB0aXRsZV9jb250ZW50cyA9IHRpdGxlX2VudHJ5LT52YWx1ZTsKKyAgICAgICAg dGl0bGVfbGVuZ3RoID0gc3RybGVuKHRpdGxlX2NvbnRlbnRzKTsKKyAgICAgICAgdGl0bGVfbGVu Z3RoID0gRkZNSU4oMjU2LCB0aXRsZV9sZW5ndGgpOworICAgICAgICBhdmlvX3dyaXRlKHMtPnBi LCB0aXRsZV9jb250ZW50cywgdGl0bGVfbGVuZ3RoKTsKKyAgICB9CisKKyAgICBmZmlvX2ZpbGwo cy0+cGIsIDAsIDI1NiAtIHRpdGxlX2xlbmd0aCk7CisKKyAgICAvKiBXcml0ZSBudW1iZXIgb2Yg ZnJhbWVzICh6ZXJvIGF0IGhlYWRlci13cml0aW5nIHRpbWUsIHdpbGwgc2VlayBsYXRlciksIG51 bWJlciBvZiBjaGFubmVscyAqLworICAgIGF2aW9fd2wzMihzLT5wYiwgMCk7CisgICAgYXZpb193 OChzLT5wYiwgc3QtPmNvZGVjcGFyLT5jaF9sYXlvdXQubmJfY2hhbm5lbHMpOworICAgIGF2aW9f dzgocy0+cGIsIDApOworCisgICAgLyogUGFkIHRoZSBoZWFkZXIgdG8gMjA0OCBieXRlcyAqLwor ICAgIGZmaW9fZmlsbChzLT5wYiwgMCwgMTc4Mik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3Rh dGljIGludCBhZWFfd3JpdGVfdHJhaWxlcihzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzKQorewor ICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVh bXNbMF07CisgICAgaWYgKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSB7Cisg ICAgICAgIC8qIFNlZWsgdG8gcmV3cml0ZSB0aGUgYmxvY2sgY291bnQuICovCisgICAgICAgIGF2 aW9fc2VlayhwYiwgMjYwLCBTRUVLX1NFVCk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgc3QtPm5i X2ZyYW1lcyAqIHN0LT5jb2RlY3Bhci0+Y2hfbGF5b3V0Lm5iX2NoYW5uZWxzKTsKKyAgICB9IGVs c2UgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJ1bmFibGUgdG8gcmV3cml0 ZSBBRUEgaGVhZGVyLlxuIik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IEZG T3V0cHV0Rm9ybWF0IGZmX2FlYV9tdXhlciA9IHsKKyAgICAucC5uYW1lICAgICAgICAgICA9ICJh ZWEiLAorICAgIC5wLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1EIFNU VURJTyBhdWRpbyIpLAorICAgIC5wLmV4dGVuc2lvbnMgICAgID0gImFlYSIsCisgICAgLnAuYXVk aW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9BVFJBQzEsCisKKyAgICAud3JpdGVfaGVhZGVyICAg ICA9IGFlYV93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgPSBmZl9yYXdfd3Jp dGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgID0gYWVhX3dyaXRlX3RyYWlsZXIsCit9 OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYWxsZm9ybWF0cy5jIGIvbGliYXZmb3JtYXQvYWxs Zm9ybWF0cy5jCmluZGV4IDBhMGU3NjEzOGYuLjU2Mzk3MTUxMDQgMTAwNjQ0Ci0tLSBhL2xpYmF2 Zm9ybWF0L2FsbGZvcm1hdHMuYworKysgYi9saWJhdmZvcm1hdC9hbGxmb3JtYXRzLmMKQEAgLTQ3 LDYgKzQ3LDcgQEAgZXh0ZXJuIGNvbnN0IEZGT3V0cHV0Rm9ybWF0IGZmX2FkdHNfbXV4ZXI7CiBl eHRlcm4gY29uc3QgRkZJbnB1dEZvcm1hdCAgZmZfYWR4X2RlbXV4ZXI7CiBleHRlcm4gY29uc3Qg RkZPdXRwdXRGb3JtYXQgZmZfYWR4X211eGVyOwogZXh0ZXJuIGNvbnN0IEZGSW5wdXRGb3JtYXQg IGZmX2FlYV9kZW11eGVyOworZXh0ZXJuIGNvbnN0IEZGT3V0cHV0Rm9ybWF0IGZmX2FlYV9tdXhl cjsKIGV4dGVybiBjb25zdCBGRklucHV0Rm9ybWF0ICBmZl9hZmNfZGVtdXhlcjsKIGV4dGVybiBj b25zdCBGRklucHV0Rm9ybWF0ICBmZl9haWZmX2RlbXV4ZXI7CiBleHRlcm4gY29uc3QgRkZPdXRw dXRGb3JtYXQgZmZfYWlmZl9tdXhlcjsKLS0gCjIuMzQuMQoK --b1_Va3VneRdI1hpgPbvt1REXvlqicglRJ66SE8mZWvi60k 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". --b1_Va3VneRdI1hpgPbvt1REXvlqicglRJ66SE8mZWvi60k--