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 9A2D243EEB for ; Fri, 17 Feb 2023 00:36:33 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3F75E68BB30; Fri, 17 Feb 2023 02:36:30 +0200 (EET) Received: from iq.passwd.hu (iq.passwd.hu [217.27.212.140]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 05F5F68BA8D for ; Fri, 17 Feb 2023 02:36:22 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id D0469E881A for ; Fri, 17 Feb 2023 01:36:21 +0100 (CET) X-Virus-Scanned: amavisd-new at passwd.hu Received: from iq.passwd.hu ([127.0.0.1]) by localhost (iq.passwd.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 1o4TxJLK9IAI for ; Fri, 17 Feb 2023 01:36:19 +0100 (CET) Received: from iq (iq [217.27.212.140]) by iq.passwd.hu (Postfix) with ESMTPS id 658D2E8818 for ; Fri, 17 Feb 2023 01:36:19 +0100 (CET) Date: Fri, 17 Feb 2023 01:36:19 +0100 (CET) From: Marton Balint To: FFmpeg development discussions and patches In-Reply-To: <20230212230607.180234-1-jpcoiner@gmail.com> Message-ID: <1e4cd742-ed5c-d6f4-20fe-9461208233ee@passwd.hu> References: <20230212230607.180234-1-jpcoiner@gmail.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="467242196-765712933-1676594179=:31592" Subject: Re: [FFmpeg-devel] [PATCH v2] libavformat/mpegtsenc.c: correctly re-emit extradata ahead of IDR pictures 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: This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --467242196-765712933-1676594179=:31592 Content-Type: text/plain; charset=US-ASCII; format=flowed On Sun, 12 Feb 2023, John Coiner wrote: > This is v2 of the patch for https://trac.ffmpeg.org/ticket/10148. > > It implements the handling described at http://ffmpeg.org/pipermail/ffmpeg-devel/2023-February/306542.html, that is: > * If we receive [AUD][IDR], we emit [AUD][SPS][PPS][IDR] > * If we receive [SEI][AUD][IDR], we emit [AUD][SPS][PPS][SEI][IDR] > > This is speculative; it would be good to hear from Marton or others about whether this is the right handling. Looks fine to me, but I am no expert in H264 either. Can you check and test the attached patch? It contins cosmetic changes to your work. If that looks OK to you as well, than I will apply it in a few days. Thanks, Marton > > The other possible handling would be to simply prepend the extradata to the existing frame's bitstream without relocating the AUD to be in front. So if we received: > [AUD][IDR] > We would emit: > [SPS][PPS][AUD][IDR] > That's not quite compliant with the H.264 spec, which says an AUD shall be the first NAL in a frame when it's present. I doubt real decoders care and it would be simpler to implement. Let me know if you'd prefer the simpler handling. > > --- > libavformat/mpegtsenc.c | 55 ++++++++++++++++++++++++++++++++++++----- > 1 file changed, 49 insertions(+), 6 deletions(-) > > diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c > index 00ad426086..a4a2d8cdaf 100644 > --- a/libavformat/mpegtsenc.c > +++ b/libavformat/mpegtsenc.c > @@ -1835,6 +1835,13 @@ static int opus_get_packet_samples(AVFormatContext *s, AVPacket *pkt) > return duration; > } > > +// Copies `size_bytes` from `source` to `dest`. > +// Returns a pointer to the next destination address after the range written. > +static uint8_t* append(uint8_t* dest, const uint8_t* source, int size_bytes) { > + memcpy(dest, source, size_bytes); > + return dest + size_bytes; > +} > + > static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt) > { > AVStream *st = s->streams[pkt->stream_index]; > @@ -1877,6 +1884,7 @@ static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt) > > if (st->codecpar->codec_id == AV_CODEC_ID_H264) { > const uint8_t *p = buf, *buf_end = p + size; > + const uint8_t *found_aud = NULL, *found_aud_end = NULL; > uint32_t state = -1; > int extradd = (pkt->flags & AV_PKT_FLAG_KEY) ? st->codecpar->extradata_size : 0; > int ret = ff_check_h264_startcode(s, st, pkt); > @@ -1886,17 +1894,34 @@ static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt) > if (extradd && AV_RB24(st->codecpar->extradata) > 1) > extradd = 0; > > + // Ensure that all pictures are prefixed with an AUD, and that > + // IDR pictures are also prefixed with SPS and PPS. SPS and PPS > + // are assumed to be available in 'extradata' if not found in-band. > do { > p = avpriv_find_start_code(p, buf_end, &state); > av_log(s, AV_LOG_TRACE, "nal %"PRId32"\n", state & 0x1f); > - if ((state & 0x1f) == 7) > + if ((state & 0x1f) == 7) // SPS NAL > extradd = 0; > - } while (p < buf_end && (state & 0x1f) != 9 && > - (state & 0x1f) != 5 && (state & 0x1f) != 1); > - > - if ((state & 0x1f) != 5) > + if ((state & 0x1f) == 9) { // AUD NAL > + found_aud = p - 4; // start of the 0x000001 start code. > + found_aud_end = p + 1; // first byte past the AUD. > + > + if (found_aud < buf) > + found_aud = buf; > + if (buf_end < found_aud_end) > + found_aud_end = buf_end; > + } > + } while (p < buf_end > + && (state & 0x1f) != 5 // IDR picture > + && (state & 0x1f) != 1 // non-IDR picture > + && (extradd > 0 || !found_aud)); > + if ((state & 0x1f) != 5) { > + // Did not find an IDR picture; do not emit extradata. > extradd = 0; > - if ((state & 0x1f) != 9) { // AUD NAL > + } > + > + if (!found_aud) { > + // Prefix 'buf' with the missing AUD, and extradata if needed. > data = av_malloc(pkt->size + 6 + extradd); > if (!data) > return AVERROR(ENOMEM); > @@ -1907,6 +1932,24 @@ static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt) > data[5] = 0xf0; // any slice type (0xe) + rbsp stop one bit > buf = data; > size = pkt->size + 6 + extradd; > + } else if (extradd != 0) { > + // Move the AUD up to the beginning of the frame, where the H.264 > + // spec requires it to appear. Emit the extradata after it. > + const int aud_size = found_aud_end - found_aud; > + const int new_pkt_size = pkt->size + 1 + extradd; > + uint8_t *pos; > + data = av_malloc(new_pkt_size); > + if (!data) > + return AVERROR(ENOMEM); > + AV_WB8(data, 0x0); > + pos = data + 1; > + pos = append(pos, found_aud, aud_size); > + pos = append(pos, st->codecpar->extradata, extradd); > + pos = append(pos, pkt->data, found_aud - pkt->data); > + pos = append(pos, found_aud_end, buf_end - found_aud_end); > + av_assert0(data + new_pkt_size == pos); > + buf = data; > + size = new_pkt_size; > } > } else if (st->codecpar->codec_id == AV_CODEC_ID_AAC) { > if (pkt->size < 2) { > -- > 2.39.1.581.gbfd45094c4-goog > > _______________________________________________ > 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". > --467242196-765712933-1676594179=:31592 Content-Type: text/x-patch; name=0001-avformat-mpegtsenc-re-emit-extradata-ahead-of-IDR-pi.patch Content-Transfer-Encoding: BASE64 Content-ID: <5ebd3843-2e80-aa1f-65e4-fd84eb50a238@passwd.hu> Content-Description: Content-Disposition: attachment; filename=0001-avformat-mpegtsenc-re-emit-extradata-ahead-of-IDR-pi.patch RnJvbSBmYjA0MmE4OTYyYzRmOWM1M2U4OTJlY2FlODViNTUzMWYxOWNhN2Rl IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQ0KRnJvbTogSm9obiBDb2luZXIg PGpwY29pbmVyQGdtYWlsLmNvbT4NCkRhdGU6IFN1biwgMTIgRmViIDIwMjMg MTg6MDY6MDcgLTA1MDANClN1YmplY3Q6IFtQQVRDSF0gYXZmb3JtYXQvbXBl Z3RzZW5jOiByZS1lbWl0IGV4dHJhZGF0YSBhaGVhZCBvZiBJRFIgcGljdHVy ZXMNCiBldmVuIGlmIEFVRCBpcyBhbHJlYWR5IHByZXNlbnQNCg0KQ3VycmVu dCBtcGVndHNlbmMgY29kZSBvbmx5IGluc2VydHMgU1BTL1BQUyBmcm9tIGV4 dHJhZGF0YSBiZWZvcmUgSURSIGZyYW1lcyBpZg0KQVVEIGlzIGFsc28gaW5z ZXJ0ZWQuDQoNClVuZm9ydHVuYXRlbHkgc29tZSBlbmNvZGVycyBtYXkgcHJl ZmFjZSBhIGtleSBmcmFtZSB3aXRoIGFuIEFVRCwgYnV0IG5vDQpTUFMvUFBT LiBJbiB0aGF0IGNhc2UgY3VycmVudCBjb2RlIGRvZXMgbm90IHJlcGVhdCB0 aGUgImV4dHJhZGF0YSIgYW5kIHRoZQ0KcmVzdWx0aW5nIEhMUyBzdHJlYW0g bWF5IGJlY29tZSBub25jb21wbGlhbnQgYW5kIHVuam9pbmFibGUuDQoNCkZp eCB0aGlzIGJ5IGFsd2F5cyBpbnNlcnRpbmcgU1BTL1BQUyBhbmQgbW92aW5n IEFVRCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQ0KcGFja2V0IGlmIGl0IGlz IGFscmVhZHkgcHJlc2VudC4NCg0KRml4ZXMgdGlja2V0ICMxMDE0OC4NCg0K U2lnbmVkLW9mZi1ieTogTWFydG9uIEJhbGludCA8Y3VzQHBhc3N3ZC5odT4N Ci0tLQ0KIGxpYmF2Zm9ybWF0L21wZWd0c2VuYy5jIHwgNDggKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0NCiAxIGZpbGUgY2hh bmdlZCwgNDEgaW5zZXJ0aW9ucygrKSwgNyBkZWxldGlvbnMoLSkNCg0KZGlm ZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L21wZWd0c2VuYy5jIGIvbGliYXZmb3Jt YXQvbXBlZ3RzZW5jLmMNCmluZGV4IDAwYWQ0MjYwODYuLmNlZWQwODk1ODcg MTAwNjQ0DQotLS0gYS9saWJhdmZvcm1hdC9tcGVndHNlbmMuYw0KKysrIGIv bGliYXZmb3JtYXQvbXBlZ3RzZW5jLmMNCkBAIC0yOSw2ICsyOSw4IEBADQog DQogI2luY2x1ZGUgImxpYmF2Y29kZWMvYWMzX3BhcnNlcl9pbnRlcm5hbC5o Ig0KICNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCINCisjaW5jbHVk ZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiDQorI2luY2x1ZGUgImxpYmF2 Y29kZWMvaDI2NC5oIg0KICNpbmNsdWRlICJsaWJhdmNvZGVjL3N0YXJ0Y29k ZS5oIg0KIA0KICNpbmNsdWRlICJhdmZvcm1hdC5oIg0KQEAgLTE4NzcsNiAr MTg3OSw3IEBAIHN0YXRpYyBpbnQgbXBlZ3RzX3dyaXRlX3BhY2tldF9pbnRl cm5hbChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpDQogDQog ICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lE X0gyNjQpIHsNCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBidWYsICpi dWZfZW5kID0gcCArIHNpemU7DQorICAgICAgICBjb25zdCB1aW50OF90ICpm b3VuZF9hdWQgPSBOVUxMLCAqZm91bmRfYXVkX2VuZCA9IE5VTEw7DQogICAg ICAgICB1aW50MzJfdCBzdGF0ZSA9IC0xOw0KICAgICAgICAgaW50IGV4dHJh ZGQgPSAocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkgPyBzdC0+Y29k ZWNwYXItPmV4dHJhZGF0YV9zaXplIDogMDsNCiAgICAgICAgIGludCByZXQg PSBmZl9jaGVja19oMjY0X3N0YXJ0Y29kZShzLCBzdCwgcGt0KTsNCkBAIC0x ODg2LDI3ICsxODg5LDU4IEBAIHN0YXRpYyBpbnQgbXBlZ3RzX3dyaXRlX3Bh Y2tldF9pbnRlcm5hbChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpw a3QpDQogICAgICAgICBpZiAoZXh0cmFkZCAmJiBBVl9SQjI0KHN0LT5jb2Rl Y3Bhci0+ZXh0cmFkYXRhKSA+IDEpDQogICAgICAgICAgICAgZXh0cmFkZCA9 IDA7DQogDQorICAgICAgICAvKiBFbnN1cmUgdGhhdCBhbGwgcGljdHVyZXMg YXJlIHByZWZpeGVkIHdpdGggYW4gQVVELCBhbmQgdGhhdA0KKyAgICAgICAg ICogSURSIHBpY3R1cmVzIGFyZSBhbHNvIHByZWZpeGVkIHdpdGggU1BTIGFu ZCBQUFMuIFNQUyBhbmQgUFBTDQorICAgICAgICAgKiBhcmUgYXNzdW1lZCB0 byBiZSBhdmFpbGFibGUgaW4gJ2V4dHJhZGF0YScgaWYgbm90IGZvdW5kIGlu LWJhbmQuICovDQogICAgICAgICBkbyB7DQogICAgICAgICAgICAgcCA9IGF2 cHJpdl9maW5kX3N0YXJ0X2NvZGUocCwgYnVmX2VuZCwgJnN0YXRlKTsNCiAg ICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAibmFsICUiUFJJ ZDMyIlxuIiwgc3RhdGUgJiAweDFmKTsNCi0gICAgICAgICAgICBpZiAoKHN0 YXRlICYgMHgxZikgPT0gNykNCisgICAgICAgICAgICBpZiAoKHN0YXRlICYg MHgxZikgPT0gSDI2NF9OQUxfU1BTKQ0KICAgICAgICAgICAgICAgICBleHRy YWRkID0gMDsNCi0gICAgICAgIH0gd2hpbGUgKHAgPCBidWZfZW5kICYmIChz dGF0ZSAmIDB4MWYpICE9IDkgJiYNCi0gICAgICAgICAgICAgICAgIChzdGF0 ZSAmIDB4MWYpICE9IDUgJiYgKHN0YXRlICYgMHgxZikgIT0gMSk7DQotDQot ICAgICAgICBpZiAoKHN0YXRlICYgMHgxZikgIT0gNSkNCisgICAgICAgICAg ICBpZiAoKHN0YXRlICYgMHgxZikgPT0gSDI2NF9OQUxfQVVEKSB7DQorICAg ICAgICAgICAgICAgIGZvdW5kX2F1ZCA9IHAgLSA0OyAgICAgLy8gc3RhcnQg b2YgdGhlIDB4MDAwMDAxIHN0YXJ0IGNvZGUuDQorICAgICAgICAgICAgICAg IGZvdW5kX2F1ZF9lbmQgPSBwICsgMTsgLy8gZmlyc3QgYnl0ZSBwYXN0IHRo ZSBBVUQuDQorICAgICAgICAgICAgICAgIGlmIChmb3VuZF9hdWQgPCBidWYp DQorICAgICAgICAgICAgICAgICAgICBmb3VuZF9hdWQgPSBidWY7DQorICAg ICAgICAgICAgICAgIGlmIChidWZfZW5kIDwgZm91bmRfYXVkX2VuZCkNCisg ICAgICAgICAgICAgICAgICAgIGZvdW5kX2F1ZF9lbmQgPSBidWZfZW5kOw0K KyAgICAgICAgICAgIH0NCisgICAgICAgIH0gd2hpbGUgKHAgPCBidWZfZW5k DQorICAgICAgICAgICAgICAgICAmJiAoc3RhdGUgJiAweDFmKSAhPSBIMjY0 X05BTF9JRFJfU0xJQ0UNCisgICAgICAgICAgICAgICAgICYmIChzdGF0ZSAm IDB4MWYpICE9IEgyNjRfTkFMX1NMSUNFDQorICAgICAgICAgICAgICAgICAm JiAoZXh0cmFkZCA+IDAgfHwgIWZvdW5kX2F1ZCkpOw0KKyAgICAgICAgaWYg KChzdGF0ZSAmIDB4MWYpICE9IEgyNjRfTkFMX0lEUl9TTElDRSkNCiAgICAg ICAgICAgICBleHRyYWRkID0gMDsNCi0gICAgICAgIGlmICgoc3RhdGUgJiAw eDFmKSAhPSA5KSB7IC8vIEFVRCBOQUwNCisNCisgICAgICAgIGlmICghZm91 bmRfYXVkKSB7DQorICAgICAgICAgICAgLyogUHJlZml4ICdidWYnIHdpdGgg dGhlIG1pc3NpbmcgQVVELCBhbmQgZXh0cmFkYXRhIGlmIG5lZWRlZC4gKi8N CiAgICAgICAgICAgICBkYXRhID0gYXZfbWFsbG9jKHBrdC0+c2l6ZSArIDYg KyBleHRyYWRkKTsNCiAgICAgICAgICAgICBpZiAoIWRhdGEpDQogICAgICAg ICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7DQogICAgICAgICAg ICAgbWVtY3B5KGRhdGEgKyA2LCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwg ZXh0cmFkZCk7DQogICAgICAgICAgICAgbWVtY3B5KGRhdGEgKyA2ICsgZXh0 cmFkZCwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOw0KICAgICAgICAgICAgIEFW X1dCMzIoZGF0YSwgMHgwMDAwMDAwMSk7DQotICAgICAgICAgICAgZGF0YVs0 XSA9IDB4MDk7DQorICAgICAgICAgICAgZGF0YVs0XSA9IEgyNjRfTkFMX0FV RDsNCiAgICAgICAgICAgICBkYXRhWzVdID0gMHhmMDsgLy8gYW55IHNsaWNl IHR5cGUgKDB4ZSkgKyByYnNwIHN0b3Agb25lIGJpdA0KICAgICAgICAgICAg IGJ1ZiAgICAgPSBkYXRhOw0KICAgICAgICAgICAgIHNpemUgICAgPSBwa3Qt PnNpemUgKyA2ICsgZXh0cmFkZDsNCisgICAgICAgIH0gZWxzZSBpZiAoZXh0 cmFkZCAhPSAwKSB7DQorICAgICAgICAgICAgLyogTW92ZSB0aGUgQVVEIHVw IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lLCB3aGVyZSB0aGUgSC4y NjQNCisgICAgICAgICAgICAgKiBzcGVjIHJlcXVpcmVzIGl0IHRvIGFwcGVh ci4gRW1pdCB0aGUgZXh0cmFkYXRhIGFmdGVyIGl0LiAqLw0KKyAgICAgICAg ICAgIFB1dEJ5dGVDb250ZXh0IHBiOw0KKyAgICAgICAgICAgIGNvbnN0IGlu dCBuZXdfcGt0X3NpemUgPSBwa3QtPnNpemUgKyAxICsgZXh0cmFkZDsNCisg ICAgICAgICAgICBkYXRhID0gYXZfbWFsbG9jKG5ld19wa3Rfc2l6ZSk7DQor ICAgICAgICAgICAgaWYgKCFkYXRhKQ0KKyAgICAgICAgICAgICAgICByZXR1 cm4gQVZFUlJPUihFTk9NRU0pOw0KKyAgICAgICAgICAgIGJ5dGVzdHJlYW0y X2luaXRfd3JpdGVyKCZwYiwgZGF0YSwgbmV3X3BrdF9zaXplKTsNCisgICAg ICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGIsIDB4MDApOw0KKyAg ICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9idWZmZXIoJnBiLCBmb3VuZF9h dWQsIGZvdW5kX2F1ZF9lbmQgLSBmb3VuZF9hdWQpOw0KKyAgICAgICAgICAg IGJ5dGVzdHJlYW0yX3B1dF9idWZmZXIoJnBiLCBzdC0+Y29kZWNwYXItPmV4 dHJhZGF0YSwgZXh0cmFkZCk7DQorICAgICAgICAgICAgYnl0ZXN0cmVhbTJf cHV0X2J1ZmZlcigmcGIsIHBrdC0+ZGF0YSwgZm91bmRfYXVkIC0gcGt0LT5k YXRhKTsNCisgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnVmZmVyKCZw YiwgZm91bmRfYXVkX2VuZCwgYnVmX2VuZCAtIGZvdW5kX2F1ZF9lbmQpOw0K KyAgICAgICAgICAgIGF2X2Fzc2VydDAobmV3X3BrdF9zaXplID09IGJ5dGVz dHJlYW0yX3RlbGxfcCgmcGIpKTsNCisgICAgICAgICAgICBidWYgICAgID0g ZGF0YTsNCisgICAgICAgICAgICBzaXplICAgID0gbmV3X3BrdF9zaXplOw0K ICAgICAgICAgfQ0KICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29k ZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7DQogICAgICAgICBpZiAocGt0 LT5zaXplIDwgMikgew0KLS0gDQoyLjM1LjMNCg0K --467242196-765712933-1676594179=:31592 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". --467242196-765712933-1676594179=:31592--