diff mbox series

[FFmpeg-devel,crop,support,for,matroska,demuxer,V4,1/3] libavcodec: Add crop related fields to structure AVCodecContext and AVCodecParameters.

Message ID 20221220153711.1831-1-Dmitriy.Ovchinnikov@amd.com
State New
Headers show
Series [FFmpeg-devel,crop,support,for,matroska,demuxer,V4,1/3] libavcodec: Add crop related fields to structure AVCodecContext and AVCodecParameters. | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Dmitrii Ovchinnikov Dec. 20, 2022, 3:37 p.m. UTC
From: Dmitrii Ovchinnikov <ovchinnikov.dmitrii@gmail.com>

---
 libavcodec/avcodec.h       | 35 +++++++++++++++++++++++++++++++++++
 libavcodec/codec_par.h     |  8 ++++++++
 libavcodec/options_table.h |  4 ++++
 3 files changed, 47 insertions(+)
diff mbox series

Patch

diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 3edd8e2636..57b340c24d 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -380,6 +380,19 @@  typedef struct RcOverride{
  */
 #define AV_GET_ENCODE_BUFFER_FLAG_REF (1 << 0)
 
+/**
+* Video decoding only. Certain container support cropping, meaning that
+* only a sub-rectangle of the decoded frame is intended for display.
+* Certain codec supports cropping as well.This option controls how
+* cropping is handled by libavcodec when  container cropping and
+* codec cropping exist.
+*/
+enum CONTAINER_CROPPING_POLICY_TYPE {
+    FF_CONTAINER_CROPPING_IGNORE = 0,
+    FF_CONTAINER_CROPPING_ADDITION,
+    FF_CONTAINER_CROPPING_OVERWRITE
+};
+
 struct AVCodecInternal;
 
 /**
@@ -2057,6 +2070,28 @@  typedef struct AVCodecContext {
      *             The decoder can then override during decoding as needed.
      */
     AVChannelLayout ch_layout;
+
+    /* When set to 1 (the default), libavcodec will apply container cropping
+     * to codec cropping additionally.
+     *
+     * When set to 2, libavcodec will use container cropping to overwrite
+     * codec cropping (the final cropping uses container cropping parameters)
+     *
+     * When set to 0, libavcodec will ignore container cropping parameters
+     * (the final cropping uses codec cropping parameters)
+     *
+     * This field works with "apply_cropping". Only if apply_cropping is 1, this
+     * field works
+     */
+    enum CONTAINER_CROPPING_POLICY_TYPE container_apply_cropping;
+
+    /**
+     * The cropping parameters from container.
+     */
+    int container_crop_top;
+    int container_crop_left;
+    int container_crop_bottom;
+    int container_crop_right;
 } AVCodecContext;
 
 /**
diff --git a/libavcodec/codec_par.h b/libavcodec/codec_par.h
index f51d27c590..cc0695689c 100644
--- a/libavcodec/codec_par.h
+++ b/libavcodec/codec_par.h
@@ -211,6 +211,14 @@  typedef struct AVCodecParameters {
      * Audio only. The channel layout and number of channels.
      */
     AVChannelLayout ch_layout;
+
+    /**
+     * The cropping parameters from container.
+     */
+    int container_crop_top;
+    int container_crop_left;
+    int container_crop_bottom;
+    int container_crop_right;
 } AVCodecParameters;
 
 /**
diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
index cd02f5096f..fd1ef21f90 100644
--- a/libavcodec/options_table.h
+++ b/libavcodec/options_table.h
@@ -401,6 +401,10 @@  static const AVOption avcodec_options[] = {
 {"allow_profile_mismatch", "attempt to decode anyway if HW accelerated decoder's supported profiles do not exactly match the stream", 0, AV_OPT_TYPE_CONST, {.i64 = AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH }, INT_MIN, INT_MAX, V | D, "hwaccel_flags"},
 {"extra_hw_frames", "Number of extra hardware frames to allocate for the user", OFFSET(extra_hw_frames), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, V|D },
 {"discard_damaged_percentage", "Percentage of damaged samples to discard a frame", OFFSET(discard_damaged_percentage), AV_OPT_TYPE_INT, {.i64 = 95 }, 0, 100, V|D },
+{ "container_apply_cropping", "ploicy using container cropping parameters", OFFSET(container_apply_cropping), AV_OPT_TYPE_INT64, {.i64 = FF_CONTAINER_CROPPING_ADDITION }, 0, 2, V | D, "container_apply_cropping" },
+{ "ignore",    "ignore container cropping",                                           0, AV_OPT_TYPE_CONST, {.i64 = FF_CONTAINER_CROPPING_IGNORE },    0, 0, V | D, "container_apply_cropping" },
+{ "addition",  "apply container cropping additionally to elementary stream cropping", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CONTAINER_CROPPING_ADDITION },  0, 0, V | D, "container_apply_cropping" },
+{ "overwrite", "use container cropping to overwrite elementary stream cropping",      0, AV_OPT_TYPE_CONST, {.i64 = FF_CONTAINER_CROPPING_OVERWRITE }, 0, 0, V | D, "container_apply_cropping" },
 {NULL},
 };