[Libva] [PATCH 3/3] MVC: Pack prefix nal and ext slice header to compressed bitstream

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


Signed-off-by: Li Xiaowei <xiaowei.a.li at intel.com>
---
 src/gen75_mfc.c |  159 +++++++++++++++++++++++++++++++++++++++++++++----------
 src/gen75_vme.c |    5 +-
 2 files changed, 134 insertions(+), 30 deletions(-)

diff --git a/src/gen75_mfc.c b/src/gen75_mfc.c
index 7161acd..9bf0f98 100644
--- a/src/gen75_mfc.c
+++ b/src/gen75_mfc.c
@@ -427,7 +427,8 @@ static void gen75_mfc_init(VADriverContextP ctx,
     int height_in_mbs = 0;
     int slice_batchbuffer_size;
 
-    if (encoder_context->codec == CODEC_H264) {
+    if (encoder_context->codec == CODEC_H264 ||
+        encoder_context->codec == CODEC_H264_MVC) {
         VAEncSequenceParameterBufferH264 *pSequenceParameter = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
         width_in_mbs = pSequenceParameter->picture_width_in_mbs;
         height_in_mbs = pSequenceParameter->picture_height_in_mbs;
@@ -1182,22 +1183,75 @@ gen75_mfc_avc_pipeline_slice_programing(VADriverContextP ctx,
     assert(pPicParameter->pic_init_qp >= 0 && pPicParameter->pic_init_qp < 52);
     assert(qp >= 0 && qp < 52);
 
-    gen75_mfc_avc_slice_state(ctx, 
-                              pPicParameter,
-                              pSliceParameter,
-                              encode_state, encoder_context,
-                              (rate_control_mode == VA_RC_CBR), qp, slice_batch);
-
-    if ( slice_index == 0) 
-        intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
+    if (encoder_context->codec == CODEC_H264_MVC) {
+          VAEncSequenceParameterBufferMVC *mvc_seq_param   = (VAEncSequenceParameterBufferMVC *)pSequenceParameter;
+          VAEncPictureParameterBufferMVC  *mvc_pic_param   = (VAEncPictureParameterBufferMVC*)pPicParameter;
+          VAEncSliceParameterBufferH264   *mvc_slice_param = pSliceParameter;
+
+          gen75_mfc_avc_slice_state(ctx,
+                                    pPicParameter,
+                                    pSliceParameter,
+                                    encode_state, encoder_context,
+                                    (rate_control_mode == VA_RC_CBR), qp, slice_batch);
+
+          if (slice_index == 0)
+             intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
+
+          if (mvc_pic_param->view_id != 0) {
+               /* generate one extension slice header with type of 20 */
+               slice_header_length_in_bits = build_avc_mvc_slice_header(mvc_seq_param,
+                                                                        mvc_pic_param,
+                                                                        mvc_slice_param,
+                                                                        &slice_header);
+               mfc_context->insert_object(ctx, encoder_context,
+                                         (unsigned int *)slice_header, ALIGN(slice_header_length_in_bits, 32) >> 5, slice_header_length_in_bits & 0x1f,
+                                          8,  /* first 5 bytes are start code + nal unit type */
+                                          1, 0, 1, slice_batch);
+               free(slice_header);
+
+           } else {
+                /* generate one mvc prefix nal */
+               slice_header_length_in_bits = build_avc_mvc_prefix_nal_unit(mvc_seq_param,
+                                                                           mvc_pic_param,
+                                                                           mvc_slice_param,
+                                                                           &slice_header);
+               mfc_context->insert_object(ctx, encoder_context,
+                                          (unsigned int *)slice_header, ALIGN(slice_header_length_in_bits, 32) >> 5, slice_header_length_in_bits & 0x1f,
+                                          8,  /* first 8 bytes are start code + nal unit type + svc ext flag +  mvc nal extension */
+                                          0, 0, 1, slice_batch);
+               free(slice_header);
+
+               /* generate one common H264 slice header */
+               slice_header_length_in_bits = build_avc_slice_header(pSequenceParameter,
+                                                                    pPicParameter,
+                                                                    pSliceParameter,
+                                                                    &slice_header);
+
+               mfc_context->insert_object(ctx, encoder_context,
+                                          (unsigned int *)slice_header, ALIGN(slice_header_length_in_bits, 32) >> 5, slice_header_length_in_bits & 0x1f,
+                                          5,  /* first 5 bytes are start code + nal unit type */
+                                          1, 0, 1, slice_batch);
+               free(slice_header);
+         }
 
-    slice_header_length_in_bits = build_avc_slice_header(pSequenceParameter, pPicParameter, pSliceParameter, &slice_header);
-
-    // slice hander
-    mfc_context->insert_object(ctx, encoder_context,
-                               (unsigned int *)slice_header, ALIGN(slice_header_length_in_bits, 32) >> 5, slice_header_length_in_bits & 0x1f,
-                               5,  /* first 5 bytes are start code + nal unit type */
-                               1, 0, 1, slice_batch);
+    } else {
+         gen75_mfc_avc_slice_state(ctx,
+                                  pPicParameter,
+                                  pSliceParameter,
+                                  encode_state, encoder_context,
+                                  (rate_control_mode == VA_RC_CBR), qp, slice_batch);
+
+        if ( slice_index == 0)
+            intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
+
+         slice_header_length_in_bits = build_avc_slice_header(pSequenceParameter, pPicParameter, pSliceParameter, &slice_header);
+
+         // slice hander
+         mfc_context->insert_object(ctx, encoder_context,
+                                   (unsigned int *)slice_header, ALIGN(slice_header_length_in_bits, 32) >> 5, slice_header_length_in_bits & 0x1f,
+                                    5,  /* first 5 bytes are start code + nal unit type */
+                                    1, 0, 1, slice_batch);
+    }
 
     dri_bo_map(vme_context->vme_output.bo , 1);
     msg_ptr = (unsigned char *)vme_context->vme_output.bo->virtual;
@@ -1543,20 +1597,65 @@ gen75_mfc_avc_batchbuffer_slice(VADriverContextP ctx,
     if (slice_index == 0)
         intel_mfc_avc_pipeline_header_programing(ctx, encode_state, encoder_context, slice_batch);
 
-    slice_header_length_in_bits = build_avc_slice_header(pSequenceParameter, pPicParameter, pSliceParameter, &slice_header);
 
-    // slice hander
-    mfc_context->insert_object(ctx,
-                               encoder_context,
-                               (unsigned int *)slice_header,
-                               ALIGN(slice_header_length_in_bits, 32) >> 5,
-                               slice_header_length_in_bits & 0x1f,
-                               5,  /* first 5 bytes are start code + nal unit type */
-                               1,
-                               0,
-                               1,
-                               slice_batch);
-    free(slice_header);
+    if (encoder_context->codec == CODEC_H264_MVC) {
+        VAEncSequenceParameterBufferMVC *mvc_seq_param   = (VAEncSequenceParameterBufferMVC *)pSequenceParameter;
+        VAEncPictureParameterBufferMVC  *mvc_pic_param   = (VAEncPictureParameterBufferMVC*)pPicParameter;
+        VAEncSliceParameterBufferH264   *slice_param     = pSliceParameter;
+
+        if (mvc_pic_param->view_id != 0) {
+            /* generate one extension slice header with type of 20 */
+            slice_header_length_in_bits = build_avc_mvc_slice_header(mvc_seq_param,
+                                                                     mvc_pic_param,
+                                                                     slice_param,
+                                                                     &slice_header);
+            mfc_context->insert_object(ctx, encoder_context,
+                                       (unsigned int *)slice_header, ALIGN(slice_header_length_in_bits, 32) >> 5, slice_header_length_in_bits & 0x1f,
+                                       8,  /* first 5 bytes are start code + nal unit type */
+                                       1, 0, 1, slice_batch);
+            free(slice_header);
+
+         } else {
+            /* generate one mvc prefix nal */
+            slice_header_length_in_bits = build_avc_mvc_prefix_nal_unit(mvc_seq_param,
+                                                                        mvc_pic_param,
+                                                                        slice_param,
+                                                                        &slice_header);
+            mfc_context->insert_object(ctx, encoder_context,
+                                       (unsigned int *)slice_header, ALIGN(slice_header_length_in_bits, 32) >> 5, slice_header_length_in_bits & 0x1f,
+                                       8,  /* first 8 bytes are start code + nal unit type + svc ext flag +  mvc nal extension */
+                                       0, 0, 1, slice_batch);
+            free(slice_header);
+
+            /* generate common H264 slice header */
+            slice_header_length_in_bits = build_avc_slice_header(pSequenceParameter,
+                                                                 pPicParameter,
+                                                                 pSliceParameter,
+                                                                 &slice_header);
+            mfc_context->insert_object(ctx, encoder_context,
+                                       (unsigned int *)slice_header, ALIGN(slice_header_length_in_bits, 32) >> 5, slice_header_length_in_bits & 0x1f,
+                                       5,  /* first 5 bytes are start code + nal unit type */
+                                       1, 0, 1, slice_batch);
+            free(slice_header);
+       }
+
+    } else {
+
+        slice_header_length_in_bits = build_avc_slice_header(pSequenceParameter, pPicParameter, pSliceParameter, &slice_header);
+
+        // slice hander
+        mfc_context->insert_object(ctx,
+                                   encoder_context,
+                                   (unsigned int *)slice_header,
+                                   ALIGN(slice_header_length_in_bits, 32) >> 5,
+                                   slice_header_length_in_bits & 0x1f,
+                                   5,  /* first 5 bytes are start code + nal unit type */
+                                   1,
+                                   0,
+                                   1,
+                                   slice_batch);
+        free(slice_header);
+    }
 
     intel_batchbuffer_align(slice_batch, 16); /* aligned by an Oword */
     head_offset = intel_batchbuffer_used_size(slice_batch);
@@ -2534,6 +2633,8 @@ static VAStatus gen75_mfc_pipeline(VADriverContextP ctx,
     case VAProfileH264ConstrainedBaseline:
     case VAProfileH264Main:
     case VAProfileH264High:
+    case VAProfileH264MultiviewHigh:
+    case VAProfileH264StereoHigh:
         vaStatus = gen75_mfc_avc_encode_picture(ctx, encode_state, encoder_context);
         break;
 
diff --git a/src/gen75_vme.c b/src/gen75_vme.c
index 7f788b8..c53a41f 100644
--- a/src/gen75_vme.c
+++ b/src/gen75_vme.c
@@ -336,7 +336,8 @@ static VAStatus gen75_vme_constant_setup(VADriverContextP ctx,
 
     vme_state_message = (unsigned int *)vme_context->vme_state_message;
 
-    if (encoder_context->codec == CODEC_H264) {
+    if (encoder_context->codec == CODEC_H264 ||
+        encoder_context->codec == CODEC_H264_MVC) {
         if (vme_context->h264_level >= 30) {
             mv_num = 16;
         
@@ -462,6 +463,7 @@ static VAStatus gen75_vme_vme_state_setup(VADriverContextP ctx,
 
     switch (encoder_context->codec) {
     case CODEC_H264:
+    case CODEC_H264_MVC:
         gen75_vme_state_setup_fixup(ctx, encode_state, encoder_context, vme_state_message);
 
         break;
@@ -1010,6 +1012,7 @@ Bool gen75_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *
 
     switch (encoder_context->codec) {
     case CODEC_H264:
+    case CODEC_H264_MVC:
         vme_kernel_list = gen75_vme_kernels;
         encoder_context->vme_pipeline = gen75_vme_pipeline;
        	i965_kernel_num = sizeof(gen75_vme_kernels) / sizeof(struct i965_kernel); 
-- 
1.7.9.5



More information about the Libva mailing list