Hello,
Please find here enclosed a patch adding frame side data information about 
green metadata.

Best regards,

Nicolas DEROUINEAU





  
 
   
From c2959f8482065dc400d2e09002363fc8295d5400 Mon Sep 17 00:00:00 2001
From: Nicolas DEROUINEAU <nicolas.derouin...@vitec.com>
Date: Wed, 23 Dec 2015 12:19:03 +0100
Subject: [PATCH 2/2] Adding frame side data about green metadata - second part

---
 libavcodec/h264.c         | 12 ++++++++++++
 libavcodec/h264.h         |  2 ++
 libavcodec/h264_sei.c     |  3 +++
 libavutil/Makefile        |  2 ++
 libavutil/frame.h         |  7 +++++++
 libavutil/greenmetadata.c | 23 +++++++++++++++++++++++
 libavutil/greenmetadata.h | 38 ++++++++++++++++++++++++++++++++++++++
 7 files changed, 87 insertions(+)

diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 089a86f..7b28dd2 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -29,6 +29,7 @@
 
 #include "libavutil/avassert.h"
 #include "libavutil/display.h"
+#include "libavutil/greenmetadata.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/opt.h"
 #include "libavutil/stereo3d.h"
@@ -879,6 +880,17 @@ static void decode_postinit(H264Context *h, int setup_finished)
         }
     }
 
+    if ( h->sei_green_metadata_present){
+        AVFrameSideData *Greenmd = av_frame_new_side_data(cur->f, AV_FRAME_DATA_GREENMD,
+                                                     sizeof(GreenMetaData));
+
+        if(Greenmd){
+            av_greenmetadata_set((uint8_t *)Greenmd->data, h->sei_green_metadata);
+            av_freep(&h->sei_green_metadata);
+            h->sei_green_metadata_present = 0;
+        }
+    }
+
     if (h->sei_reguserdata_afd_present) {
         AVFrameSideData *sd = av_frame_new_side_data(cur->f, AV_FRAME_DATA_AFD,
                                                      sizeof(uint8_t));
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index 5d9aecd..e6eb7c8 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -839,8 +839,10 @@ typedef struct H264Context {
     qpel_mc_func (*qpel_avg)[16];
 
     /*Green Metadata */
+    int sei_green_metadata_present;
     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 0411b87..1ced948 100644
--- a/libavcodec/h264_sei.c
+++ b/libavcodec/h264_sei.c
@@ -43,6 +43,7 @@ void ff_h264_reset_sei(H264Context *h)
     h->sei_frame_packing_present    =  0;
     h->sei_display_orientation_present = 0;
     h->sei_reguserdata_afd_present  =  0;
+    h->sei_green_metadata_present = 0 ;
 
     h->a53_caption_size = 0;
     av_freep(&h->a53_caption);
@@ -401,6 +402,8 @@ static int decode_GreenMetadata(H264Context *h)
                                            (float)h->sei_green_metadata.percent_six_tap_filtering/255,
                                            (float)h->sei_green_metadata.percent_alpha_point_deblocking_instance/255);
 
+        h->sei_green_metadata_present=1;
+
     }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);
diff --git a/libavutil/Makefile b/libavutil/Makefile
index bf8c713..c3cae53 100644
--- a/libavutil/Makefile
+++ b/libavutil/Makefile
@@ -29,6 +29,7 @@ HEADERS = adler32.h                                                     \
           fifo.h                                                        \
           file.h                                                        \
           frame.h                                                       \
+          greenmetadata.h                                               \
           hash.h                                                        \
           hmac.h                                                        \
           imgutils.h                                                    \
@@ -105,6 +106,7 @@ OBJS = adler32.o                                                        \
        float_dsp.o                                                      \
        fixed_dsp.o                                                      \
        frame.o                                                          \
