mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-03-04 03:28:05 +00:00
avcodec/h264: Greenmetadata SEI parsing
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
7e9c7b623f
commit
04a68f4348
@ -475,6 +475,9 @@ per-block quantization parameter (QP)
|
|||||||
motion vector
|
motion vector
|
||||||
@item dct_coeff
|
@item dct_coeff
|
||||||
|
|
||||||
|
@item green_metadata
|
||||||
|
display complexity metadata for the upcoming frame, GoP or for a given duration.
|
||||||
|
|
||||||
@item skip
|
@item skip
|
||||||
|
|
||||||
@item startcode
|
@item startcode
|
||||||
|
@ -2616,6 +2616,7 @@ typedef struct AVCodecContext {
|
|||||||
#endif
|
#endif
|
||||||
#define FF_DEBUG_BUFFERS 0x00008000
|
#define FF_DEBUG_BUFFERS 0x00008000
|
||||||
#define FF_DEBUG_THREADS 0x00010000
|
#define FF_DEBUG_THREADS 0x00010000
|
||||||
|
#define FF_DEBUG_GREEN_MD 0x00800000
|
||||||
#define FF_DEBUG_NOMC 0x01000000
|
#define FF_DEBUG_NOMC 0x01000000
|
||||||
|
|
||||||
#if FF_API_DEBUG_MV
|
#if FF_API_DEBUG_MV
|
||||||
|
@ -137,6 +137,7 @@ typedef enum {
|
|||||||
SEI_TYPE_RECOVERY_POINT = 6, ///< recovery point (frame # to decoder sync)
|
SEI_TYPE_RECOVERY_POINT = 6, ///< recovery point (frame # to decoder sync)
|
||||||
SEI_TYPE_FRAME_PACKING = 45, ///< frame packing arrangement
|
SEI_TYPE_FRAME_PACKING = 45, ///< frame packing arrangement
|
||||||
SEI_TYPE_DISPLAY_ORIENTATION = 47, ///< display orientation
|
SEI_TYPE_DISPLAY_ORIENTATION = 47, ///< display orientation
|
||||||
|
SEI_TYPE_GREEN_METADATA = 56 ///< GreenMPEG information
|
||||||
} SEI_Type;
|
} SEI_Type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -267,6 +268,22 @@ typedef struct FPA {
|
|||||||
int quincunx_sampling_flag;
|
int quincunx_sampling_flag;
|
||||||
} FPA;
|
} FPA;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Green MetaData Information Type
|
||||||
|
*/
|
||||||
|
typedef struct GreenMetaData {
|
||||||
|
uint8_t green_metadata_type;
|
||||||
|
uint8_t period_type;
|
||||||
|
uint16_t num_seconds;
|
||||||
|
uint16_t num_pictures;
|
||||||
|
uint8_t percent_non_zero_macroblocks;
|
||||||
|
uint8_t percent_intra_coded_macroblocks;
|
||||||
|
uint8_t percent_six_tap_filtering;
|
||||||
|
uint8_t percent_alpha_point_deblocking_instance;
|
||||||
|
uint8_t xsd_metric_type;
|
||||||
|
uint16_t xsd_metric_value;
|
||||||
|
} GreenMetaData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Memory management control operation opcode.
|
* Memory management control operation opcode.
|
||||||
*/
|
*/
|
||||||
@ -817,6 +834,10 @@ typedef struct H264Context {
|
|||||||
/* Motion Estimation */
|
/* Motion Estimation */
|
||||||
qpel_mc_func (*qpel_put)[16];
|
qpel_mc_func (*qpel_put)[16];
|
||||||
qpel_mc_func (*qpel_avg)[16];
|
qpel_mc_func (*qpel_avg)[16];
|
||||||
|
|
||||||
|
/*Green Metadata */
|
||||||
|
GreenMetaData sei_green_metadata;
|
||||||
|
|
||||||
} H264Context;
|
} H264Context;
|
||||||
|
|
||||||
extern const uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM + 1]; ///< One chroma qp table for each possible bit depth (8-14).
|
extern const uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM + 1]; ///< One chroma qp table for each possible bit depth (8-14).
|
||||||
|
@ -294,6 +294,66 @@ static int decode_display_orientation(H264Context *h)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int decode_GreenMetadata(H264Context *h)
|
||||||
|
{
|
||||||
|
if (h->avctx->debug & FF_DEBUG_GREEN_MD)
|
||||||
|
av_log(h->avctx, AV_LOG_DEBUG, "Green Metadata Info SEI message\n");
|
||||||
|
|
||||||
|
h->sei_green_metadata.green_metadata_type=get_bits(&h->gb, 8);
|
||||||
|
|
||||||
|
if (h->avctx->debug & FF_DEBUG_GREEN_MD)
|
||||||
|
av_log(h->avctx, AV_LOG_DEBUG, "green_metadata_type = %d\n",
|
||||||
|
h->sei_green_metadata.green_metadata_type);
|
||||||
|
|
||||||
|
if (h->sei_green_metadata.green_metadata_type==0){
|
||||||
|
h->sei_green_metadata.period_type=get_bits(&h->gb, 8);
|
||||||
|
|
||||||
|
if (h->avctx->debug & FF_DEBUG_GREEN_MD)
|
||||||
|
av_log(h->avctx, AV_LOG_DEBUG, "green_metadata_period_type = %d\n",
|
||||||
|
h->sei_green_metadata.period_type);
|
||||||
|
|
||||||
|
if (h->sei_green_metadata.green_metadata_type==2){
|
||||||
|
h->sei_green_metadata.num_seconds = get_bits(&h->gb, 16);
|
||||||
|
if (h->avctx->debug & FF_DEBUG_GREEN_MD)
|
||||||
|
av_log(h->avctx, AV_LOG_DEBUG, "green_metadata_num_seconds = %d\n",
|
||||||
|
h->sei_green_metadata.num_seconds);
|
||||||
|
}
|
||||||
|
else if (h->sei_green_metadata.period_type==3){
|
||||||
|
h->sei_green_metadata.num_pictures = get_bits(&h->gb, 16);
|
||||||
|
if (h->avctx->debug & FF_DEBUG_GREEN_MD)
|
||||||
|
av_log(h->avctx, AV_LOG_DEBUG, "green_metadata_num_pictures = %d\n",
|
||||||
|
h->sei_green_metadata.num_pictures);
|
||||||
|
}
|
||||||
|
|
||||||
|
h->sei_green_metadata.percent_non_zero_macroblocks=get_bits(&h->gb, 8);
|
||||||
|
h->sei_green_metadata.percent_intra_coded_macroblocks=get_bits(&h->gb, 8);
|
||||||
|
h->sei_green_metadata.percent_six_tap_filtering=get_bits(&h->gb, 8);
|
||||||
|
h->sei_green_metadata.percent_alpha_point_deblocking_instance=get_bits(&h->gb, 8);
|
||||||
|
|
||||||
|
if (h->avctx->debug & FF_DEBUG_GREEN_MD)
|
||||||
|
av_log(h->avctx, AV_LOG_DEBUG, "SEI GREEN Complexity Metrics = %f %f %f %f\n",
|
||||||
|
(float)h->sei_green_metadata.percent_non_zero_macroblocks/255,
|
||||||
|
(float)h->sei_green_metadata.percent_intra_coded_macroblocks/255,
|
||||||
|
(float)h->sei_green_metadata.percent_six_tap_filtering/255,
|
||||||
|
(float)h->sei_green_metadata.percent_alpha_point_deblocking_instance/255);
|
||||||
|
|
||||||
|
}else if( h->sei_green_metadata.green_metadata_type==1){
|
||||||
|
h->sei_green_metadata.xsd_metric_type=get_bits(&h->gb, 8);
|
||||||
|
h->sei_green_metadata.xsd_metric_value=get_bits(&h->gb, 16);
|
||||||
|
|
||||||
|
if (h->avctx->debug & FF_DEBUG_GREEN_MD)
|
||||||
|
av_log(h->avctx, AV_LOG_DEBUG, "xsd_metric_type = %d\n",
|
||||||
|
h->sei_green_metadata.xsd_metric_type);
|
||||||
|
if ( h->sei_green_metadata.xsd_metric_type==0){
|
||||||
|
if (h->avctx->debug & FF_DEBUG_GREEN_MD)
|
||||||
|
av_log(h->avctx, AV_LOG_DEBUG, "xsd_metric_value = %f\n",
|
||||||
|
(float)h->sei_green_metadata.xsd_metric_value/100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int ff_h264_decode_sei(H264Context *h)
|
int ff_h264_decode_sei(H264Context *h)
|
||||||
{
|
{
|
||||||
while (get_bits_left(&h->gb) > 16 && show_bits(&h->gb, 16)) {
|
while (get_bits_left(&h->gb) > 16 && show_bits(&h->gb, 16)) {
|
||||||
@ -346,6 +406,9 @@ int ff_h264_decode_sei(H264Context *h)
|
|||||||
case SEI_TYPE_DISPLAY_ORIENTATION:
|
case SEI_TYPE_DISPLAY_ORIENTATION:
|
||||||
ret = decode_display_orientation(h);
|
ret = decode_display_orientation(h);
|
||||||
break;
|
break;
|
||||||
|
case SEI_TYPE_GREEN_METADATA:
|
||||||
|
ret = decode_GreenMetadata(h);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
av_log(h->avctx, AV_LOG_DEBUG, "unknown SEI type %d\n", type);
|
av_log(h->avctx, AV_LOG_DEBUG, "unknown SEI type %d\n", type);
|
||||||
}
|
}
|
||||||
|
@ -253,6 +253,7 @@ static const AVOption avcodec_options[] = {
|
|||||||
{"mv", "motion vector", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_MV }, INT_MIN, INT_MAX, V|D, "debug"},
|
{"mv", "motion vector", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_MV }, INT_MIN, INT_MAX, V|D, "debug"},
|
||||||
#endif
|
#endif
|
||||||
{"dct_coeff", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_DCT_COEFF }, INT_MIN, INT_MAX, V|D, "debug"},
|
{"dct_coeff", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_DCT_COEFF }, INT_MIN, INT_MAX, V|D, "debug"},
|
||||||
|
{"green_metadata", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_GREEN_MD }, INT_MIN, INT_MAX, V|D, "debug"},
|
||||||
{"skip", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_SKIP }, INT_MIN, INT_MAX, V|D, "debug"},
|
{"skip", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_SKIP }, INT_MIN, INT_MAX, V|D, "debug"},
|
||||||
{"startcode", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_STARTCODE }, INT_MIN, INT_MAX, V|D, "debug"},
|
{"startcode", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_STARTCODE }, INT_MIN, INT_MAX, V|D, "debug"},
|
||||||
#if FF_API_UNUSED_MEMBERS
|
#if FF_API_UNUSED_MEMBERS
|
||||||
|
Loading…
Reference in New Issue
Block a user