[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