diff mbox

[FFmpeg-devel] Save FFmpeg colorspace info in openh264 video files.

Message ID 1480371914-7660-1-git-send-email-gregory.wolfe@kodakalaris.com
State Superseded
Headers show

Commit Message

Gregory J. Wolfe Nov. 28, 2016, 10:25 p.m. UTC
As of version 1.6, libopenh264 saves (in the output video file)
information about the color primaries, transfer characteristics,
and color matrix used when the video pixel data was created.
This patch sets the required libopenh264 data structures using
the FFmpeg colorspace information so that video players will
know how to properly decode video files created using FFmpeg
and libopenh264.

Signed-off-by: Gregory J. Wolfe <gregory.wolfe@kodakalaris.com>
---
 libavcodec/libopenh264enc.c | 52 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

Comments

Carl Eugen Hoyos Nov. 28, 2016, 11:09 p.m. UTC | #1
2016-11-28 23:25 GMT+01:00 Gregory J. Wolfe <gregory.wolfe@kodakalaris.com>:

> This patch sets the required libopenh264 data structures using
> the FFmpeg colorspace information so that video players will
> know how to properly decode video files created using FFmpeg
> and libopenh264.

Please copy FFmpeg's switch() style from another file and please
consider to align "param.", "=" and "break".

> +    param.sSpatialLayers[0].uiVideoFormat = VF_UNDEF;

(What are the possible "formats"?)

> +    param.sSpatialLayers[0].bFullRange = (avctx->color_range == AVCOL_RANGE_JPEG);

The parentheses look unneeded.

Carl Eugen
diff mbox

Patch

diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c
index 5aa1596..6de7790 100644
--- a/libavcodec/libopenh264enc.c
+++ b/libavcodec/libopenh264enc.c
@@ -206,6 +206,58 @@  FF_ENABLE_DEPRECATION_WARNINGS
         }
     }
 
