Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.8
| @@ -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 | ||||