[FFmpeg-devel] [crop support for matroska demuxer 2/3] libavcodec: Public code to support container crop
OvchinnikovDmitrii
ovchinnikov.dmitrii at gmail.com
Sat Oct 1 09:13:40 EEST 2022
Support both simple and receive_frame api
The container crop information is applied additional to frame crop information
---
libavcodec/codec_par.c | 8 ++++++++
libavcodec/decode.c | 20 ++++++++++++++++++++
2 files changed, 28 insertions(+)
diff --git a/libavcodec/codec_par.c b/libavcodec/codec_par.c
index abda649aa8..f74964a817 100644
--- a/libavcodec/codec_par.c
+++ b/libavcodec/codec_par.c
@@ -118,6 +118,10 @@ int avcodec_parameters_from_context(AVCodecParameters *par,
par->format = codec->pix_fmt;
par->width = codec->width;
par->height = codec->height;
+ par->crop_top = codec->crop_top;
+ par->crop_left = codec->crop_left;
+ par->crop_bottom = codec->crop_bottom;
+ par->crop_right = codec->crop_right;
par->field_order = codec->field_order;
par->color_range = codec->color_range;
par->color_primaries = codec->color_primaries;
@@ -199,6 +203,10 @@ int avcodec_parameters_to_context(AVCodecContext *codec,
codec->pix_fmt = par->format;
codec->width = par->width;
codec->height = par->height;
+ codec->crop_top = par->crop_top;
+ codec->crop_left = par->crop_left;
+ codec->crop_bottom = par->crop_bottom;
+ codec->crop_right = par->crop_right;
codec->field_order = par->field_order;
codec->color_range = par->color_range;
codec->color_primaries = par->color_primaries;
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 6be2d3d6ed..548225c904 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -324,6 +324,16 @@ static inline int decode_simple_internal(AVCodecContext *avctx, AVFrame *frame,
emms_c();
actual_got_frame = got_frame;
+ /* crop for simple api mode. apply additional container crop info to frame */
+ if (avctx->codec->type == AVMEDIA_TYPE_VIDEO) {
+ if (avctx->crop_top != 0 || avctx->crop_left != 0 || avctx->crop_right != 0 || avctx->crop_bottom != 0){
+ frame->crop_top += avctx->crop_top;
+ frame->crop_left += avctx->crop_left;
+ frame->crop_right += avctx->crop_right;
+ frame->crop_bottom += avctx->crop_bottom;
+ }
+ }
+
if (avctx->codec->type == AVMEDIA_TYPE_VIDEO) {
if (frame->flags & AV_FRAME_FLAG_DISCARD)
got_frame = 0;
@@ -707,6 +717,16 @@ int ff_decode_receive_frame(AVCodecContext *avctx, AVFrame *frame)
if (avci->buffer_frame->buf[0]) {
av_frame_move_ref(frame, avci->buffer_frame);
+
+ /* crop for receive_frame api mode. apply additional container crop info to frame */
+ if (avctx->codec->type == AVMEDIA_TYPE_VIDEO) {
+ if (avctx->crop_top != 0 || avctx->crop_left != 0 || avctx->crop_right != 0 || avctx->crop_bottom != 0){
+ frame->crop_top += avctx->crop_top;
+ frame->crop_left += avctx->crop_left;
+ frame->crop_right += avctx->crop_right;
+ frame->crop_bottom += avctx->crop_bottom;
+ }
+ }
} else {
ret = decode_receive_frame_internal(avctx, frame);
if (ret < 0)
--
2.30.0.windows.2
More information about the ffmpeg-devel
mailing list