+#if OPENH264_VER_AT_LEAST(1, 6)
+    // set video signal type information
+    param.sSpatialLayers[0].bVideoSignalTypePresent = true;
+    param.sSpatialLayers[0].uiVideoFormat = VF_UNDEF;
+    param.sSpatialLayers[0].bFullRange = (avctx->color_range == AVCOL_RANGE_JPEG);
+    param.sSpatialLayers[0].bColorDescriptionPresent = true;
+    switch  ( avctx->color_primaries )
+    {
+    case  AVCOL_PRI_BT709:        param.sSpatialLayers[0].uiColorPrimaries = CP_BT709;  break;
+    case  AVCOL_PRI_UNSPECIFIED:  param.sSpatialLayers[0].uiColorPrimaries = CP_UNDEF;  break;
+    case  AVCOL_PRI_BT470M:       param.sSpatialLayers[0].uiColorPrimaries = CP_BT470M;  break;
+    case  AVCOL_PRI_BT470BG:      param.sSpatialLayers[0].uiColorPrimaries = CP_BT470BG;  break;
+    case  AVCOL_PRI_SMPTE170M:    param.sSpatialLayers[0].uiColorPrimaries = CP_SMPTE170M;  break;
+    case  AVCOL_PRI_SMPTE240M:    param.sSpatialLayers[0].uiColorPrimaries = CP_SMPTE240M;  break;
+    case  AVCOL_PRI_FILM:         param.sSpatialLayers[0].uiColorPrimaries = CP_FILM;  break;
+    case  AVCOL_PRI_BT2020:       param.sSpatialLayers[0].uiColorPrimaries = CP_BT2020;  break;
+    default:                      param.sSpatialLayers[0].uiColorPrimaries = CP_UNDEF;  break;
+    }
+    switch  ( avctx->color_trc )
+    {
+    case  AVCOL_TRC_BT709:         param.sSpatialLayers[0].uiTransferCharacteristics = TRC_BT709;  break;
+    case  AVCOL_TRC_UNSPECIFIED:   param.sSpatialLayers[0].uiTransferCharacteristics = TRC_UNDEF;  break;
+    case  AVCOL_TRC_GAMMA22:       param.sSpatialLayers[0].uiTransferCharacteristics = TRC_BT470M;  break;
+    case  AVCOL_TRC_GAMMA28:       param.sSpatialLayers[0].uiTransferCharacteristics = TRC_BT470BG;  break;
+    case  AVCOL_TRC_SMPTE170M:     param.sSpatialLayers[0].uiTransferCharacteristics = TRC_SMPTE170M;  break;
+    case  AVCOL_TRC_SMPTE240M:     param.sSpatialLayers[0].uiTransferCharacteristics = TRC_SMPTE240M;  break;
+    case  AVCOL_TRC_LINEAR:        param.sSpatialLayers[0].uiTransferCharacteristics = TRC_LINEAR;  break;
+    case  AVCOL_TRC_LOG:           param.sSpatialLayers[0].uiTransferCharacteristics = TRC_LOG100;  break;
+    case  AVCOL_TRC_LOG_SQRT:      param.sSpatialLayers[0].uiTransferCharacteristics = TRC_LOG316;  break;
+    case  AVCOL_TRC_IEC61966_2_4:  param.sSpatialLayers[0].uiTransferCharacteristics = TRC_IEC61966_2_4;  break;
+    case  AVCOL_TRC_BT1361_ECG:    param.sSpatialLayers[0].uiTransferCharacteristics = TRC_BT1361E;  break;
+    case  AVCOL_TRC_IEC61966_2_1:  param.sSpatialLayers[0].uiTransferCharacteristics = TRC_IEC61966_2_1;  break;
+    case  AVCOL_TRC_BT2020_10:     param.sSpatialLayers[0].uiTransferCharacteristics = TRC_BT2020_10;  break;
+    case  AVCOL_TRC_BT2020_12:     param.sSpatialLayers[0].uiTransferCharacteristics = TRC_BT2020_12;  break;
+    default:                       param.sSpatialLayers[0].uiTransferCharacteristics = TRC_UNDEF;  break;
+    }
+    switch  ( avctx->colorspace )
+    {
+    case  AVCOL_SPC_RGB:          param.sSpatialLayers[0].uiColorMatrix = CM_GBR;  break;
+    case  AVCOL_SPC_BT709:        param.sSpatialLayers[0].uiColorMatrix = CM_BT709;  break;
+    case  AVCOL_SPC_UNSPECIFIED:  param.sSpatialLayers[0].uiColorMatrix = CM_UNDEF;  break;
+    case  AVCOL_SPC_FCC:          param.sSpatialLayers[0].uiColorMatrix = CM_FCC;  break;
+    case  AVCOL_SPC_BT470BG:      param.sSpatialLayers[0].uiColorMatrix = CM_BT470BG;  break;
+    case  AVCOL_SPC_SMPTE170M:    param.sSpatialLayers[0].uiColorMatrix = CM_SMPTE170M;  break;
+    case  AVCOL_SPC_SMPTE240M:    param.sSpatialLayers[0].uiColorMatrix = CM_SMPTE240M;  break;
+    case  AVCOL_SPC_YCOCG:        param.sSpatialLayers[0].uiColorMatrix = CM_YCGCO;  break;
+    case  AVCOL_SPC_BT2020_NCL:   param.sSpatialLayers[0].uiColorMatrix = CM_BT2020NC;  break;
+    case  AVCOL_SPC_BT2020_CL:    param.sSpatialLayers[0].uiColorMatrix = CM_BT2020C;  break;
+    default:                      param.sSpatialLayers[0].uiColorMatrix = CM_UNDEF;  break;
+    }
+#endif
+
     if ((*s->encoder)->InitializeExt(s->encoder, &param) != cmResultSuccess) {
         av_log(avctx, AV_LOG_ERROR, "Initialize failed\n");
         return AVERROR_UNKNOWN;