Commit e272a93e authored by Austin Yuan's avatar Austin Yuan

Fix test/./h264encode.c issue

Signed-off-by: default avatarAustin Yuan <shengquan.yuan@intel.com>
parent 7520c3b0
...@@ -212,10 +212,11 @@ static int do_h264_encoding(void) ...@@ -212,10 +212,11 @@ static int do_h264_encoding(void)
VAEncPictureParameterBufferH264 pic_h264; VAEncPictureParameterBufferH264 pic_h264;
VAEncSliceParameterBuffer slice_h264; VAEncSliceParameterBuffer slice_h264;
VAStatus va_status; 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; int codedbuf_size;
VASurfaceStatus surface_status; VASurfaceStatus surface_status;
int src_surface, dst_surface, ref_surface; int src_surface, dst_surface, ref_surface;
int codedbuf_idx = 0;
int frame_skipped = 0; int frame_skipped = 0;
int i; int i;
...@@ -229,12 +230,24 @@ static int do_h264_encoding(void) ...@@ -229,12 +230,24 @@ static int do_h264_encoding(void)
codedbuf_size = (frame_width * frame_height * 400) / (16*16); 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; src_surface = 0;
/* the last two frames are reference/reconstructed frame */ /* the last two frames are reference/reconstructed frame */
dst_surface = SURFACE_NUM - 1; dst_surface = SURFACE_NUM - 1;
ref_surface = SURFACE_NUM - 2; 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]); va_status = vaBeginPicture(va_dpy, context_id, surface_id[src_surface]);
CHECK_VASTATUS(va_status,"vaBeginPicture"); CHECK_VASTATUS(va_status,"vaBeginPicture");
...@@ -249,7 +262,7 @@ static int do_h264_encoding(void) ...@@ -249,7 +262,7 @@ static int do_h264_encoding(void)
seq_h264.frame_rate = frame_rate; seq_h264.frame_rate = frame_rate;
seq_h264.initial_qp = initial_qp; seq_h264.initial_qp = initial_qp;
seq_h264.min_qp = minimal_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; seq_h264.intra_period = intra_count;
va_status = vaCreateBuffer(va_dpy, context_id, va_status = vaCreateBuffer(va_dpy, context_id,
...@@ -261,12 +274,10 @@ static int do_h264_encoding(void) ...@@ -261,12 +274,10 @@ static int do_h264_encoding(void)
CHECK_VASTATUS(va_status,"vaRenderPicture");; 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.reference_picture = surface_id[ref_surface];
pic_h264.reconstructed_picture= surface_id[dst_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_width = frame_width;
pic_h264.picture_height = frame_height; pic_h264.picture_height = frame_height;
pic_h264.last_picture = (i==frame_count); pic_h264.last_picture = (i==frame_count);
...@@ -300,7 +311,7 @@ static int do_h264_encoding(void) ...@@ -300,7 +311,7 @@ static int do_h264_encoding(void)
va_status = vaQuerySurfaceStatus(va_dpy, surface_id[src_surface],&surface_status); va_status = vaQuerySurfaceStatus(va_dpy, surface_id[src_surface],&surface_status);
frame_skipped = (surface_status & VASurfaceSkipped); 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 */ /* should display reconstructed frame, but just diplay source frame */
if (frame_display) { if (frame_display) {
...@@ -316,6 +327,11 @@ static int do_h264_encoding(void) ...@@ -316,6 +327,11 @@ static int do_h264_encoding(void)
if (src_surface == (SURFACE_NUM - 2)) if (src_surface == (SURFACE_NUM - 2))
src_surface = 0; 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 a frame is skipped, current frame still use last reference frame */
if (frame_skipped == 0) { if (frame_skipped == 0) {
/* swap ref/dst */ /* swap ref/dst */
...@@ -375,7 +391,8 @@ int main(int argc,char **argv) ...@@ -375,7 +391,8 @@ int main(int argc,char **argv)
case '?': case '?':
printf("./h264encode <options>\n"); printf("./h264encode <options>\n");
printf(" -w -h: resolution\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(" -p P frame count between two I frames\n");
printf(" -f frame rate\n"); printf(" -f frame rate\n");
printf(" -r bit rate\n"); printf(" -r bit rate\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment