Hello, 
Thanks for your comments. Here's an updated version of the patch.
Did you have any troubles opening the bitstreams ?

BR,



Nicolas DEROUINEAU
Research Engineer
VITEC

T.  +33 1 46 73 06 06
E.  nicolas.derouin...@vitec.com
W. www.vitec.com

________________________________________
De : Michael Niedermayer <michae...@gmx.at>
Envoyé : lundi 29 juin 2015 15:49
À : FFmpeg development discussions and patches; Nicolas Derouineau
Cc : Nicolas Tizon; Erwan Raffin; Didier Nicholson; Yahia Benmoussa
Objet : Re: [FFmpeg-devel] Patch to parse H264 SEI Green Metadata

Hi

On Mon, Jun 29, 2015 at 01:01:48PM +0000, Nicolas Derouineau wrote:
> Two patches are now here enclosed:
>
> The first one enable metadata parsing. The second one add a new options in 
> the file avcodec/options_table.h
>
> Tested with:
>
> ./ffplay -debug green_metadata ~/GreenMetaDataSEI.264

Where can we find the sample file ?


>
> Best Regards,
>
> Nicolas DEROUINEAU
> Research Engineer
> VITEC
>
> T.  +33 1 46 73 06 06
> E.  nicolas.derouin...@vitec.com
> W. www.vitec.com
>
> ________________________________________
> De : ffmpeg-devel-boun...@ffmpeg.org <ffmpeg-devel-boun...@ffmpeg.org> de la 
> part de Nicolas Derouineau <nicolas.derouin...@vitec.com>
> Envoyé : lundi 29 juin 2015 14:20
> À : FFmpeg development discussions and patches
> Objet : Re: [FFmpeg-devel] Patch to parse H264 SEI Green Metadata
>
> Hello,
> Thank you for your comments.
>
> Please find enclosed the updated patch.
>
> I have tested it with the following cmdline:
>
> ./ffplay -debug 1048576 ~/GreenMetaDataSEI.264
>
> I know that this debug flag should be define somewhere as a string in order 
> to display it with:
>
> ./ffplay --help
>
> Could someone point me to the correct location to do this ?
>
> Ps: Reference Bitstreams are still available here: 
> ftp-public-greenvideo.insa-rennes.fr
>
> Ps 2: This message may look like a duplicate, but I have been experiencing 
> issues to subscribe to the mailing list.
>
>
>
> Best regards,
> Nicolas DEROUINEAU
> Research Engineer
> VITEC
>
> T.  +33 1 46 73 06 06
> E.  nicolas.derouin...@vitec.com
> W. www.vitec.com
>
> ________________________________________
> De : Vittorio Giovara <vittorio.giov...@gmail.com>
> Envoyé : vendredi 26 juin 2015 02:56
> À : FFmpeg development discussions and patches
> Cc : Nicolas Derouineau; Yahia Benmoussa; Erwan Raffin; michae...@gmx.at; 
> Didier Nicholson; Nicolas Tizon
> Objet : Re: [FFmpeg-devel] Patch to parse H264 SEI Green Metadata
>
> On Thu, Jun 25, 2015 at 5:30 PM, Michael Niedermayer
> <mich...@niedermayer.cc> wrote:
> > On Thu, Jun 25, 2015 at 11:13:53AM +0000, Nicolas Derouineau wrote:
> >> Hello,
> >> Please find here enclosed a patch enabling h264 Green Metada SEI parsing 
> >> for FFMPEG. You'll be able to find reference bitstreams containing the 
> >> metadata at the following adress:
> >>
> >> ftp-public-greenvideo.insa-rennes.fr
> >>
> >>
> >> The Nal SEI syntax is the same as the one used in the last JM release 
> >> (19.0).
> >>
> >>
> >> Best Regards,
> >>
> >>
> >>
> >> Nicolas DEROUINEAU
> >> Research Engineer
> >> VITEC
> >>
> >> T.  +33 1 46 73 06 06
> >> E.  nicolas.derouin...@vitec.com<mailto:nicolas.derouin...@vitec.com>
> >> W. www.vitec.com<http://www.vitec.com/>;
> >
> >>  h264.h     |   20 ++++++++++++++++++
> >>  h264_sei.c |   67 
> >>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >>  2 files changed, 87 insertions(+)
> >> feb39a55dd6afbaf341df765eafc02266c00a588  
> >> 0002-Enabling-GreenMetadata-SEI-parsing-for-H264-decoder.patch
> >> From 60903bff6429182c84dc5daef0d26695d3f71861 Mon Sep 17 00:00:00 2001
> >> From: Nicolas DEROUINEAU <nicolas.derouin...@vitec.com>
> >> Date: Thu, 25 Jun 2015 13:02:39 +0200
> >> Subject: [PATCH 2/2] Enabling GreenMetadata SEI parsing for H264 decoder
> >>
> >> ---
> >>  libavcodec/h264.h     | 20 +++++++++++++++
> >>  libavcodec/h264_sei.c | 67 
> >>+++++++++++++++++++++++++++++++++++++++++++++++++++
> >>  2 files changed, 87 insertions(+)
> >>
> >> diff --git a/libavcodec/h264.h b/libavcodec/h264.h
> >> index 548510d..0324dc1 100644
> >> --- a/libavcodec/h264.h
> >> +++ b/libavcodec/h264.h
> >> @@ -137,6 +137,7 @@ typedef enum {
> >>      SEI_TYPE_RECOVERY_POINT         = 6,   ///< recovery point (frame # 
> >>to decoder sync)
> >>      SEI_TYPE_FRAME_PACKING          = 45,  ///< frame packing arrangement
> >>      SEI_TYPE_DISPLAY_ORIENTATION    = 47,  ///< display orientation
> >> +    SEI_TYPE_GREEN_METADATA  = 56  ///< GreenMPEG information
> >>  } SEI_Type;
> >>
> >>  /**
> >> @@ -268,6 +269,22 @@ typedef struct FPA {
> >>  } FPA;
> >>
> >>  /**
> >> + * Green MetaData Information Type
> >> + */
> >> +typedef struct GreenMetaData {
> >> +    unsigned char  green_metadata_type;
> >> +    unsigned char  period_type;
> >> +    unsigned short num_seconds;
> >> +    unsigned short num_pictures;
>
> uint16_t and uint8_t would probably be more appropriate here
>
> >> +    unsigned char percent_non_zero_macroblocks;
> >> +    unsigned char percent_intra_coded_macroblocks;
> >> +    unsigned char percent_six_tap_filtering;
> >> +    unsigned char percent_alpha_point_deblocking_instance;
> >> +    unsigned char xsd_metric_type;
> >> +    unsigned short xsd_metric_value;
> >> +} GreenMetaData;
> >> +
> >> +/**
> >>   * Memory management control operation opcode.
> >>   */
> >>  typedef enum MMCOOpcode {
> >> @@ -804,6 +821,9 @@ typedef struct H264Context {
> >>      /* Motion Estimation */
> >>      qpel_mc_func (*qpel_put)[16];
> >>      qpel_mc_func (*qpel_avg)[16];
> >> +
> >> +    /*Green Metadata */
> >> +    GreenMetaData sei_GreenMetaData;
>
> This is mostly a nit, but could you maybe avoid using CamelCase naming
> in function and variable names?
> eg GreenMetaData sei_green_metadata would reflect more the rest of the code.
>
> thanks
> --
> Vittorio

>  avcodec.h  |    2 ++
>  h264.h     |   20 ++++++++++++++++++++
>  h264_sei.c |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 81 insertions(+)
> 1453ba266a63744aa16e59d4c18bcc1081d6e65f  
> 0002-Enabling-GreenMetadata-SEI-parsing-for-H264-decoder.patch
> From d742bb556f794a16e03305195b5826ba8d2931a2 Mon Sep 17 00:00:00 2001
> From: NDE <nde@nde-OptiPlex-980.(none)>
> Date: Mon, 29 Jun 2015 12:13:16 +0200
> Subject: [PATCH 2/4] Enabling GreenMetadata SEI parsing for H264 decoder
>
> ---
>  libavcodec/avcodec.h  |    2 ++
>  libavcodec/h264.h     |   20 +++++++++++++++++
>  libavcodec/h264_sei.c |   59 
> +++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 81 insertions(+)
>
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index ddbf0a3..7000145 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -2616,8 +2616,10 @@ typedef struct AVCodecContext {
>  #endif
>  #define FF_DEBUG_BUFFERS     0x00008000
>  #define FF_DEBUG_THREADS     0x00010000

> +#define FF_DEBUG_GREEN_MD    0x00100000
>  #define FF_DEBUG_NOMC        0x01000000

please use
#define FF_DEBUG_GREEN_MD    0x00800000
unless this value is already used
i think we should not add new holes in the list

>
> +
>  #if FF_API_DEBUG_MV
>      /**
>       * debug

stray change


> diff --git a/libavcodec/h264.h b/libavcodec/h264.h
> index 15b9a5d..2cc3e50 100644
> --- a/libavcodec/h264.h
> +++ b/libavcodec/h264.h
> @@ -137,6 +137,7 @@ typedef enum {
>      SEI_TYPE_RECOVERY_POINT         = 6,   ///< recovery point (frame # to 
> decoder sync)
>      SEI_TYPE_FRAME_PACKING          = 45,  ///< frame packing arrangement
>      SEI_TYPE_DISPLAY_ORIENTATION    = 47,  ///< display orientation
> +    SEI_TYPE_GREEN_METADATA  = 56  ///< GreenMPEG information

please keep this similarly formated as the surrounding code ("=" below
each previous)


[...]
>  options_table.h |    1 +
>  1 file changed, 1 insertion(+)
> 80ad6cb3a931768cb22d9349770fde6897eaa50c  
> 0004-Update-for-libavcodec-debug-options-enabling-GreenMe.patch
> From ceac0fcf76195cc6b94a91834458fd9d7ce3e8a7 Mon Sep 17 00:00:00 2001
> From: Nicolas DEROUINEAU <nicolas.derouin...@vitec.com>
> Date: Mon, 29 Jun 2015 14:41:15 +0200
> Subject: [PATCH 4/4] Update for libavcodec debug options enabling
>  GreenMetadata SEI display on stdout
>
> ---
>  libavcodec/options_table.h |    1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
> index a906864..76ae81f 100644
> --- a/libavcodec/options_table.h
> +++ b/libavcodec/options_table.h
> @@ -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"},
>  #endif
>  {"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"},

this also needs a update to
doc/codecs.texi

thanks

[...]

--
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Democracy is the form of government in which you can choose your dictator
From f7cff28a44adada6761233d59207b4a9c0373960 Mon Sep 17 00:00:00 2001
From: Nicolas DEROUINEAU <nicolas.derouin...@vitec.com>
Date: Tue, 30 Jun 2015 10:59:07 +0200
Subject: [PATCH] Patch to parse SEI GreenMetadata

---
 doc/codecs.texi            |    2 ++
 libavcodec/avcodec.h       |    1 +
 libavcodec/h264.h          |   21 ++++++++++++++++
 libavcodec/h264_sei.c      |   59 ++++++++++++++++++++++++++++++++++++++++++++
 libavcodec/options_table.h |    1 +
 5 files changed, 84 insertions(+)

diff --git a/doc/codecs.texi b/doc/codecs.texi
index 3c035a5..5b3ec9b 100644
--- a/doc/codecs.texi
+++ b/doc/codecs.texi
@@ -475,6 +475,8 @@ per-block quantization parameter (QP)
 motion vector
 @item dct_coeff
 
+@item green_metadata
+
 @item skip
 
 @item startcode
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index ddbf0a3..65c9053 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -2610,6 +2610,7 @@ typedef struct AVCodecContext {
 #define FF_DEBUG_ER          0x00000400
 #define FF_DEBUG_MMCO        0x00000800
 #define FF_DEBUG_BUGS        0x00001000
+#define FF_DEBUG_GREEN_MD    0x00001200
 #if FF_API_DEBUG_MV
 #define FF_DEBUG_VIS_QP      0x00002000 ///< only access through AVOptions from outside libavcodec
 #define FF_DEBUG_VIS_MB_TYPE 0x00004000 ///< only access through AVOptions from outside libavcodec
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index 15b9a5d..c298008 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -137,6 +137,7 @@ typedef enum {
     SEI_TYPE_RECOVERY_POINT         = 6,   ///< recovery point (frame # to decoder sync)
     SEI_TYPE_FRAME_PACKING          = 45,  ///< frame packing arrangement
     SEI_TYPE_DISPLAY_ORIENTATION    = 47,  ///< display orientation
+    SEI_TYPE_GREEN_METADATA         = 56   ///< GreenMPEG information
 } SEI_Type;
 
 /**
@@ -268,6 +269,22 @@ typedef struct 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.
  */
 typedef enum MMCOOpcode {
@@ -814,6 +831,10 @@ typedef struct H264Context {
     /* Motion Estimation */
     qpel_mc_func (*qpel_put)[16];
     qpel_mc_func (*qpel_avg)[16];
+
+    /* Green Metadata */
+    GreenMetaData sei_green_metadata;
+
 } 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).
diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c
index b6ec5c7..64222fe 100644
--- a/libavcodec/h264_sei.c
+++ b/libavcodec/h264_sei.c
@@ -285,6 +285,60 @@ static int decode_display_orientation(H264Context *h)
     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)
 {
     while (get_bits_left(&h->gb) > 16 && show_bits(&h->gb, 16)) {
@@ -350,6 +404,11 @@ int ff_h264_decode_sei(H264Context *h)
             if (ret < 0)
                 return ret;
             break;
+        case SEI_TYPE_GREEN_METADATA:
+            ret = decode_GreenMetadata(h);
+            if (ret < 0)
+                return ret;
+            break;
         default:
             av_log(h->avctx, AV_LOG_DEBUG, "unknown SEI type %d\n", type);
         }
diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
index a906864..76ae81f 100644
--- a/libavcodec/options_table.h
+++ b/libavcodec/options_table.h
@@ -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"},
 #endif
 {"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"},
 {"startcode", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_STARTCODE }, INT_MIN, INT_MAX, V|D, "debug"},
 #if FF_API_UNUSED_MEMBERS
-- 
1.7.9.5

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to