summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiang, Haihao <haihao.xiang@intel.com>2012-11-28 08:27:41 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2012-12-07 16:05:34 +0800
commitecd3087ee009d4b8dd9a5d45c8278f0e8938e7d1 (patch)
tree0988700f29a88a0e8c4906dc8c0aa72b80c0b41e
parent5cf591faf2e50ccf55d32c272b4b795023af9752 (diff)
downloadlibva-ecd3087ee009d4b8dd9a5d45c8278f0e8938e7d1.tar.gz
mpeg2enc: Keep the packed data consistent with each parameters
So update paramters before packing SPS/PPS data buffers Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
-rw-r--r--test/encode/mpeg2enc.c52
1 files changed, 35 insertions, 17 deletions
diff --git a/test/encode/mpeg2enc.c b/test/encode/mpeg2enc.c
index 185a7ea..73f66be 100644
--- a/test/encode/mpeg2enc.c
+++ b/test/encode/mpeg2enc.c
@@ -854,25 +854,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,
@@ -881,12 +902,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
@@ -948,6 +963,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);
@@ -1208,7 +1226,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);