From e272a93ebccb44b8b78b238e617137708f08c94d Mon Sep 17 00:00:00 2001 From: Austin Yuan Date: Thu, 4 Mar 2010 17:54:20 +0800 Subject: [PATCH] Fix test/./h264encode.c issue Signed-off-by: Austin Yuan --- test/encode/h264encode.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/test/encode/h264encode.c b/test/encode/h264encode.c index 46f1ff6..7b8a0b0 100644 --- a/test/encode/h264encode.c +++ b/test/encode/h264encode.c @@ -212,10 +212,11 @@ static int do_h264_encoding(void) VAEncPictureParameterBufferH264 pic_h264; VAEncSliceParameterBuffer slice_h264; VAStatus va_status; - VABufferID coded_buf, seq_param_buf, pic_param_buf, slice_param_buf; + VABufferID seq_param_buf, pic_param_buf, slice_param_buf; int codedbuf_size; VASurfaceStatus surface_status; int src_surface, dst_surface, ref_surface; + int codedbuf_idx = 0; int frame_skipped = 0; int i; @@ -229,12 +230,24 @@ static int do_h264_encoding(void) codedbuf_size = (frame_width * frame_height * 400) / (16*16); + for (i = 0; i < CODEDBUF_NUM; i++) { + /* create coded buffer once for all + * other VA buffers which won't be used again after vaRenderPicture. + * so APP can always vaCreateBuffer for every frame + * but coded buffer need to be mapped and accessed after vaRenderPicture/vaEndPicture + * so VA won't maintain the coded buffer + */ + va_status = vaCreateBuffer(va_dpy,context_id,VAEncCodedBufferType, + codedbuf_size, 1, NULL, &coded_buf[i]); + CHECK_VASTATUS(va_status,"vaBeginPicture"); + } + src_surface = 0; /* the last two frames are reference/reconstructed frame */ dst_surface = SURFACE_NUM - 1; ref_surface = SURFACE_NUM - 2; - for (i=0; i < frame_count; i++) { + for (i=0; i < (frame_count - 2); i++) { va_status = vaBeginPicture(va_dpy, context_id, surface_id[src_surface]); CHECK_VASTATUS(va_status,"vaBeginPicture"); @@ -249,7 +262,7 @@ static int do_h264_encoding(void) seq_h264.frame_rate = frame_rate; seq_h264.initial_qp = initial_qp; seq_h264.min_qp = minimal_qp; - seq_h264.basic_unit_size = 6; + seq_h264.basic_unit_size = 0; seq_h264.intra_period = intra_count; va_status = vaCreateBuffer(va_dpy, context_id, @@ -261,12 +274,10 @@ static int do_h264_encoding(void) CHECK_VASTATUS(va_status,"vaRenderPicture");; } - va_status = vaCreateBuffer(va_dpy,context_id,VAEncCodedBufferType, - codedbuf_size, 1, NULL, &coded_buf); pic_h264.reference_picture = surface_id[ref_surface]; pic_h264.reconstructed_picture= surface_id[dst_surface]; - pic_h264.coded_buf = coded_buf; + pic_h264.coded_buf = coded_buf[codedbuf_idx]; pic_h264.picture_width = frame_width; pic_h264.picture_height = frame_height; pic_h264.last_picture = (i==frame_count); @@ -300,7 +311,7 @@ static int do_h264_encoding(void) va_status = vaQuerySurfaceStatus(va_dpy, surface_id[src_surface],&surface_status); frame_skipped = (surface_status & VASurfaceSkipped); - save_coded_buf(coded_buf, i, frame_skipped); + save_coded_buf(coded_buf[codedbuf_idx], i, frame_skipped); /* should display reconstructed frame, but just diplay source frame */ if (frame_display) { @@ -316,6 +327,11 @@ static int do_h264_encoding(void) if (src_surface == (SURFACE_NUM - 2)) src_surface = 0; + /* use next codedbuf */ + codedbuf_idx++; + if (codedbuf_idx == (CODEDBUF_NUM - 1)) + codedbuf_idx = 0; + /* if a frame is skipped, current frame still use last reference frame */ if (frame_skipped == 0) { /* swap ref/dst */ @@ -375,7 +391,8 @@ int main(int argc,char **argv) case '?': printf("./h264encode \n"); printf(" -w -h: resolution\n"); - printf(" -n frame number\n"); + printf(" -n frame number\n"); + printf(" -d display the source frame\n"); printf(" -p P frame count between two I frames\n"); printf(" -f frame rate\n"); printf(" -r bit rate\n"); -- 2.7.4