mpeg2enc: Keep the packed data consistent with each parameters
authorXiang, Haihao <haihao.xiang@intel.com>
Wed, 28 Nov 2012 00:27:41 +0000 (08:27 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Tue, 28 May 2013 08:46:48 +0000 (16:46 +0800)
So update paramters before packing SPS/PPS data buffers

Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
test/encode/mpeg2enc.c

index b37095a..1f5aafd 100644 (file)
@@ -852,25 +852,46 @@ mpeg2enc_time_code(VAEncSequenceParameterBufferMPEG2 *seq_param,
 /*
  * run
  */
-static void 
+static void
+mpeg2enc_update_sequence_parameter(struct mpeg2enc_context *ctx,
+                                   VAEncPictureType picture_type,
+                                   int coded_order,
+                                   int display_order)
+{
+    VAEncSequenceParameterBufferMPEG2 *seq_param = &ctx->seq_param;
+
+    /* update the GOP info for the new GOP */
+    if (display_order % ctx->intra_period == 0) {
+        seq_param->gop_header.bits.time_code = mpeg2enc_time_code(seq_param, display_order);
+    }
+}
+
+static void
 mpeg2enc_update_picture_parameter(struct mpeg2enc_context *ctx,
-                                 VAEncPictureType picture_type,
-                                 int coded_order,
-                                 int display_order)
+                                  VAEncPictureType picture_type,
+                                  int coded_order,
+                                  int display_order)
 {
-    VAEncSequenceParameterBufferMPEG2 *seq_param;
-    VAEncPictureParameterBufferMPEG2 *pic_param;
-    VAStatus va_status;
+    VAEncPictureParameterBufferMPEG2 *pic_param = &ctx->pic_param;
 
-    // Picture level
-    pic_param = &ctx->pic_param;
     pic_param->picture_type = picture_type;
     pic_param->temporal_reference = display_order % ctx->intra_period;
     pic_param->reconstructed_picture = surface_ids[SID_RECON_PICTURE];
     pic_param->forward_reference_picture = surface_ids[SID_REFERENCE_PICTURE_L0];
     pic_param->backward_reference_picture = surface_ids[SID_REFERENCE_PICTURE_L1];
-    pic_param->coded_buf = ctx->codedbuf_buf_id;
+}
+
+static void
+mpeg2enc_update_picture_parameter_buffer(struct mpeg2enc_context *ctx,
+                                         VAEncPictureType picture_type,
+                                         int coded_order,
+                                         int display_order)
+{
+    VAEncPictureParameterBufferMPEG2 *pic_param = &ctx->pic_param;
+    VAStatus va_status;
 
+    /* update the coded buffer id */
+    pic_param->coded_buf = ctx->codedbuf_buf_id;
     va_status = vaCreateBuffer(ctx->va_dpy,
                                ctx->context_id,
                                VAEncPictureParameterBufferType,
@@ -879,12 +900,6 @@ mpeg2enc_update_picture_parameter(struct mpeg2enc_context *ctx,
                                pic_param,
                                &ctx->pic_param_buf_id);
     CHECK_VASTATUS(va_status, "vaCreateBuffer");
-
-    seq_param = &ctx->seq_param;
-
-    if (pic_param->temporal_reference == 0) {   /* I frame */
-        seq_param->gop_header.bits.time_code = mpeg2enc_time_code(seq_param, display_order); /* bit12: marker_bit */
-    }
 }
 
 static void 
@@ -946,6 +961,9 @@ begin_picture(struct mpeg2enc_context *ctx,
     ctx->current_input_surface = ctx->current_upload_surface;
     ctx->current_upload_surface = tmp;
 
+    mpeg2enc_update_sequence_parameter(ctx, picture_type, coded_order, display_order);
+    mpeg2enc_update_picture_parameter(ctx, picture_type, coded_order, display_order);
+
     if (coded_order == 0) {
         assert(picture_type == VAEncPictureTypeIntra);
         length_in_bits = build_packed_seq_buffer(&ctx->seq_param, &packed_seq_buffer);
@@ -1206,7 +1224,7 @@ encode_picture(struct mpeg2enc_context *ctx,
         CHECK_VASTATUS(va_status,"vaCreateBuffer");
 
         /* picture parameter set */
-        mpeg2enc_update_picture_parameter(ctx, picture_type, coded_order, display_order);
+        mpeg2enc_update_picture_parameter_buffer(ctx, picture_type, coded_order, display_order);
 
         mpeg2enc_render_picture(ctx);