Message ID | 20220319010333.35910-1-onemda@gmail.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel] avcodec/g723_1_parser: keep avctx channels internally if value is > 0 | expand |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | success | Make fate finished |
andriy/make_aarch64_jetson | success | Make finished |
andriy/make_fate_aarch64_jetson | success | Make fate finished |
andriy/make_armv7_RPi4 | success | Make finished |
andriy/make_fate_armv7_RPi4 | success | Make fate finished |
On 3/18/2022 10:03 PM, Paul B Mahol wrote: > Signed-off-by: Paul B Mahol <onemda@gmail.com> > --- > libavcodec/g723_1_parser.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/libavcodec/g723_1_parser.c b/libavcodec/g723_1_parser.c > index 2ed1a8ab19..03c165ce55 100644 > --- a/libavcodec/g723_1_parser.c > +++ b/libavcodec/g723_1_parser.c > @@ -26,6 +26,7 @@ > > typedef struct G723_1ParseContext { > ParseContext pc; > + int channels; > } G723_1ParseContext; > > static int g723_1_parse(AVCodecParserContext *s1, AVCodecContext *avctx, > @@ -36,8 +37,11 @@ static int g723_1_parse(AVCodecParserContext *s1, AVCodecContext *avctx, > ParseContext *pc = &s->pc; > int next = END_NOT_FOUND; > > + if (avctx->ch_layout.nb_channels > 0) > + s->channels = avctx->ch_layout.nb_channels; > + > if (buf_size > 0) > - next = frame_size[buf[0] & 3] * FFMAX(1, avctx->ch_layout.nb_channels); > + next = frame_size[buf[0] & 3] * FFMAX(1, s->channels); It would be nice to know why this is needed now but not before the channel layout set. > > if (ff_combine_frame(pc, next, &buf, &buf_size) < 0 || !buf_size) { > *poutbuf = NULL;
On 3/18/2022 10:07 PM, James Almer wrote: > On 3/18/2022 10:03 PM, Paul B Mahol wrote: >> Signed-off-by: Paul B Mahol <onemda@gmail.com> >> --- >> libavcodec/g723_1_parser.c | 6 +++++- >> 1 file changed, 5 insertions(+), 1 deletion(-) >> >> diff --git a/libavcodec/g723_1_parser.c b/libavcodec/g723_1_parser.c >> index 2ed1a8ab19..03c165ce55 100644 >> --- a/libavcodec/g723_1_parser.c >> +++ b/libavcodec/g723_1_parser.c >> @@ -26,6 +26,7 @@ >> typedef struct G723_1ParseContext { >> ParseContext pc; >> + int channels; >> } G723_1ParseContext; >> static int g723_1_parse(AVCodecParserContext *s1, AVCodecContext >> *avctx, >> @@ -36,8 +37,11 @@ static int g723_1_parse(AVCodecParserContext *s1, >> AVCodecContext *avctx, >> ParseContext *pc = &s->pc; >> int next = END_NOT_FOUND; >> + if (avctx->ch_layout.nb_channels > 0) >> + s->channels = avctx->ch_layout.nb_channels; >> + >> if (buf_size > 0) >> - next = frame_size[buf[0] & 3] * FFMAX(1, >> avctx->ch_layout.nb_channels); >> + next = frame_size[buf[0] & 3] * FFMAX(1, s->channels); > > It would be nice to know why this is needed now but not before the > channel layout set. 327efa66331ebdc0087c6b656059a8df2f404019 introduced the regression. The demux code relies on sti->avctx to retain codec parameters after an avcodec_close() call, and it did for ch_layout before that commit (avcodec_close() calls av_opt_free(), which is now uninitializing it). I can't revert that commit because it's obviously correct, so the two options are to either make the demux code keep a copy of ch_layout and put it back after avcodec_close(), or do that within avcodec_close() since it's not meant to clear codec parameters to begin with. I'm leaning towards doing the latter. > >> if (ff_combine_frame(pc, next, &buf, &buf_size) < 0 || !buf_size) { >> *poutbuf = NULL;
diff --git a/libavcodec/g723_1_parser.c b/libavcodec/g723_1_parser.c index 2ed1a8ab19..03c165ce55 100644 --- a/libavcodec/g723_1_parser.c +++ b/libavcodec/g723_1_parser.c @@ -26,6 +26,7 @@ typedef struct G723_1ParseContext { ParseContext pc; + int channels; } G723_1ParseContext; static int g723_1_parse(AVCodecParserContext *s1, AVCodecContext *avctx, @@ -36,8 +37,11 @@ static int g723_1_parse(AVCodecParserContext *s1, AVCodecContext *avctx, ParseContext *pc = &s->pc; int next = END_NOT_FOUND; + if (avctx->ch_layout.nb_channels > 0) + s->channels = avctx->ch_layout.nb_channels; + if (buf_size > 0) - next = frame_size[buf[0] & 3] * FFMAX(1, avctx->ch_layout.nb_channels); + next = frame_size[buf[0] & 3] * FFMAX(1, s->channels); if (ff_combine_frame(pc, next, &buf, &buf_size) < 0 || !buf_size) { *poutbuf = NULL;
Signed-off-by: Paul B Mahol <onemda@gmail.com> --- libavcodec/g723_1_parser.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)