From ecd3087ee009d4b8dd9a5d45c8278f0e8938e7d1 Mon Sep 17 00:00:00 2001 From: "Xiang, Haihao" Date: Wed, 28 Nov 2012 08:27:41 +0800 Subject: [PATCH] mpeg2enc: Keep the packed data consistent with each parameters So update paramters before packing SPS/PPS data buffers Signed-off-by: Xiang, Haihao --- test/encode/mpeg2enc.c | 52 +++++++++++++++++++++++++++++++++----------------- 1 file 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); -- 2.7.4