[Libva] [PATCH 1/3] MVC: Add prefix nal and extension slice header writing utility

Li Xiaowei xiaowei.a.li at intel.com
Thu Dec 19 02:15:25 PST 2013


Signed-off-by: Li Xiaowei <xiaowei.a.li at intel.com>
---
 src/i965_drv_video.h     |    1 +
 src/i965_encoder_utils.c |   67 ++++++++++++++++++++++++++++++++++++++++++++++
 src/i965_encoder_utils.h |   11 ++++++++
 3 files changed, 79 insertions(+)

diff --git a/src/i965_drv_video.h b/src/i965_drv_video.h
index 884a09f..5336c35 100644
--- a/src/i965_drv_video.h
+++ b/src/i965_drv_video.h
@@ -32,6 +32,7 @@
 
 #include <va/va.h>
 #include <va/va_enc_h264.h>
+#include <va/va_enc_mvc.h>
 #include <va/va_enc_mpeg2.h>
 #include <va/va_vpp.h>
 #include <va/va_backend.h>
diff --git a/src/i965_encoder_utils.c b/src/i965_encoder_utils.c
index abd25b4..1184046 100644
--- a/src/i965_encoder_utils.c
+++ b/src/i965_encoder_utils.c
@@ -28,6 +28,7 @@
 
 #include <va/va.h>
 #include <va/va_enc_h264.h>
+#include <va/va_enc_mvc.h>
 #include <va/va_enc_mpeg2.h>
 
 #include "i965_encoder_utils.h"
@@ -44,6 +45,8 @@
 #define NAL_SPS                 7
 #define NAL_PPS                 8
 #define NAL_SEI                 6
+#define NAL_PREFIX              14
+#define NAL_SLICE_EXTENSION     20
 
 #define SLICE_TYPE_P            0
 #define SLICE_TYPE_B            1
@@ -199,6 +202,25 @@ static void nal_header(avc_bitstream *bs, int nal_ref_idc, int nal_unit_type)
     avc_bitstream_put_ui(bs, nal_unit_type, 5);
 }
 
+static void
+nal_header_mvc_extension(avc_bitstream *bs,
+                     VAEncSequenceParameterBufferMVC *mvc_sps_param,
+                     VAEncPictureParameterBufferMVC  *mvc_pic_param,
+                     VAEncSliceParameterBufferH264   *slice_param)
+{
+    VAEncPictureParameterBufferH264 *pic_param = &mvc_pic_param->base;
+    int non_idr = !pic_param->pic_fields.bits.idr_pic_flag;
+
+    avc_bitstream_put_ui(bs, 0, 1);                             /* svc extension flag */
+    avc_bitstream_put_ui(bs, non_idr, 1);                       /* non_idr_flag */
+    avc_bitstream_put_ui(bs, 5, 6);                             /* priority_id */
+    avc_bitstream_put_ui(bs, mvc_pic_param->view_id, 10);       /* view_id */
+    avc_bitstream_put_ui(bs, 0, 3);                             /* temporal_id */
+    avc_bitstream_put_ui(bs, mvc_pic_param->anchor_pic_flag, 1);/* anchor_pic_flag */
+    avc_bitstream_put_ui(bs, mvc_pic_param->inter_view_flag, 1);/* inter_view_flag */
+    avc_bitstream_put_ui(bs, 1, 1);                             /* reserved_one_bit */
+}
+
 static void 
 slice_header(avc_bitstream *bs,
              VAEncSequenceParameterBufferH264 *sps_param,
@@ -496,3 +518,48 @@ build_mpeg2_slice_header(VAEncSequenceParameterBufferMPEG2 *sps_param,
 
     return bs.bit_offset;
 }
+
+int
+build_avc_mvc_prefix_nal_unit(VAEncSequenceParameterBufferMVC *mvc_sps_param,
+                              VAEncPictureParameterBufferMVC  *mvc_pic_param,
+                              VAEncSliceParameterBufferH264   *slice_param,
+                              unsigned char **nal_unit_buffer)
+{
+    VAEncPictureParameterBufferH264 *pic_param = &mvc_pic_param->base;
+    int is_ref = !!pic_param->pic_fields.bits.reference_pic_flag;
+    avc_bitstream bs;
+
+    avc_bitstream_start(&bs);
+    nal_start_code_prefix(&bs);
+
+    nal_header(&bs, is_ref ? NAL_REF_IDC_LOW : NAL_REF_IDC_NONE, NAL_PREFIX);
+    nal_header_mvc_extension(&bs, mvc_sps_param, mvc_pic_param, slice_param);
+
+    avc_bitstream_end(&bs);
+    *nal_unit_buffer = (unsigned char *)bs.buffer;
+
+    return bs.bit_offset;
+}
+
+int
+build_avc_mvc_slice_header(VAEncSequenceParameterBufferMVC *mvc_sps_param,
+                           VAEncPictureParameterBufferMVC  *mvc_pic_param,
+                           VAEncSliceParameterBufferH264   *slice_param,
+                           unsigned char **slice_header_buffer)
+{
+    avc_bitstream bs;
+    VAEncPictureParameterBufferH264 *pic_param = &mvc_pic_param->base;
+    int is_ref = !!pic_param->pic_fields.bits.reference_pic_flag;
+
+    avc_bitstream_start(&bs);
+    nal_start_code_prefix(&bs);
+
+    nal_header(&bs, is_ref ? NAL_REF_IDC_HIGH : NAL_REF_IDC_NONE, NAL_SLICE_EXTENSION);
+    nal_header_mvc_extension(&bs, mvc_sps_param, mvc_pic_param, slice_param);
+    slice_header(&bs, &mvc_sps_param->base, &mvc_pic_param->base, slice_param);
+
+    avc_bitstream_end(&bs);
+    *slice_header_buffer = (unsigned char *)bs.buffer;
+
+    return bs.bit_offset;
+}
diff --git a/src/i965_encoder_utils.h b/src/i965_encoder_utils.h
index 8c6299c..c11334a 100644
--- a/src/i965_encoder_utils.h
+++ b/src/i965_encoder_utils.h
@@ -33,4 +33,15 @@ build_mpeg2_slice_header(VAEncSequenceParameterBufferMPEG2 *sps_param,
                          VAEncSliceParameterBufferMPEG2 *slice_param,
                          unsigned char **slice_header_buffer);
 
+int
+build_avc_mvc_prefix_nal_unit(VAEncSequenceParameterBufferMVC *mvc_sps_param,
+                              VAEncPictureParameterBufferMVC  *mvc_pic_param,
+                              VAEncSliceParameterBufferH264   *slice_param,
+                              unsigned char **nal_unit_buffer);
+int
+build_avc_mvc_slice_header(VAEncSequenceParameterBufferMVC *mvc_sps_param,
+                           VAEncPictureParameterBufferMVC  *mvc_pic_param,
+                           VAEncSliceParameterBufferH264   *slice_param,
+                           unsigned char **slice_header_buffer);
+
 #endif /* __I965_ENCODER_UTILS_H__ */
-- 
1.7.9.5



More information about the Libva mailing list