[FFmpeg-devel] [PATCH] avcodec/mediacodec_common: use MediaFormat to probe frame color characteristics
Matthieu Bouron
matthieu.bouron at gmail.com
Mon May 25 19:11:49 EEST 2020
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.
--
Matthieu B.
More information about the ffmpeg-devel
mailing list