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 B499A43702 for ; Sat, 25 Jun 2022 14:15:52 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4649C68B5ED; Sat, 25 Jun 2022 17:15:49 +0300 (EEST) Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5521568B419 for ; Sat, 25 Jun 2022 17:15:42 +0300 (EEST) Received: by mail-ed1-f51.google.com with SMTP id c13so7084566eds.10 for ; Sat, 25 Jun 2022 07:15:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=sy6Z+353BWl9OduPO0Feryj8+iSSX3Q57VJUYvPKRgU=; b=DU5CrwGG22W0yoEVFF60YGLsLBB5cTdvNo0VGi0x2DCuuFQbIfQreyRL4Ag4qvhuiE gjlhJ1O8INnnU2W/Zyxgp8vLmEy1vtltR0OLDPbTtpEilAmx47YJbO+hkslGjysxrGaF uAKvjgus0+ZRlsugSI+679qXvx5eERetyKoJt4qgkeGKC2FfwppCALyAB2Hi7YoHrBua 5+MYjaIyh47UBF19ir4eFUnhp4sbxowN4XmD/fDeYGAWcyiX5B57d32/5c9NyiQm+ZsJ lcoTuq7s5z5CUtzvrkJBSvACIRb1Xeh6lGCDG1D4/Augico5BFaT3XSPhNUpeqa5XxnN Rc6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=sy6Z+353BWl9OduPO0Feryj8+iSSX3Q57VJUYvPKRgU=; b=kDazg2qztDNAwCJs2bw7mZWbaoEUPkk0AnjcQF63+0y1XBPiZN1vdSYV0YsdzLUayv CV11t2B1i4RG88thPsMITNuWyQqSrQrDQmghmngc8MSpctr+/Nm3cQ3EDxXBZEFgNbKd YENBRF/iAxJBwgRFoohKzQyTu4qNX+gzm9iLhWe0D8mb/EQJnoXWby+oX1TiG/0YIpE7 LYjVJxzZ4SkvlKpvGz5zaFW5/I+lm90vvkeZN+r2NMIM5I2N0tNZ0+6jPtzIiXN1SvWv Ydq5Ms8u87q1o01uPy6vWXK+mewAN2VLzbSllx5e4CB5h/ED5xpJ0yvPEMLrotBZl1qa 6/Vw== X-Gm-Message-State: AJIora/h2bNcM5CMyEpxfoq0QrPSguQkf9MSTeZlSYTY0h8Uik5uvkoB bGmSgoH/x2S76O0v5qKdvoqu+Jmjc90ukKhhWv4x+/LtE9/ETH4ZHdQ= X-Google-Smtp-Source: AGRyM1uqJB2IYdDDl5cl/Om33uFygt/uFsXWM25NfbXbeY0niE5SNvwVct2oH2/vcsasQGW2t9huQ2GmlaQGBBBTgVM= X-Received: by 2002:a05:6402:298e:b0:435:61b0:41a with SMTP id eq14-20020a056402298e00b0043561b0041amr5263121edb.278.1656166541200; Sat, 25 Jun 2022 07:15:41 -0700 (PDT) MIME-Version: 1.0 References: <20220623150040.1981341-1-wolfleekay@gmail.com> <72023989-5CD8-4EAF-BF84-F896B23257C0@chinaffmpeg.org> In-Reply-To: From: Li Kai Date: Sat, 25 Jun 2022 22:15:29 +0800 Message-ID: To: FFmpeg development discussions and patches Content-Type: multipart/mixed; boundary="00000000000060b12b05e2465272" X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: Re: [FFmpeg-devel] [PATCH] avformat/hls:use EXT-X-START instead of live_start_index if it's in playlist 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 Cc: Steven Liu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: --00000000000060b12b05e2465272 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable OK, I add the option description in doc/demuxers.texi. About invalid EXT-X-START value, it's not played on Safari. So I make it error to handle. You opinion, it's better way. The latest patch fix it. On 2022/6/25 21:26, Steven Liu wrote: > > >> =E5=9C=A8 2022=E5=B9=B46=E6=9C=8825=E6=97=A5=EF=BC=8C13:24=EF=BC=8CLi Ka= i =E5=86=99=E9=81=93=EF=BC=9A >> >> Ok, I add allowed_x_start option, and the option default is 0. So curren= t > What about use =E2=80=9Cprefer_x_start=E2=80=9D for option name. > > BTW, add option descriptions into document doc/demuxers.texi > > > + } else if (av_strstart(line, "#EXT-X-START:", &ptr)) { > + ret =3D ensure_playlist(c, &pls, url); > + if (ret < 0) { > + goto fail; > + } > + if (av_strstart(ptr, "TIME-OFFSET=3D", &p)) { > + float offset =3D strtof(p, NULL); > + pls->start_time_offset =3D offset * AV_TIME_BASE; > + pls->time_offset_flag =3D 1; > + } else { > + goto fail; > + } > > should this logic goto fail? > why don=E2=80=99t output a warning and continue try to use live_start_ind= ex? Or maybe there have some reason, are they? >> users will not be affected. >> please review again. >> >> At last, Thanks your tips. >> >> Steven Liu =E4=BA=8E2022=E5=B9=B46=E6=9C=8825=E6=97= =A5=E5=91=A8=E5=85=AD 12:51=E5=86=99=E9=81=93=EF=BC=9A >> >>> >>> >>>> =E5=9C=A8 2022=E5=B9=B46=E6=9C=8825=E6=97=A5=EF=BC=8C12:32=EF=BC=8C=E5= =B0=91=E5=AE=87=E6=9D=8E =E5=86=99=E9=81=93=EF=BC=9A >>>> >>>> Hi Steven, >>>> >>>> Please review code. >>>> >>>> I changed code, but I still have a question. >>>> If EXT-X-START tag in playlist and users set live_start_index, the >>>> live_start_index will not work >>>> for current codes, which makes maybe users confused. >>>> Is that OK? >>> for current codes, user cannot aware there have EXT-X-START tag in the >>> playlist, so i think we should reserve the old use method. >>> or maybe you can add an option for user to decide which way they can us= e >>> (either EXT-X-START or live_start_index). >>> Because there should have many people using live_start_index for 'time >>> shift=E2=80=99 by player (user control), >>> >>>> >>>> In other hand, if make live_start_index valid when EXT-X-START tag in >>>> playlist, maybe live_start_index needs a flag, or >>>> make live_start_index default value is INT_MIN to distinguish. >>>> becuase the live_start_index default value is -3, I have no idea to >>>> distinguish users action or >>>> default value when live_start_index=3D-3. >>> yes cannot distinguish users action, but user should can decided use >>> live_start_index or EXT-X-START. >>> >>>> >>>> May I need to set default value=3DINT_MIN as live_start_index default >>> value? >>>> And only when does not exist EXT-X-START >>>> tag in playlist, make live_start_index =3D -3 or users's configuration >>> value. >>>> I have no idea which is better~ >>>> >>>> Thanks a lot! >>>> >>>> Steven Liu =E4=BA=8E2022=E5=B9=B46=E6=9C=882= 4=E6=97=A5=E5=91=A8=E4=BA=94 14:21=E5=86=99=E9=81=93=EF=BC=9A >>>> >>>>> =E5=B0=91=E5=AE=87=E6=9D=8E =E4=BA=8E2022=E5= =B9=B46=E6=9C=8824=E6=97=A5=E5=91=A8=E4=BA=94 11:58=E5=86=99=E9=81=93=EF=BC= =9A >>>>>>> >>>>>>> >>>>>>> Hi, Steven >>>>>> >>>>>> >>>>>> I got it. >>>>>> >>>>>> User could use "live_start_index" option even if #EXT-X-START in the >>>>> playlist. >>>>>> >>>>>> I changed the priority about #EXT-X-START/live_start_index, >>>>>> >>>>>> this is new bellow: >>>>>> >>>>>> --- >>>>>> libavformat/hls.c | 69 +++++++++++++++++++++++++++++++++++++++++++---- >>>>>> 1 file changed, 64 insertions(+), 5 deletions(-) >>>>>> >>>>>> diff --git a/libavformat/hls.c b/libavformat/hls.c >>>>>> index b736f093a9..309471efce 100644 >>>>>> --- a/libavformat/hls.c >>>>>> +++ b/libavformat/hls.c >>>>>> @@ -120,6 +120,8 @@ struct playlist { >>>>>> enum PlaylistType type; >>>>>> int64_t target_duration; >>>>>> int64_t start_seq_no; >>>>>> + int time_offset_flag; >>>>>> + int64_t start_time_offset; >>>>>> int n_segments; >>>>>> struct segment **segments; >>>>>> int needed; >>>>>> @@ -741,6 +743,7 @@ static int parse_playlist(HLSContext *c, const char >>>>> *url, >>>>>> struct segment **prev_segments =3D NULL; >>>>>> int prev_n_segments =3D 0; >>>>>> int64_t prev_start_seq_no =3D -1; >>>>>> + const char *p; >>>>>> >>>>>> if (is_http && !in && c->http_persistent && c->playlist_pb) { >>>>>> in =3D c->playlist_pb; >>>>>> @@ -889,6 +892,18 @@ static int parse_playlist(HLSContext *c, const >>> char >>>>> *url, >>>>>> cur_init_section->key =3D NULL; >>>>>> } >>>>>> >>>>>> + } else if (av_strstart(line, "#EXT-X-START:", &ptr)) { >>>>>> + ret =3D ensure_playlist(c, &pls, url); >>>>>> + if (ret < 0) { >>>>>> + goto fail; >>>>>> + } >>>>>> + if (av_strstart(ptr, "TIME-OFFSET=3D", &p)) { >>>>>> + float offset =3D strtof(p, NULL); >>>>>> + pls->start_time_offset =3D offset * AV_TIME_BASE; >>>>>> + pls->time_offset_flag =3D 1; >>>>>> + } else { >>>>>> + goto fail; >>>>>> + } >>>>>> } else if (av_strstart(line, "#EXT-X-ENDLIST", &ptr)) { >>>>>> if (pls) >>>>>> pls->finished =3D 1; >>>>>> @@ -1721,10 +1736,54 @@ static int64_t select_cur_seq_no(HLSContext *c, >>>>> struct playlist *pls) >>>>>> >>>>>> /* If this is a live stream, start live_start_index segments >>>>> from the >>>>>> * start or end */ >>>>>> - if (c->live_start_index < 0) >>>>>> - return pls->start_seq_no + FFMAX(pls->n_segments + >>>>> c->live_start_index, 0); >>>>>> - else >>>>>> - return pls->start_seq_no + FFMIN(c->live_start_index, >>>>> pls->n_segments - 1); >>>>>> + if (c->live_start_index !=3D INT_MIN) { >>>>> Maybe you should not change current logic. >>>>> You can just add about process EXT-X-START sence,. >>>>> For example: >>>>> compute the start_seq_no and save the value to a temp varible and >>>>> don't return immediately, check the third scence which get EXT-X-STAR= T >>>>> tag from playlist. >>>>> process the temp varible after start_seq_no compute from >>>>> live_start_index or EXT-X-START. >>>>> >>>>>> + if (c->live_start_index < 0) >>>>>> + return pls->start_seq_no + FFMAX(pls->n_segments + >>>>>> + c->live_start_index= , >>> 0); >>>>>> + else >>>>>> + return pls->start_seq_no + FFMIN(c->live_start_index, >>>>>> + pls->n_segments - 1); >>>>>> + } else if (c->live_start_index =3D=3D INT_MIN && >>>>> !pls->time_offset_flag) { >>>>>> + return pls->start_seq_no + FFMAX(pls->n_segments - 3, 0); >>>>>> + } else { >>>>>> + /* If playlist indicate a TIME-OFFSET and user not use >>>>> live_start_index, >>>>>> + * need to recalculate seq_no */ >>>>>> + int i; >>>>>> + int64_t start_timestamp; >>>>>> + int64_t playlist_duration =3D 0; >>>>>> + int64_t cur_timestamp =3D c->cur_timestamp =3D=3D AV_NOPTS_VALUE >>>>> ? 0 : >>>>>> + c->cur_timestamp; >>>>>> + >>>>>> + for (i =3D 0; i < pls->n_segments; i++) { >>>>>> + playlist_duration +=3D pls->segments[i]->duration; >>>>>> + } >>>>>> + /* If the absolute value of TIME-OFFSET exceeds >>>>>> + * the duration of the playlist, it indicates either th= e >>>>> end of the >>>>>> + * playlist (if positive) or the beginning of the playlist >>>>> (if >>>>>> + * negative). */ >>>>>> + if (pls->start_time_offset >=3D0 && >>>>>> + pls->start_time_offset > playlist_duration) >>>>>> + start_timestamp =3D cur_timestamp + playlist_durati= on; >>>>>> + else if (pls->start_time_offset >=3D 0 && >>>>>> + pls->start_time_offset <=3D playlist_durati= on) >>>>>> + start_timestamp =3D cur_timestamp + >>>>> pls->start_time_offset; >>>>>> + else if (pls->start_time_offset < 0 && >>>>>> + pls->start_time_offset < -playlist_duration= ) >>>>>> + start_timestamp =3D cur_timestamp; >>>>>> + else if (pls->start_time_offset < 0 && >>>>>> + pls->start_time_offset > -playlist_duration= ) >>>>>> + start_timestamp =3D cur_timestamp + playlist_durati= on + >>>>>> + pls->start_time_offset; >>>>>> + else >>>>>> + start_timestamp =3D cur_timestamp; >>>>>> + >>>>>> + find_timestamp_in_playlist(c, pls, start_timestamp, >>>>> &seq_no, NULL); >>>>>> + av_log(c, AV_LOG_DEBUG, "start_timestamp: %" PRId64 >>>>>> + "cur_timestamp:%" PRId64 >>>>>> + "cur_seq_no:%" PRId64 "\n", >>>>>> + start_timestamp, cur_timestamp, >>>>> seq_no); >>>>>> + return seq_no; >>>>>> + } >>>>>> } >>>>>> >>>>>> /* Otherwise just start on the first segment. */ >>>>>> @@ -2475,7 +2534,7 @@ static int hls_probe(const AVProbeData *p) >>>>>> #define FLAGS AV_OPT_FLAG_DECODING_PARAM >>>>>> static const AVOption hls_options[] =3D { >>>>>> {"live_start_index", "segment index to start live streams at >>>>> (negative values are from the end)", >>>>>> - OFFSET(live_start_index), AV_OPT_TYPE_INT, {.i64 =3D -3}, >>>>> INT_MIN, INT_MAX, FLAGS}, >>>>>> + OFFSET(live_start_index), AV_OPT_TYPE_INT, {.i64 =3D INT_MI= N}, >>>>> INT_MIN, INT_MAX, FLAGS}, >>>>> This is unnecessary=EF=BC=8C because the default -3 is ok and be usin= g by >>>>> users from many years ago. >>>>> >>>>>> {"allowed_extensions", "List of file extensions that hls is allowed >>>>> to access", >>>>>> OFFSET(allowed_extensions), AV_OPT_TYPE_STRING, >>>>>> {.str =3D >>>>> >>> "3gp,aac,avi,ac3,eac3,flac,mkv,m3u8,m4a,m4s,m4v,mpg,mov,mp2,mp3,mp4,mpeg,mp= egts,ogg,ogv,oga,ts,vob,wav"}, >>>>>> -- >>>>>> 2.24.1 (Apple Git-126) >>>>>> >>>>>> >>>>>> Thanks Steven >>>>> >>>> >>> <0001-avformat-hls-use-EXT-X-START-instead-of-live_start_i.patch>__________= _____________________________________ >>>> 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". >>> >>> Thanks >>> Steven >>> >>> >>> >>> >>> _______________________________________________ >>> 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". >>> >> __________= _____________________________________ >> 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". > > Thanks > Steven > > > > > _______________________________________________ > 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". Steven Liu =E4=BA=8E2022=E5=B9=B46=E6=9C=8825=E6=97=A5= =E5=91=A8=E5=85=AD 21:28=E5=86=99=E9=81=93=EF=BC=9A > > > > =E5=9C=A8 2022=E5=B9=B46=E6=9C=8825=E6=97=A5=EF=BC=8C13:24=EF=BC=8CLi K= ai =E5=86=99=E9=81=93=EF=BC=9A > > > > Ok, I add allowed_x_start option, and the option default is 0. So curre= nt > What about use =E2=80=9Cprefer_x_start=E2=80=9D for option name. > > BTW, add option descriptions into document doc/demuxers.texi > > > + } else if (av_strstart(line, "#EXT-X-START:", &ptr)) { > + ret =3D ensure_playlist(c, &pls, url); > + if (ret < 0) { > + goto fail; > + } > + if (av_strstart(ptr, "TIME-OFFSET=3D", &p)) { > + float offset =3D strtof(p, NULL); > + pls->start_time_offset =3D offset * AV_TIME_BASE; > + pls->time_offset_flag =3D 1; > + } else { > + goto fail; > + } > > should this logic goto fail? > why don=E2=80=99t output a warning and continue try to use live_start_ind= ex? Or > maybe there have some reason, are they? > > users will not be affected. > > please review again. > > > > At last, Thanks your tips. > > > > Steven Liu =E4=BA=8E2022=E5=B9=B46=E6=9C=8825=E6= =97=A5=E5=91=A8=E5=85=AD 12:51=E5=86=99=E9=81=93=EF=BC=9A > > > >> > >> > >>> =E5=9C=A8 2022=E5=B9=B46=E6=9C=8825=E6=97=A5=EF=BC=8C12:32=EF=BC=8C= =E5=B0=91=E5=AE=87=E6=9D=8E =E5=86=99=E9=81=93=EF=BC= =9A > >>> > >>> Hi Steven, > >>> > >>> Please review code. > >>> > >>> I changed code, but I still have a question. > >>> If EXT-X-START tag in playlist and users set live_start_index, the > >>> live_start_index will not work > >>> for current codes, which makes maybe users confused. > >>> Is that OK? > >> for current codes, user cannot aware there have EXT-X-START tag in the > >> playlist, so i think we should reserve the old use method. > >> or maybe you can add an option for user to decide which way they can u= se > >> (either EXT-X-START or live_start_index). > >> Because there should have many people using live_start_index for 'time > >> shift=E2=80=99 by player (user control), > >> > >>> > >>> In other hand, if make live_start_index valid when EXT-X-START tag in > >>> playlist, maybe live_start_index needs a flag, or > >>> make live_start_index default value is INT_MIN to distinguish. > >>> becuase the live_start_index default value is -3, I have no idea to > >>> distinguish users action or > >>> default value when live_start_index=3D-3. > >> yes cannot distinguish users action, but user should can decided use > >> live_start_index or EXT-X-START. > >> > >>> > >>> May I need to set default value=3DINT_MIN as live_start_index default > >> value? > >>> And only when does not exist EXT-X-START > >>> tag in playlist, make live_start_index =3D -3 or users's configuratio= n > >> value. > >>> I have no idea which is better~ > >>> > >>> Thanks a lot! > >>> > >>> Steven Liu =E4=BA=8E2022=E5=B9=B46=E6=9C=88= 24=E6=97=A5=E5=91=A8=E4=BA=94 14:21=E5=86=99=E9=81=93=EF=BC=9A > >>> > >>>> =E5=B0=91=E5=AE=87=E6=9D=8E =E4=BA=8E2022=E5= =B9=B46=E6=9C=8824=E6=97=A5=E5=91=A8=E4=BA=94 11:58=E5=86=99=E9=81=93=EF=BC= =9A > >>>>>> > >>>>>> > >>>>>> Hi, Steven > >>>>> > >>>>> > >>>>> I got it. > >>>>> > >>>>> User could use "live_start_index" option even if #EXT-X-START in th= e > >>>> playlist. > >>>>> > >>>>> I changed the priority about #EXT-X-START/live_start_index, > >>>>> > >>>>> this is new bellow: > >>>>> > >>>>> --- > >>>>> libavformat/hls.c | 69 > +++++++++++++++++++++++++++++++++++++++++++---- > >>>>> 1 file changed, 64 insertions(+), 5 deletions(-) > >>>>> > >>>>> diff --git a/libavformat/hls.c b/libavformat/hls.c > >>>>> index b736f093a9..309471efce 100644 > >>>>> --- a/libavformat/hls.c > >>>>> +++ b/libavformat/hls.c > >>>>> @@ -120,6 +120,8 @@ struct playlist { > >>>>> enum PlaylistType type; > >>>>> int64_t target_duration; > >>>>> int64_t start_seq_no; > >>>>> + int time_offset_flag; > >>>>> + int64_t start_time_offset; > >>>>> int n_segments; > >>>>> struct segment **segments; > >>>>> int needed; > >>>>> @@ -741,6 +743,7 @@ static int parse_playlist(HLSContext *c, const > char > >>>> *url, > >>>>> struct segment **prev_segments =3D NULL; > >>>>> int prev_n_segments =3D 0; > >>>>> int64_t prev_start_seq_no =3D -1; > >>>>> + const char *p; > >>>>> > >>>>> if (is_http && !in && c->http_persistent && c->playlist_pb) { > >>>>> in =3D c->playlist_pb; > >>>>> @@ -889,6 +892,18 @@ static int parse_playlist(HLSContext *c, const > >> char > >>>> *url, > >>>>> cur_init_section->key =3D NULL; > >>>>> } > >>>>> > >>>>> + } else if (av_strstart(line, "#EXT-X-START:", &ptr)) { > >>>>> + ret =3D ensure_playlist(c, &pls, url); > >>>>> + if (ret < 0) { > >>>>> + goto fail; > >>>>> + } > >>>>> + if (av_strstart(ptr, "TIME-OFFSET=3D", &p)) { > >>>>> + float offset =3D strtof(p, NULL); > >>>>> + pls->start_time_offset =3D offset * AV_TIME_BASE; > >>>>> + pls->time_offset_flag =3D 1; > >>>>> + } else { > >>>>> + goto fail; > >>>>> + } > >>>>> } else if (av_strstart(line, "#EXT-X-ENDLIST", &ptr)) { > >>>>> if (pls) > >>>>> pls->finished =3D 1; > >>>>> @@ -1721,10 +1736,54 @@ static int64_t select_cur_seq_no(HLSContext > *c, > >>>> struct playlist *pls) > >>>>> > >>>>> /* If this is a live stream, start live_start_index segments > >>>> from the > >>>>> * start or end */ > >>>>> - if (c->live_start_index < 0) > >>>>> - return pls->start_seq_no + FFMAX(pls->n_segments + > >>>> c->live_start_index, 0); > >>>>> - else > >>>>> - return pls->start_seq_no + FFMIN(c->live_start_index, > >>>> pls->n_segments - 1); > >>>>> + if (c->live_start_index !=3D INT_MIN) { > >>>> Maybe you should not change current logic. > >>>> You can just add about process EXT-X-START sence,. > >>>> For example: > >>>> compute the start_seq_no and save the value to a temp varible and > >>>> don't return immediately, check the third scence which get EXT-X-STA= RT > >>>> tag from playlist. > >>>> process the temp varible after start_seq_no compute from > >>>> live_start_index or EXT-X-START. > >>>> > >>>>> + if (c->live_start_index < 0) > >>>>> + return pls->start_seq_no + FFMAX(pls->n_segments + > >>>>> + c->live_start_inde= x, > >> 0); > >>>>> + else > >>>>> + return pls->start_seq_no + > FFMIN(c->live_start_index, > >>>>> + pls->n_segments - > 1); > >>>>> + } else if (c->live_start_index =3D=3D INT_MIN && > >>>> !pls->time_offset_flag) { > >>>>> + return pls->start_seq_no + FFMAX(pls->n_segments - 3, > 0); > >>>>> + } else { > >>>>> + /* If playlist indicate a TIME-OFFSET and user not use > >>>> live_start_index, > >>>>> + * need to recalculate seq_no */ > >>>>> + int i; > >>>>> + int64_t start_timestamp; > >>>>> + int64_t playlist_duration =3D 0; > >>>>> + int64_t cur_timestamp =3D c->cur_timestamp =3D=3D > AV_NOPTS_VALUE > >>>> ? 0 : > >>>>> + c->cur_timestamp; > >>>>> + > >>>>> + for (i =3D 0; i < pls->n_segments; i++) { > >>>>> + playlist_duration +=3D pls->segments[i]->duration; > >>>>> + } > >>>>> + /* If the absolute value of TIME-OFFSET exceeds > >>>>> + * the duration of the playlist, it indicates either t= he > >>>> end of the > >>>>> + * playlist (if positive) or the beginning of the > playlist > >>>> (if > >>>>> + * negative). */ > >>>>> + if (pls->start_time_offset >=3D0 && > >>>>> + pls->start_time_offset > playlist_duration) > >>>>> + start_timestamp =3D cur_timestamp + playlist_durat= ion; > >>>>> + else if (pls->start_time_offset >=3D 0 && > >>>>> + pls->start_time_offset <=3D playlist_durat= ion) > >>>>> + start_timestamp =3D cur_timestamp + > >>>> pls->start_time_offset; > >>>>> + else if (pls->start_time_offset < 0 && > >>>>> + pls->start_time_offset < -playlist_duratio= n) > >>>>> + start_timestamp =3D cur_timestamp; > >>>>> + else if (pls->start_time_offset < 0 && > >>>>> + pls->start_time_offset > -playlist_duratio= n) > >>>>> + start_timestamp =3D cur_timestamp + playlist_durat= ion > + > >>>>> + pls->start_time_offset; > >>>>> + else > >>>>> + start_timestamp =3D cur_timestamp; > >>>>> + > >>>>> + find_timestamp_in_playlist(c, pls, start_timestamp, > >>>> &seq_no, NULL); > >>>>> + av_log(c, AV_LOG_DEBUG, "start_timestamp: %" PRId64 > >>>>> + "cur_timestamp:%" PRId64 > >>>>> + "cur_seq_no:%" PRId64 "\n", > >>>>> + start_timestamp, cur_timestamp= , > >>>> seq_no); > >>>>> + return seq_no; > >>>>> + } > >>>>> } > >>>>> > >>>>> /* Otherwise just start on the first segment. */ > >>>>> @@ -2475,7 +2534,7 @@ static int hls_probe(const AVProbeData *p) > >>>>> #define FLAGS AV_OPT_FLAG_DECODING_PARAM > >>>>> static const AVOption hls_options[] =3D { > >>>>> {"live_start_index", "segment index to start live streams at > >>>> (negative values are from the end)", > >>>>> - OFFSET(live_start_index), AV_OPT_TYPE_INT, {.i64 =3D -3}, > >>>> INT_MIN, INT_MAX, FLAGS}, > >>>>> + OFFSET(live_start_index), AV_OPT_TYPE_INT, {.i64 =3D INT_M= IN}, > >>>> INT_MIN, INT_MAX, FLAGS}, > >>>> This is unnecessary=EF=BC=8C because the default -3 is ok and be usi= ng by > >>>> users from many years ago. > >>>> > >>>>> {"allowed_extensions", "List of file extensions that hls is > allowed > >>>> to access", > >>>>> OFFSET(allowed_extensions), AV_OPT_TYPE_STRING, > >>>>> {.str =3D > >>>> > >> > "3gp,aac,avi,ac3,eac3,flac,mkv,m3u8,m4a,m4s,m4v,mpg,mov,mp2,mp3,mp4,mpeg,= mpegts,ogg,ogv,oga,ts,vob,wav"}, > >>>>> -- > >>>>> 2.24.1 (Apple Git-126) > >>>>> > >>>>> > >>>>> Thanks Steven > >>>> > >>> > >> > <0001-avformat-hls-use-EXT-X-START-instead-of-live_start_i.patch>________= _______________________________________ > >>> 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". > >> > >> Thanks > >> Steven > >> > >> > >> > >> > >> _______________________________________________ > >> 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". > >> > > > ________= _______________________________________ > > 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". > > Thanks > Steven > > > > > _______________________________________________ > 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". > --00000000000060b12b05e2465272 Content-Type: text/x-patch; charset="US-ASCII"; name="v3-0001-avformat-hls-add-EXT-X-START-tag-support-by-allow.patch" Content-Disposition: attachment; filename="v3-0001-avformat-hls-add-EXT-X-START-tag-support-by-allow.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l4tyri5c0 RnJvbSBjZDVkMWYyZDQ1MTQ4ZGM5N2FkMjMyNTJhMTNhNGU5Mzg5OGQyYWMzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBMaSBLYWkgPHdvbGZsZWVrYXlAZ21haWwuY29tPgpEYXRlOiBU aHUsIDIzIEp1biAyMDIyIDAwOjU1OjM4ICswODAwClN1YmplY3Q6IFtQQVRDSCB2M10gYXZmb3Jt YXQvaGxzOiBhZGQgI0VYVC1YLVNUQVJUIHRhZyBzdXBwb3J0IGJ5CiBwcmVmZXJfeF9zdGFydCBv cHQKClNpZ25lZC1vZmYtYnk6IExpIEthaSA8d29sZmxlZWtheUBnbWFpbC5jb20+Ci0tLQogZG9j L2RlbXV4ZXJzLnRleGkgfCAgMyArKysKIGxpYmF2Zm9ybWF0L2hscy5jIHwgNjAgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0KIDIgZmlsZXMgY2hhbmdlZCwg NjEgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kb2MvZGVtdXhl cnMudGV4aSBiL2RvYy9kZW11eGVycy50ZXhpCmluZGV4IGM5NWE5YWU1OTQuLjJiNmRkODZjMmEg MTAwNjQ0Ci0tLSBhL2RvYy9kZW11eGVycy50ZXhpCisrKyBiL2RvYy9kZW11eGVycy50ZXhpCkBA IC0zNzMsNiArMzczLDkgQEAgSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CiBAaXRl bSBsaXZlX3N0YXJ0X2luZGV4CiBzZWdtZW50IGluZGV4IHRvIHN0YXJ0IGxpdmUgc3RyZWFtcyBh dCAobmVnYXRpdmUgdmFsdWVzIGFyZSBmcm9tIHRoZSBlbmQpLgogCitAaXRlbSBwcmVmZXJfeF9z dGFydAorcHJlZmVyIHRvIHVzZSAjRVhULVgtU1RBUlQgaWYgaXQncyBpbiBwbGF5bGlzdCBpbnN0 ZWFkIG9mIGxpdmVfc3RhcnRfaW5kZXguCisKIEBpdGVtIGFsbG93ZWRfZXh0ZW5zaW9ucwogJywn IHNlcGFyYXRlZCBsaXN0IG9mIGZpbGUgZXh0ZW5zaW9ucyB0aGF0IGhscyBpcyBhbGxvd2VkIHRv IGFjY2Vzcy4KIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaGxzLmMgYi9saWJhdmZvcm1hdC9o bHMuYwppbmRleCA4MjA0ZjU1ZGYzLi44NmU1ZDVhNjI5IDEwMDY0NAotLS0gYS9saWJhdmZvcm1h dC9obHMuYworKysgYi9saWJhdmZvcm1hdC9obHMuYwpAQCAtMTIwLDYgKzEyMCw4IEBAIHN0cnVj dCBwbGF5bGlzdCB7CiAgICAgZW51bSBQbGF5bGlzdFR5cGUgdHlwZTsKICAgICBpbnQ2NF90IHRh cmdldF9kdXJhdGlvbjsKICAgICBpbnQ2NF90IHN0YXJ0X3NlcV9ubzsKKyAgICBpbnQgdGltZV9v ZmZzZXRfZmxhZzsKKyAgICBpbnQ2NF90IHN0YXJ0X3RpbWVfb2Zmc2V0OwogICAgIGludCBuX3Nl Z21lbnRzOwogICAgIHN0cnVjdCBzZWdtZW50ICoqc2VnbWVudHM7CiAgICAgaW50IG5lZWRlZDsK QEAgLTIxMSw2ICsyMTMsNyBAQCB0eXBlZGVmIHN0cnVjdCBITFNDb250ZXh0IHsKICAgICBpbnQ2 NF90IGN1cl9zZXFfbm87CiAgICAgaW50IG0zdThfaG9sZF9jb3VudGVyczsKICAgICBpbnQgbGl2 ZV9zdGFydF9pbmRleDsKKyAgICBpbnQgcHJlZmVyX3hfc3RhcnQ7CiAgICAgaW50IGZpcnN0X3Bh Y2tldDsKICAgICBpbnQ2NF90IGZpcnN0X3RpbWVzdGFtcDsKICAgICBpbnQ2NF90IGN1cl90aW1l c3RhbXA7CkBAIC03NDEsNiArNzQ0LDcgQEAgc3RhdGljIGludCBwYXJzZV9wbGF5bGlzdChITFND b250ZXh0ICpjLCBjb25zdCBjaGFyICp1cmwsCiAgICAgc3RydWN0IHNlZ21lbnQgKipwcmV2X3Nl Z21lbnRzID0gTlVMTDsKICAgICBpbnQgcHJldl9uX3NlZ21lbnRzID0gMDsKICAgICBpbnQ2NF90 IHByZXZfc3RhcnRfc2VxX25vID0gLTE7CisgICAgY29uc3QgY2hhciAqcDsKIAogICAgIGlmIChp c19odHRwICYmICFpbiAmJiBjLT5odHRwX3BlcnNpc3RlbnQgJiYgYy0+cGxheWxpc3RfcGIpIHsK ICAgICAgICAgaW4gPSBjLT5wbGF5bGlzdF9wYjsKQEAgLTg4OSw2ICs4OTMsMjAgQEAgc3RhdGlj IGludCBwYXJzZV9wbGF5bGlzdChITFNDb250ZXh0ICpjLCBjb25zdCBjaGFyICp1cmwsCiAgICAg ICAgICAgICAgICAgY3VyX2luaXRfc2VjdGlvbi0+a2V5ID0gTlVMTDsKICAgICAgICAgICAgIH0K IAorICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KGxpbmUsICIjRVhULVgtU1RBUlQ6Iiwg JnB0cikpIHsKKyAgICAgICAgICAgIHJldCA9IGVuc3VyZV9wbGF5bGlzdChjLCAmcGxzLCB1cmwp OworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7 CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZfc3Ryc3RhcnQocHRyLCAiVElNRS1P RkZTRVQ9IiwgJnApKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgb2Zmc2V0ID0gc3RydG9mKHAs IE5VTEwpOworICAgICAgICAgICAgICAgIHBscy0+c3RhcnRfdGltZV9vZmZzZXQgPSBvZmZzZXQg KiBBVl9USU1FX0JBU0U7CisgICAgICAgICAgICAgICAgcGxzLT50aW1lX29mZnNldF9mbGFnID0g MTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmN0eCwg QVZfTE9HX1dBUk5JTkcsICIjRVhULVgtU1RBUlQgdmFsdWUgaXMiCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCwgaXQgd2lsbCBiZSBpZ25v cmVkIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAg IH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQobGluZSwgIiNFWFQtWC1FTkRMSVNUIiwgJnB0cikpIHsK ICAgICAgICAgICAgIGlmIChwbHMpCiAgICAgICAgICAgICAgICAgcGxzLT5maW5pc2hlZCA9IDE7 CkBAIC0xNzIyLDkgKzE3NDAsNDUgQEAgc3RhdGljIGludDY0X3Qgc2VsZWN0X2N1cl9zZXFfbm8o SExTQ29udGV4dCAqYywgc3RydWN0IHBsYXlsaXN0ICpwbHMpCiAgICAgICAgIC8qIElmIHRoaXMg aXMgYSBsaXZlIHN0cmVhbSwgc3RhcnQgbGl2ZV9zdGFydF9pbmRleCBzZWdtZW50cyBmcm9tIHRo ZQogICAgICAgICAgKiBzdGFydCBvciBlbmQgKi8KICAgICAgICAgaWYgKGMtPmxpdmVfc3RhcnRf aW5kZXggPCAwKQotICAgICAgICAgICAgcmV0dXJuIHBscy0+c3RhcnRfc2VxX25vICsgRkZNQVgo cGxzLT5uX3NlZ21lbnRzICsgYy0+bGl2ZV9zdGFydF9pbmRleCwgMCk7CisgICAgICAgICAgICBz ZXFfbm8gPSBwbHMtPnN0YXJ0X3NlcV9ubyArIEZGTUFYKHBscy0+bl9zZWdtZW50cyArCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmxpdmVfc3RhcnRfaW5k ZXgsIDApOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcGxzLT5zdGFydF9zZXFf bm8gKyBGRk1JTihjLT5saXZlX3N0YXJ0X2luZGV4LCBwbHMtPm5fc2VnbWVudHMgLSAxKTsKKyAg ICAgICAgICAgIHNlcV9ubyA9IHBscy0+c3RhcnRfc2VxX25vICsgRkZNSU4oYy0+bGl2ZV9zdGFy dF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxz LT5uX3NlZ21lbnRzIC0gMSk7CisKKyAgICAgICAgLyogSWYgI0VYVC1YLVNUQVJUIGluIHBsYXls aXN0LCBuZWVkIHRvIHJlY2FsY3VsYXRlICovCisgICAgICAgIGlmIChwbHMtPnRpbWVfb2Zmc2V0 X2ZsYWcgJiYgYy0+cHJlZmVyX3hfc3RhcnQpIHsKKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRf dGltZXN0YW1wOworICAgICAgICAgICAgaW50NjRfdCBwbGF5bGlzdF9kdXJhdGlvbiA9IDA7Cisg ICAgICAgICAgICBpbnQ2NF90IGN1cl90aW1lc3RhbXAgPSBjLT5jdXJfdGltZXN0YW1wID09IEFW X05PUFRTX1ZBTFVFID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj LT5jdXJfdGltZXN0YW1wOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBscy0+ bl9zZWdtZW50czsgaSsrKQorICAgICAgICAgICAgICAgIHBsYXlsaXN0X2R1cmF0aW9uICs9IHBs cy0+c2VnbWVudHNbaV0tPmR1cmF0aW9uOworCisgICAgICAgICAgICAvKiBJZiB0aGUgYWJzb2x1 dGUgdmFsdWUgb2YgVElNRS1PRkZTRVQgZXhjZWVkcworICAgICAgICAgICAgICogdGhlIGR1cmF0 aW9uIG9mIHRoZSBwbGF5bGlzdCwgaXQgaW5kaWNhdGVzIGVpdGhlciB0aGUgZW5kIG9mIHRoZQor ICAgICAgICAgICAgICogcGxheWxpc3QgKGlmIHBvc2l0aXZlKSBvciB0aGUgYmVnaW5uaW5nIG9m IHRoZSBwbGF5bGlzdCAoaWYKKyAgICAgICAgICAgICAqIG5lZ2F0aXZlKS4gKi8KKyAgICAgICAg ICAgIGlmIChwbHMtPnN0YXJ0X3RpbWVfb2Zmc2V0ID49MCAmJgorICAgICAgICAgICAgICAgIHBs cy0+c3RhcnRfdGltZV9vZmZzZXQgPiBwbGF5bGlzdF9kdXJhdGlvbikKKyAgICAgICAgICAgICAg ICBzdGFydF90aW1lc3RhbXAgPSBjdXJfdGltZXN0YW1wICsgcGxheWxpc3RfZHVyYXRpb247Cisg ICAgICAgICAgICBlbHNlIGlmIChwbHMtPnN0YXJ0X3RpbWVfb2Zmc2V0ID49IDAgJiYKKyAgICAg ICAgICAgICAgICAgICAgICAgIHBscy0+c3RhcnRfdGltZV9vZmZzZXQgPD0gcGxheWxpc3RfZHVy YXRpb24pCisgICAgICAgICAgICAgICAgc3RhcnRfdGltZXN0YW1wID0gY3VyX3RpbWVzdGFtcCAr IHBscy0+c3RhcnRfdGltZV9vZmZzZXQ7CisgICAgICAgICAgICBlbHNlIGlmIChwbHMtPnN0YXJ0 X3RpbWVfb2Zmc2V0IDwgMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcGxzLT5zdGFydF90 aW1lX29mZnNldCA8IC1wbGF5bGlzdF9kdXJhdGlvbikKKyAgICAgICAgICAgICAgICBzdGFydF90 aW1lc3RhbXAgPSBjdXJfdGltZXN0YW1wOworICAgICAgICAgICAgZWxzZSBpZiAocGxzLT5zdGFy dF90aW1lX29mZnNldCA8IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBscy0+c3RhcnRf dGltZV9vZmZzZXQgPiAtcGxheWxpc3RfZHVyYXRpb24pCisgICAgICAgICAgICAgICAgc3RhcnRf dGltZXN0YW1wID0gY3VyX3RpbWVzdGFtcCArIHBsYXlsaXN0X2R1cmF0aW9uICsKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBscy0+c3RhcnRfdGltZV9vZmZzZXQ7CisgICAg ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RhcnRfdGltZXN0YW1wID0gY3VyX3RpbWVz dGFtcDsKKworICAgICAgICAgICAgZmluZF90aW1lc3RhbXBfaW5fcGxheWxpc3QoYywgcGxzLCBz dGFydF90aW1lc3RhbXAsICZzZXFfbm8sIE5VTEwpOworICAgICAgICB9CisgICAgICAgIHJldHVy biBzZXFfbm87CiAgICAgfQogCiAgICAgLyogT3RoZXJ3aXNlIGp1c3Qgc3RhcnQgb24gdGhlIGZp cnN0IHNlZ21lbnQuICovCkBAIC0yNDc2LDYgKzI1MzAsOCBAQCBzdGF0aWMgaW50IGhsc19wcm9i ZShjb25zdCBBVlByb2JlRGF0YSAqcCkKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBobHNfb3B0aW9u c1tdID0gewogICAgIHsibGl2ZV9zdGFydF9pbmRleCIsICJzZWdtZW50IGluZGV4IHRvIHN0YXJ0 IGxpdmUgc3RyZWFtcyBhdCAobmVnYXRpdmUgdmFsdWVzIGFyZSBmcm9tIHRoZSBlbmQpIiwKICAg ICAgICAgT0ZGU0VUKGxpdmVfc3RhcnRfaW5kZXgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0g LTN9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHU30sCisgICAgeyJwcmVmZXJfeF9zdGFydCIsICJw cmVmZXIgdG8gdXNlICNFWFQtWC1TVEFSVCBpZiBpdCdzIGluIHBsYXlsaXN0IGluc3RlYWQgb2Yg bGl2ZV9zdGFydF9pbmRleCIsCisgICAgICAgIE9GRlNFVChwcmVmZXJfeF9zdGFydCksIEFWX09Q VF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgMSwgRkxBR1N9LAogICAgIHsiYWxsb3dlZF9l eHRlbnNpb25zIiwgIkxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIHRoYXQgaGxzIGlzIGFsbG93ZWQg dG8gYWNjZXNzIiwKICAgICAgICAgT0ZGU0VUKGFsbG93ZWRfZXh0ZW5zaW9ucyksIEFWX09QVF9U WVBFX1NUUklORywKICAgICAgICAgey5zdHIgPSAiM2dwLGFhYyxhdmksYWMzLGVhYzMsZmxhYyxt a3YsbTN1OCxtNGEsbTRzLG00dixtcGcsbW92LG1wMixtcDMsbXA0LG1wZWcsbXBlZ3RzLG9nZyxv Z3Ysb2dhLHRzLHZvYix3YXYifSwKLS0gCjIuMjUuMQoK --00000000000060b12b05e2465272 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". --00000000000060b12b05e2465272--