Message ID | 20200522165642.8766-1-anton@khirnov.net |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel] lavc/decode: do not use a context variable for function-local data | expand |
Context | Check | Description |
---|---|---|
andriy/default | pending | |
andriy/make | success | Make finished |
andriy/make_fate | success | Make fate finished |
On 5/22/2020 1:56 PM, Anton Khirnov wrote: > --- > libavcodec/decode.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/libavcodec/decode.c b/libavcodec/decode.c > index f3327d74af..dbecdf3f46 100644 > --- a/libavcodec/decode.c > +++ b/libavcodec/decode.c > @@ -586,6 +586,7 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame) > int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt) > { > AVCodecInternal *avci = avctx->internal; > + AVPacket buffer_pkt = { NULL }; > int ret; > > if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec)) > @@ -597,16 +598,15 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke > if (avpkt && !avpkt->size && avpkt->data) > return AVERROR(EINVAL); > > - av_packet_unref(avci->buffer_pkt); > if (avpkt && (avpkt->data || avpkt->side_data_elems)) { > - ret = av_packet_ref(avci->buffer_pkt, avpkt); > + ret = av_packet_ref(&buffer_pkt, avpkt); > if (ret < 0) > return ret; > } > > - ret = av_bsf_send_packet(avci->bsf, avci->buffer_pkt); > + ret = av_bsf_send_packet(avci->bsf, &buffer_pkt); > if (ret < 0) { > - av_packet_unref(avci->buffer_pkt); > + av_packet_unref(&buffer_pkt); > return ret; > } What's the gain here? You're not removing the context variable since it's used in the encode framework as well, and you're introducing a stack AVPacket (that, while harmless, is not even properly initialized).
On Fri, May 22, 2020 at 02:32:07PM -0300, James Almer wrote: > On 5/22/2020 1:56 PM, Anton Khirnov wrote: > > --- > > libavcodec/decode.c | 8 ++++---- > > 1 file changed, 4 insertions(+), 4 deletions(-) > > > > diff --git a/libavcodec/decode.c b/libavcodec/decode.c > > index f3327d74af..dbecdf3f46 100644 > > --- a/libavcodec/decode.c > > +++ b/libavcodec/decode.c > > @@ -586,6 +586,7 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame) > > int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt) > > { > > AVCodecInternal *avci = avctx->internal; > > + AVPacket buffer_pkt = { NULL }; > > int ret; > > > > if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec)) > > @@ -597,16 +598,15 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke > > if (avpkt && !avpkt->size && avpkt->data) > > return AVERROR(EINVAL); > > > > - av_packet_unref(avci->buffer_pkt); > > if (avpkt && (avpkt->data || avpkt->side_data_elems)) { > > - ret = av_packet_ref(avci->buffer_pkt, avpkt); > > + ret = av_packet_ref(&buffer_pkt, avpkt); > > if (ret < 0) > > return ret; > > } > > > > - ret = av_bsf_send_packet(avci->bsf, avci->buffer_pkt); > > + ret = av_bsf_send_packet(avci->bsf, &buffer_pkt); > > if (ret < 0) { > > - av_packet_unref(avci->buffer_pkt); > > + av_packet_unref(&buffer_pkt); > > return ret; > > } > > What's the gain here? You're not removing the context variable since > it's used in the encode framework as well, and you're introducing a > stack AVPacket (that, while harmless, is not even properly initialized). It would be nice if we could avoid all such code, so that we can extend AVPacket like other structs without Major bumping thx [...]
On 5/22/2020 4:22 PM, Michael Niedermayer wrote: > On Fri, May 22, 2020 at 02:32:07PM -0300, James Almer wrote: >> On 5/22/2020 1:56 PM, Anton Khirnov wrote: >>> --- >>> libavcodec/decode.c | 8 ++++---- >>> 1 file changed, 4 insertions(+), 4 deletions(-) >>> >>> diff --git a/libavcodec/decode.c b/libavcodec/decode.c >>> index f3327d74af..dbecdf3f46 100644 >>> --- a/libavcodec/decode.c >>> +++ b/libavcodec/decode.c >>> @@ -586,6 +586,7 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame) >>> int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt) >>> { >>> AVCodecInternal *avci = avctx->internal; >>> + AVPacket buffer_pkt = { NULL }; >>> int ret; >>> >>> if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec)) >>> @@ -597,16 +598,15 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke >>> if (avpkt && !avpkt->size && avpkt->data) >>> return AVERROR(EINVAL); >>> >>> - av_packet_unref(avci->buffer_pkt); >>> if (avpkt && (avpkt->data || avpkt->side_data_elems)) { >>> - ret = av_packet_ref(avci->buffer_pkt, avpkt); >>> + ret = av_packet_ref(&buffer_pkt, avpkt); >>> if (ret < 0) >>> return ret; >>> } >>> >>> - ret = av_bsf_send_packet(avci->bsf, avci->buffer_pkt); >>> + ret = av_bsf_send_packet(avci->bsf, &buffer_pkt); >>> if (ret < 0) { >>> - av_packet_unref(avci->buffer_pkt); >>> + av_packet_unref(&buffer_pkt); >>> return ret; >>> } >> >> What's the gain here? You're not removing the context variable since >> it's used in the encode framework as well, and you're introducing a > >> stack AVPacket (that, while harmless, is not even properly initialized). > > It would be nice if we could avoid all such code, so that we can extend > AVPacket like other structs without Major bumping Yes, some relatively recent commits went in the direction of removing as much AVPacket on stack/heap usage as possible precisely to remove sizeof(AVPacket) from the ABI, but at least within lavc it's not a problem. > > thx > > [...] > > > _______________________________________________ > 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". >
Quoting James Almer (2020-05-22 19:32:07) > On 5/22/2020 1:56 PM, Anton Khirnov wrote: > > --- > > libavcodec/decode.c | 8 ++++---- > > 1 file changed, 4 insertions(+), 4 deletions(-) > > > > diff --git a/libavcodec/decode.c b/libavcodec/decode.c > > index f3327d74af..dbecdf3f46 100644 > > --- a/libavcodec/decode.c > > +++ b/libavcodec/decode.c > > @@ -586,6 +586,7 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame) > > int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt) > > { > > AVCodecInternal *avci = avctx->internal; > > + AVPacket buffer_pkt = { NULL }; > > int ret; > > > > if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec)) > > @@ -597,16 +598,15 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke > > if (avpkt && !avpkt->size && avpkt->data) > > return AVERROR(EINVAL); > > > > - av_packet_unref(avci->buffer_pkt); > > if (avpkt && (avpkt->data || avpkt->side_data_elems)) { > > - ret = av_packet_ref(avci->buffer_pkt, avpkt); > > + ret = av_packet_ref(&buffer_pkt, avpkt); > > if (ret < 0) > > return ret; > > } > > > > - ret = av_bsf_send_packet(avci->bsf, avci->buffer_pkt); > > + ret = av_bsf_send_packet(avci->bsf, &buffer_pkt); > > if (ret < 0) { > > - av_packet_unref(avci->buffer_pkt); > > + av_packet_unref(&buffer_pkt); > > return ret; > > } > > What's the gain here? You're not removing the context variable since > it's used in the encode framework as well, and you're introducing a > stack AVPacket (that, while harmless, is not even properly initialized). The gain is clarity/readability. A context variable suggests it is used to some longer-term state. This change makes it clear that the packets is only used within this function. Even the name is rather confusing, since the packet does not get buffered there.
On Fri, May 22, 2020 at 04:51:05PM -0300, James Almer wrote: > On 5/22/2020 4:22 PM, Michael Niedermayer wrote: > > On Fri, May 22, 2020 at 02:32:07PM -0300, James Almer wrote: > >> On 5/22/2020 1:56 PM, Anton Khirnov wrote: > >>> --- > >>> libavcodec/decode.c | 8 ++++---- > >>> 1 file changed, 4 insertions(+), 4 deletions(-) > >>> > >>> diff --git a/libavcodec/decode.c b/libavcodec/decode.c > >>> index f3327d74af..dbecdf3f46 100644 > >>> --- a/libavcodec/decode.c > >>> +++ b/libavcodec/decode.c > >>> @@ -586,6 +586,7 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame) > >>> int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt) > >>> { > >>> AVCodecInternal *avci = avctx->internal; > >>> + AVPacket buffer_pkt = { NULL }; > >>> int ret; > >>> > >>> if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec)) > >>> @@ -597,16 +598,15 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke > >>> if (avpkt && !avpkt->size && avpkt->data) > >>> return AVERROR(EINVAL); > >>> > >>> - av_packet_unref(avci->buffer_pkt); > >>> if (avpkt && (avpkt->data || avpkt->side_data_elems)) { > >>> - ret = av_packet_ref(avci->buffer_pkt, avpkt); > >>> + ret = av_packet_ref(&buffer_pkt, avpkt); > >>> if (ret < 0) > >>> return ret; > >>> } > >>> > >>> - ret = av_bsf_send_packet(avci->bsf, avci->buffer_pkt); > >>> + ret = av_bsf_send_packet(avci->bsf, &buffer_pkt); > >>> if (ret < 0) { > >>> - av_packet_unref(avci->buffer_pkt); > >>> + av_packet_unref(&buffer_pkt); > >>> return ret; > >>> } > >> > >> What's the gain here? You're not removing the context variable since > >> it's used in the encode framework as well, and you're introducing a > > > >> stack AVPacket (that, while harmless, is not even properly initialized). > > > > It would be nice if we could avoid all such code, so that we can extend > > AVPacket like other structs without Major bumping > > Yes, some relatively recent commits went in the direction of removing as > much AVPacket on stack/heap usage as possible precisely to remove > sizeof(AVPacket) from the ABI, but at least within lavc it's not a problem. sizeof() may be ok in libavcodec (though still IMHO not great style) the other issue is NULL initialization. We may want to add new fields which need to be initialized to a non 0 default. timestamps and AV_NOPTS_VALUE come to mind as examples of such fields thx [...]
diff --git a/libavcodec/decode.c b/libavcodec/decode.c index f3327d74af..dbecdf3f46 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -586,6 +586,7 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame) int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt) { AVCodecInternal *avci = avctx->internal; + AVPacket buffer_pkt = { NULL }; int ret; if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec)) @@ -597,16 +598,15 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke if (avpkt && !avpkt->size && avpkt->data) return AVERROR(EINVAL); - av_packet_unref(avci->buffer_pkt); if (avpkt && (avpkt->data || avpkt->side_data_elems)) { - ret = av_packet_ref(avci->buffer_pkt, avpkt); + ret = av_packet_ref(&buffer_pkt, avpkt); if (ret < 0) return ret; } - ret = av_bsf_send_packet(avci->bsf, avci->buffer_pkt); + ret = av_bsf_send_packet(avci->bsf, &buffer_pkt); if (ret < 0) { - av_packet_unref(avci->buffer_pkt); + av_packet_unref(&buffer_pkt); return ret; }