+       greenmetadata.o                                                  \
        hash.o                                                           \
        hmac.o                                                           \
        imgutils.o                                                       \
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 9c6061a..a6a7fa7 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -112,6 +112,13 @@ enum AVFrameSideDataType {
      * enum AVAudioServiceType defined in avcodec.h.
      */
     AV_FRAME_DATA_AUDIO_SERVICE_TYPE,
+
+    /**
+     * This side data must be associated with an video frame and corresponds to
+     * enum GreenMDataType defined in avcodec.h. The green metadata specicification
+     * is given in ISO/IEC 23001.
+     */
+    AV_FRAME_DATA_GREENMD,
 };
 
 enum AVActiveFormatDescription {
diff --git a/libavutil/greenmetadata.c b/libavutil/greenmetadata.c
index e69de29..9e448c8 100644
--- a/libavutil/greenmetadata.c
+++ b/libavutil/greenmetadata.c
@@ -0,0 +1,23 @@
+#include <libavutil/greenmetadata.h>
+
+void av_greenmetadata_set(uint8_t allocated_md[sizeof(GreenMetaData)],
+                          GreenMetaData GreenInfo)
+{
+    memset(allocated_md, 0, sizeof(GreenMetaData));
+
+    allocated_md[0]=GreenInfo.green_metadata_type;
+    allocated_md[1]=GreenInfo.period_type;
+    allocated_md[2]=(uint8_t)(GreenInfo.num_seconds>>8);
+    allocated_md[3]=(uint8_t)(GreenInfo.num_seconds&0xFF);
+    allocated_md[4]=(uint8_t)(GreenInfo.num_pictures>>8);
+    allocated_md[5]=(uint8_t)(GreenInfo.num_pictures&0xFF);
+    allocated_md[6]=GreenInfo.percent_non_zero_macroblocks;
+    allocated_md[7]=GreenInfo.percent_intra_coded_macroblocks;
+    allocated_md[8]=GreenInfo.percent_six_tap_filtering;
+    allocated_md[9]=GreenInfo.percent_alpha_point_deblocking_instance;
+    allocated_md[10]=GreenInfo.xsd_metric_type;
+    allocated_md[11]=(uint8_t)(GreenInfo.xsd_metric_value>>8);
+    allocated_md[12]=(uint8_t)(GreenInfo.xsd_metric_value&0xFF);
+
+    return;
+}
diff --git a/libavutil/greenmetadata.h b/libavutil/greenmetadata.h
index e69de29..7b383e7 100644
--- a/libavutil/greenmetadata.h
+++ b/libavutil/greenmetadata.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2015 Nicolas DEROUINEAU <nicolas.derouin...@vitec.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_GREENMD_H
+#define AVUTIL_GREENMD_H
+
+#include <stdint.h>
+#include <libavcodec/h264.h>
+#include <string.h>
+
+/**
+ * Initialize a metadata structure containing frame information concerning its decoding complexity
+ *
+ * @param an allocated metadata structure (will be fully overwritten
+ *               by this function)
+ * @param GreenMetadataInformation.
+ */
+
+void av_greenmetadata_set(uint8_t allocated_md[sizeof(GreenMetaData)], GreenMetaData GreenInfo);
+
+#endif /* AVUTIL_GREENMD_H */
-- 
1.9.1

From 082065e3f9950d4475d20fc4613eaddb6bc66b1a Mon Sep 17 00:00:00 2001
From: Nicolas DEROUINEAU <nicolas.derouin...@vitec.com>
Date: Wed, 23 Dec 2015 12:15:17 +0100
Subject: [PATCH 1/2] Adding frame side data about green metadata

---
 libavutil/greenmetadata.c | 0
 libavutil/greenmetadata.h | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 libavutil/greenmetadata.c
 create mode 100644 libavutil/greenmetadata.h

diff --git a/libavutil/greenmetadata.c b/libavutil/greenmetadata.c
new file mode 100644
index 0000000..e69de29
diff --git a/libavutil/greenmetadata.h b/libavutil/greenmetadata.h
new file mode 100644
index 0000000..e69de29
-- 
1.9.1

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

Reply via email to