Message ID | 20200331080308.3472-1-matthieu.bouron@gmail.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel] avcodec/mediacodec_common: use MediaFormat to probe frame color characteristics | expand |
Context | Check | Description |
---|---|---|
andriy/ffmpeg-patchwork | success | Make fate finished |
On Tue, Mar 31, 2020 at 10:03:08AM +0200, Matthieu Bouron wrote: > --- > libavcodec/mediacodecdec_common.c | 100 ++++++++++++++++++++++++++++++ > 1 file changed, 100 insertions(+) > > diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c > index f0752fa6261..404ed282275 100644 > --- a/libavcodec/mediacodecdec_common.c > +++ b/libavcodec/mediacodecdec_common.c > @@ -85,6 +85,85 @@ > #define OUTPUT_DEQUEUE_TIMEOUT_US 8000 > #define OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US 1000000 > > +enum { > + COLOR_RANGE_FULL = 0x1, > + COLOR_RANGE_LIMITED = 0x2, > +}; > + > +static enum AVColorRange mcdec_get_color_range(int color_range) > +{ > + switch (color_range) { > + case COLOR_RANGE_FULL: > + return AVCOL_RANGE_JPEG; > + case COLOR_RANGE_LIMITED: > + return AVCOL_RANGE_MPEG; > + default: > + return AVCOL_RANGE_UNSPECIFIED; > + } > +} > + > +enum { > + COLOR_STANDARD_BT709 = 0x1, > + COLOR_STANDARD_BT601_PAL = 0x2, > + COLOR_STANDARD_BT601_NTSC = 0x4, > + COLOR_STANDARD_BT2020 = 0x6, > +}; > + > +static enum AVColorSpace mcdec_get_color_space(int color_standard) > +{ > + switch (color_standard) { > + case COLOR_STANDARD_BT709: > + return AVCOL_SPC_BT709; > + case COLOR_STANDARD_BT601_PAL: > + return AVCOL_SPC_BT470BG; > + case COLOR_STANDARD_BT601_NTSC: > + return AVCOL_SPC_SMPTE170M; > + case COLOR_STANDARD_BT2020: > + return AVCOL_SPC_BT2020_NCL; > + default: > + return AVCOL_SPC_UNSPECIFIED; > + } > +} > + > +static enum AVColorPrimaries mcdec_get_color_pri(int color_standard) > +{ > + switch (color_standard) { > + case COLOR_STANDARD_BT709: > + return AVCOL_PRI_BT709; > + case COLOR_STANDARD_BT601_PAL: > + return AVCOL_PRI_BT470BG; > + case COLOR_STANDARD_BT601_NTSC: > + return AVCOL_PRI_SMPTE170M; > + case COLOR_STANDARD_BT2020: > + return AVCOL_PRI_BT2020; > + default: > + return AVCOL_PRI_UNSPECIFIED; > + } > +} > + > +enum { > + COLOR_TRANSFER_LINEAR = 0x1, > + COLOR_TRANSFER_SDR_VIDEO = 0x3, > + COLOR_TRANSFER_ST2084 = 0x6, > + COLOR_TRANSFER_HLG = 0x7, > +}; > + > +static enum AVColorTransferCharacteristic mcdec_get_color_trc(int color_transfer) > +{ > + switch (color_transfer) { > + case COLOR_TRANSFER_LINEAR: > + return AVCOL_TRC_LINEAR; > + case COLOR_TRANSFER_SDR_VIDEO: > + return AVCOL_TRC_SMPTE170M; > + case COLOR_TRANSFER_ST2084: > + return AVCOL_TRC_SMPTEST2084; > + case COLOR_TRANSFER_HLG: > + return AVCOL_TRC_ARIB_STD_B67; > + default: > + return AVCOL_TRC_UNSPECIFIED; > + } > +} > + > enum { > COLOR_FormatYUV420Planar = 0x13, > COLOR_FormatYUV420SemiPlanar = 0x15, > @@ -220,6 +299,10 @@ FF_DISABLE_DEPRECATION_WARNINGS > FF_ENABLE_DEPRECATION_WARNINGS > #endif > frame->pkt_dts = AV_NOPTS_VALUE; > + frame->color_range = avctx->color_range; > + frame->color_primaries = avctx->color_primaries; > + frame->color_trc = avctx->color_trc; > + frame->colorspace = avctx->colorspace; > > buffer = av_mallocz(sizeof(AVMediaCodecBuffer)); > if (!buffer) { > @@ -368,6 +451,9 @@ static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecConte > int ret = 0; > int width = 0; > int height = 0; > + int color_range = 0; > + int color_standard = 0; > + int color_transfer = 0; > char *format = NULL; > > if (!s->format) { > @@ -426,6 +512,20 @@ static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecConte > ff_set_sar(avctx, sar); > } > > + AMEDIAFORMAT_GET_INT32(color_range, "color-range", 0); > + if (color_range) > + avctx->color_range = mcdec_get_color_range(color_range); > + > + AMEDIAFORMAT_GET_INT32(color_standard, "color-standard", 0); > + if (color_standard) { > + avctx->colorspace = mcdec_get_color_space(color_standard); > + avctx->color_primaries = mcdec_get_color_pri(color_standard); > + } > + > + AMEDIAFORMAT_GET_INT32(color_transfer, "color-transfer", 0); > + if (color_transfer) > + avctx->color_trc = mcdec_get_color_trc(color_transfer); > + > av_log(avctx, AV_LOG_INFO, > "Output crop parameters top=%d bottom=%d left=%d right=%d, " > "resulting dimensions width=%d height=%d\n", > -- > 2.26.0 > Ping.
On Sat, May 09, 2020 at 09:45:05AM +0200, Matthieu Bouron wrote: > On Tue, Mar 31, 2020 at 10:03:08AM +0200, Matthieu Bouron wrote: > > --- > > libavcodec/mediacodecdec_common.c | 100 ++++++++++++++++++++++++++++++ > > 1 file changed, 100 insertions(+) > > > > diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c > > index f0752fa6261..404ed282275 100644 > > --- a/libavcodec/mediacodecdec_common.c > > +++ b/libavcodec/mediacodecdec_common.c > > @@ -85,6 +85,85 @@ > > #define OUTPUT_DEQUEUE_TIMEOUT_US 8000 > > #define OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US 1000000 > > > > +enum { > > + COLOR_RANGE_FULL = 0x1, > > + COLOR_RANGE_LIMITED = 0x2, > > +}; > > + > > +static enum AVColorRange mcdec_get_color_range(int color_range) > > +{ > > + switch (color_range) { > > + case COLOR_RANGE_FULL: > > + return AVCOL_RANGE_JPEG; > > + case COLOR_RANGE_LIMITED: > > + return AVCOL_RANGE_MPEG; > > + default: > > + return AVCOL_RANGE_UNSPECIFIED; > > + } > > +} > > + > > +enum { > > + COLOR_STANDARD_BT709 = 0x1, > > + COLOR_STANDARD_BT601_PAL = 0x2, > > + COLOR_STANDARD_BT601_NTSC = 0x4, > > + COLOR_STANDARD_BT2020 = 0x6, > > +}; > > + > > +static enum AVColorSpace mcdec_get_color_space(int color_standard) > > +{ > > + switch (color_standard) { > > + case COLOR_STANDARD_BT709: > > + return AVCOL_SPC_BT709; > > + case COLOR_STANDARD_BT601_PAL: > > + return AVCOL_SPC_BT470BG; > > + case COLOR_STANDARD_BT601_NTSC: > > + return AVCOL_SPC_SMPTE170M; > > + case COLOR_STANDARD_BT2020: > > + return AVCOL_SPC_BT2020_NCL; > > + default: > > + return AVCOL_SPC_UNSPECIFIED; > > + } > > +} > > + > > +static enum AVColorPrimaries mcdec_get_color_pri(int color_standard) > > +{ > > + switch (color_standard) { > > + case COLOR_STANDARD_BT709: > > + return AVCOL_PRI_BT709; > > + case COLOR_STANDARD_BT601_PAL: > > + return AVCOL_PRI_BT470BG; > > + case COLOR_STANDARD_BT601_NTSC: > > + return AVCOL_PRI_SMPTE170M; > > + case COLOR_STANDARD_BT2020: > > + return AVCOL_PRI_BT2020; > > + default: > > + return AVCOL_PRI_UNSPECIFIED; > > + } > > +} > > + > > +enum { > > + COLOR_TRANSFER_LINEAR = 0x1, > > + COLOR_TRANSFER_SDR_VIDEO = 0x3, > > + COLOR_TRANSFER_ST2084 = 0x6, > > + COLOR_TRANSFER_HLG = 0x7, > > +}; > > + > > +static enum AVColorTransferCharacteristic mcdec_get_color_trc(int color_transfer) > > +{ > > + switch (color_transfer) { > > + case COLOR_TRANSFER_LINEAR: > > + return AVCOL_TRC_LINEAR; > > + case COLOR_TRANSFER_SDR_VIDEO: > > + return AVCOL_TRC_SMPTE170M; > > + case COLOR_TRANSFER_ST2084: > > + return AVCOL_TRC_SMPTEST2084; > > + case COLOR_TRANSFER_HLG: > > + return AVCOL_TRC_ARIB_STD_B67; > > + default: > > + return AVCOL_TRC_UNSPECIFIED; > > + } > > +} > > + > > enum { > > COLOR_FormatYUV420Planar = 0x13, > > COLOR_FormatYUV420SemiPlanar = 0x15, > > @@ -220,6 +299,10 @@ FF_DISABLE_DEPRECATION_WARNINGS > > FF_ENABLE_DEPRECATION_WARNINGS > > #endif > > frame->pkt_dts = AV_NOPTS_VALUE; > > + frame->color_range = avctx->color_range; > > + frame->color_primaries = avctx->color_primaries; > > + frame->color_trc = avctx->color_trc; > > + frame->colorspace = avctx->colorspace; > > > > buffer = av_mallocz(sizeof(AVMediaCodecBuffer)); > > if (!buffer) { > > @@ -368,6 +451,9 @@ static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecConte > > int ret = 0; > > int width = 0; > > int height = 0; > > + int color_range = 0; > > + int color_standard = 0; > > + int color_transfer = 0; > > char *format = NULL; > > > > if (!s->format) { > > @@ -426,6 +512,20 @@ static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecConte > > ff_set_sar(avctx, sar); > > } > > > > + AMEDIAFORMAT_GET_INT32(color_range, "color-range", 0); > > + if (color_range) > > + avctx->color_range = mcdec_get_color_range(color_range); > > + > > + AMEDIAFORMAT_GET_INT32(color_standard, "color-standard", 0); > > + if (color_standard) { > > + avctx->colorspace = mcdec_get_color_space(color_standard); > > + avctx->color_primaries = mcdec_get_color_pri(color_standard); > > + } > > + > > + AMEDIAFORMAT_GET_INT32(color_transfer, "color-transfer", 0); > > + if (color_transfer) > > + avctx->color_trc = mcdec_get_color_trc(color_transfer); > > + > > av_log(avctx, AV_LOG_INFO, > > "Output crop parameters top=%d bottom=%d left=%d right=%d, " > > "resulting dimensions width=%d height=%d\n", > > -- > > 2.26.0 > > > > Ping. If there is no objection, I will push this patch in a few days.
On Wed, May 20, 2020 at 10:07:03AM +0200, Matthieu Bouron wrote: > On Sat, May 09, 2020 at 09:45:05AM +0200, Matthieu Bouron wrote: > > On Tue, Mar 31, 2020 at 10:03:08AM +0200, Matthieu Bouron wrote: > > > --- > > > libavcodec/mediacodecdec_common.c | 100 ++++++++++++++++++++++++++++++ > > > 1 file changed, 100 insertions(+) > > > > > > diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c > > > index f0752fa6261..404ed282275 100644 > > > --- a/libavcodec/mediacodecdec_common.c > > > +++ b/libavcodec/mediacodecdec_common.c > > > @@ -85,6 +85,85 @@ > > > #define OUTPUT_DEQUEUE_TIMEOUT_US 8000 > > > #define OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US 1000000 > > > > > > +enum { > > > + COLOR_RANGE_FULL = 0x1, > > > + COLOR_RANGE_LIMITED = 0x2, > > > +}; > > > + > > > +static enum AVColorRange mcdec_get_color_range(int color_range) > > > +{ > > > + switch (color_range) { > > > + case COLOR_RANGE_FULL: > > > + return AVCOL_RANGE_JPEG; > > > + case COLOR_RANGE_LIMITED: > > > + return AVCOL_RANGE_MPEG; > > > + default: > > > + return AVCOL_RANGE_UNSPECIFIED; > > > + } > > > +} > > > + > > > +enum { > > > + COLOR_STANDARD_BT709 = 0x1, > > > + COLOR_STANDARD_BT601_PAL = 0x2, > > > + COLOR_STANDARD_BT601_NTSC = 0x4, > > > + COLOR_STANDARD_BT2020 = 0x6, > > > +}; > > > + > > > +static enum AVColorSpace mcdec_get_color_space(int color_standard) > > > +{ > > > + switch (color_standard) { > > > + case COLOR_STANDARD_BT709: > > > + return AVCOL_SPC_BT709; > > > + case COLOR_STANDARD_BT601_PAL: > > > + return AVCOL_SPC_BT470BG; > > > + case COLOR_STANDARD_BT601_NTSC: > > > + return AVCOL_SPC_SMPTE170M; > > > + case COLOR_STANDARD_BT2020: > > > + return AVCOL_SPC_BT2020_NCL; > > > + default: > > > + return AVCOL_SPC_UNSPECIFIED; > > > + } > > > +} > > > + > > > +static enum AVColorPrimaries mcdec_get_color_pri(int color_standard) > > > +{ > > > + switch (color_standard) { > > > + case COLOR_STANDARD_BT709: > > > + return AVCOL_PRI_BT709; > > > + case COLOR_STANDARD_BT601_PAL: > > > + return AVCOL_PRI_BT470BG; > > > + case COLOR_STANDARD_BT601_NTSC: > > > + return AVCOL_PRI_SMPTE170M; > > > + case COLOR_STANDARD_BT2020: > > > + return AVCOL_PRI_BT2020; > > > + default: > > > + return AVCOL_PRI_UNSPECIFIED; > > > + } > > > +} > > > + > > > +enum { > > > + COLOR_TRANSFER_LINEAR = 0x1, > > > + COLOR_TRANSFER_SDR_VIDEO = 0x3, > > > + COLOR_TRANSFER_ST2084 = 0x6, > > > + COLOR_TRANSFER_HLG = 0x7, > > > +}; > > > + > > > +static enum AVColorTransferCharacteristic mcdec_get_color_trc(int color_transfer) > > > +{ > > > + switch (color_transfer) { > > > + case COLOR_TRANSFER_LINEAR: > > > + return AVCOL_TRC_LINEAR; > > > + case COLOR_TRANSFER_SDR_VIDEO: > > > + return AVCOL_TRC_SMPTE170M; > > > + case COLOR_TRANSFER_ST2084: > > > + return AVCOL_TRC_SMPTEST2084; > > > + case COLOR_TRANSFER_HLG: > > > + return AVCOL_TRC_ARIB_STD_B67; > > > + default: > > > + return AVCOL_TRC_UNSPECIFIED; > > > + } > > > +} > > > + > > > enum { > > > COLOR_FormatYUV420Planar = 0x13, > > > COLOR_FormatYUV420SemiPlanar = 0x15, > > > @@ -220,6 +299,10 @@ FF_DISABLE_DEPRECATION_WARNINGS > > > FF_ENABLE_DEPRECATION_WARNINGS > > > #endif > > > frame->pkt_dts = AV_NOPTS_VALUE; > > > + frame->color_range = avctx->color_range; > > > + frame->color_primaries = avctx->color_primaries; > > > + frame->color_trc = avctx->color_trc; > > > + frame->colorspace = avctx->colorspace; > > > > > > buffer = av_mallocz(sizeof(AVMediaCodecBuffer)); > > > if (!buffer) { > > > @@ -368,6 +451,9 @@ static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecConte > > > int ret = 0; > > > int width = 0; > > > int height = 0; > > > + int color_range = 0; > > > + int color_standard = 0; > > > + int color_transfer = 0; > > > char *format = NULL; > > > > > > if (!s->format) { > > > @@ -426,6 +512,20 @@ static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecConte > > > ff_set_sar(avctx, sar); > > > } > > > > > > + AMEDIAFORMAT_GET_INT32(color_range, "color-range", 0); > > > + if (color_range) > > > + avctx->color_range = mcdec_get_color_range(color_range); > > > + > > > + AMEDIAFORMAT_GET_INT32(color_standard, "color-standard", 0); > > > + if (color_standard) { > > > + avctx->colorspace = mcdec_get_color_space(color_standard); > > > + avctx->color_primaries = mcdec_get_color_pri(color_standard); > > > + } > > > + > > > + AMEDIAFORMAT_GET_INT32(color_transfer, "color-transfer", 0); > > > + if (color_transfer) > > > + avctx->color_trc = mcdec_get_color_trc(color_transfer); > > > + > > > av_log(avctx, AV_LOG_INFO, > > > "Output crop parameters top=%d bottom=%d left=%d right=%d, " > > > "resulting dimensions width=%d height=%d\n", > > > -- > > > 2.26.0 > > > > > > > Ping. > > If there is no objection, I will push this patch in a few days. Patch applied.
diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c index f0752fa6261..404ed282275 100644 --- a/libavcodec/mediacodecdec_common.c +++ b/libavcodec/mediacodecdec_common.c @@ -85,6 +85,85 @@ #define OUTPUT_DEQUEUE_TIMEOUT_US 8000 #define OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US 1000000 +enum { + COLOR_RANGE_FULL = 0x1, + COLOR_RANGE_LIMITED = 0x2, +}; + +static enum AVColorRange mcdec_get_color_range(int color_range) +{ + switch (color_range) { + case COLOR_RANGE_FULL: + return AVCOL_RANGE_JPEG; + case COLOR_RANGE_LIMITED: + return AVCOL_RANGE_MPEG; + default: + return AVCOL_RANGE_UNSPECIFIED; + } +} + +enum { + COLOR_STANDARD_BT709 = 0x1, + COLOR_STANDARD_BT601_PAL = 0x2, + COLOR_STANDARD_BT601_NTSC = 0x4, + COLOR_STANDARD_BT2020 = 0x6, +}; + +static enum AVColorSpace mcdec_get_color_space(int color_standard) +{ + switch (color_standard) { + case COLOR_STANDARD_BT709: + return AVCOL_SPC_BT709; + case COLOR_STANDARD_BT601_PAL: + return AVCOL_SPC_BT470BG; + case COLOR_STANDARD_BT601_NTSC: + return AVCOL_SPC_SMPTE170M; + case COLOR_STANDARD_BT2020: + return AVCOL_SPC_BT2020_NCL; + default: + return AVCOL_SPC_UNSPECIFIED; + } +} + +static enum AVColorPrimaries mcdec_get_color_pri(int color_standard) +{ + switch (color_standard) { + case COLOR_STANDARD_BT709: + return AVCOL_PRI_BT709; + case COLOR_STANDARD_BT601_PAL: + return AVCOL_PRI_BT470BG; + case COLOR_STANDARD_BT601_NTSC: + return AVCOL_PRI_SMPTE170M; + case COLOR_STANDARD_BT2020: + return AVCOL_PRI_BT2020; + default: + return AVCOL_PRI_UNSPECIFIED; + } +} + +enum { + COLOR_TRANSFER_LINEAR = 0x1, + COLOR_TRANSFER_SDR_VIDEO = 0x3, + COLOR_TRANSFER_ST2084 = 0x6, + COLOR_TRANSFER_HLG = 0x7, +}; + +static enum AVColorTransferCharacteristic mcdec_get_color_trc(int color_transfer) +{ + switch (color_transfer) { + case COLOR_TRANSFER_LINEAR: + return AVCOL_TRC_LINEAR; + case COLOR_TRANSFER_SDR_VIDEO: + return AVCOL_TRC_SMPTE170M; + case COLOR_TRANSFER_ST2084: + return AVCOL_TRC_SMPTEST2084; + case COLOR_TRANSFER_HLG: + return AVCOL_TRC_ARIB_STD_B67; + default: + return AVCOL_TRC_UNSPECIFIED; + } +} + enum { COLOR_FormatYUV420Planar = 0x13, COLOR_FormatYUV420SemiPlanar = 0x15, @@ -220,6 +299,10 @@ FF_DISABLE_DEPRECATION_WARNINGS FF_ENABLE_DEPRECATION_WARNINGS #endif frame->pkt_dts = AV_NOPTS_VALUE; + frame->color_range = avctx->color_range; + frame->color_primaries = avctx->color_primaries; + frame->color_trc = avctx->color_trc; + frame->colorspace = avctx->colorspace; buffer = av_mallocz(sizeof(AVMediaCodecBuffer)); if (!buffer) { @@ -368,6 +451,9 @@ static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecConte int ret = 0; int width = 0; int height = 0; + int color_range = 0; + int color_standard = 0; + int color_transfer = 0; char *format = NULL; if (!s->format) { @@ -426,6 +512,20 @@ static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecConte ff_set_sar(avctx, sar); } + AMEDIAFORMAT_GET_INT32(color_range, "color-range", 0); + if (color_range) + avctx->color_range = mcdec_get_color_range(color_range); + + AMEDIAFORMAT_GET_INT32(color_standard, "color-standard", 0); + if (color_standard) { + avctx->colorspace = mcdec_get_color_space(color_standard); + avctx->color_primaries = mcdec_get_color_pri(color_standard); + } + + AMEDIAFORMAT_GET_INT32(color_transfer, "color-transfer", 0); + if (color_transfer) + avctx->color_trc = mcdec_get_color_trc(color_transfer); + av_log(avctx, AV_LOG_INFO, "Output crop parameters top=%d bottom=%d left=%d right=%d, " "resulting dimensions width=%d height=%d\n",