This commit ends using separate packets for in- and output. Instead, the input is read directly into the packet destined for output via ff_bsf_get_packet_ref() and only the buffer-related fields are modified; the others are not touched.
Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@gmail.com> --- libavcodec/mjpeg2jpeg_bsf.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/libavcodec/mjpeg2jpeg_bsf.c b/libavcodec/mjpeg2jpeg_bsf.c index b30f391bf9..dc729cfd95 100644 --- a/libavcodec/mjpeg2jpeg_bsf.c +++ b/libavcodec/mjpeg2jpeg_bsf.c @@ -77,40 +77,40 @@ static uint8_t *append_dht_segment(uint8_t *buf) return buf; } -static int mjpeg2jpeg_filter(AVBSFContext *ctx, AVPacket *out) +static int mjpeg2jpeg_filter(AVBSFContext *ctx, AVPacket *pkt) { - AVPacket *in; + AVBufferRef *out = NULL; int ret = 0; int input_skip, output_size; uint8_t *output; - ret = ff_bsf_get_packet(ctx, &in); + ret = ff_bsf_get_packet_ref(ctx, pkt); if (ret < 0) return ret; - if (in->size < 12) { + if (pkt->size < 12) { av_log(ctx, AV_LOG_ERROR, "input is truncated\n"); ret = AVERROR_INVALIDDATA; goto fail; } - if (AV_RB16(in->data) != 0xffd8) { + if (AV_RB16(pkt->data) != 0xffd8) { av_log(ctx, AV_LOG_ERROR, "input is not MJPEG\n"); ret = AVERROR_INVALIDDATA; goto fail; } - if (in->data[2] == 0xff && in->data[3] == APP0) { - input_skip = (in->data[4] << 8) + in->data[5] + 4; + if (pkt->data[2] == 0xff && pkt->data[3] == APP0) { + input_skip = AV_RB16(pkt->data + 4) + 4; } else { input_skip = 2; } - if (in->size < input_skip) { + if (pkt->size < input_skip) { av_log(ctx, AV_LOG_ERROR, "input is truncated\n"); ret = AVERROR_INVALIDDATA; goto fail; } - output_size = in->size - input_skip + + output_size = pkt->size - input_skip + sizeof(jpeg_header) + dht_segment_size; - ret = av_new_packet(out, output_size); + ret = ff_buffer_padded_realloc(&out, output_size); if (ret < 0) goto fail; @@ -118,16 +118,13 @@ static int mjpeg2jpeg_filter(AVBSFContext *ctx, AVPacket *out) output = append(output, jpeg_header, sizeof(jpeg_header)); output = append_dht_segment(output); - output = append(output, in->data + input_skip, in->size - input_skip); + output = append(output, pkt->data + input_skip, pkt->size - input_skip); - ret = av_packet_copy_props(out, in); - if (ret < 0) - goto fail; + ff_packet_replace_buffer(pkt, out); fail: if (ret < 0) - av_packet_unref(out); - av_packet_free(&in); + av_packet_unref(pkt); return ret; } -- 2.20.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".