diff options
author | Xiang, Haihao <haihao.xiang@intel.com> | 2012-11-27 16:24:07 +0800 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2013-05-28 16:46:48 +0800 |
commit | 6f4a1d9921c4dd249401dbedff0c53678c6419d8 (patch) | |
tree | 569fa38258d849a83d20036268a37564bbb71cbd /test/encode/mpeg2enc.c | |
parent | 1103936d73f4c5664e0b5824ff64bdf4059f5607 (diff) |
mpeg2enc: update time_code for the new GOP
Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
Diffstat (limited to 'test/encode/mpeg2enc.c')
-rw-r--r-- | test/encode/mpeg2enc.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/test/encode/mpeg2enc.c b/test/encode/mpeg2enc.c index 3054849..b37095a 100644 --- a/test/encode/mpeg2enc.c +++ b/test/encode/mpeg2enc.c @@ -816,6 +816,39 @@ mpeg2enc_init(struct mpeg2enc_context *ctx) ctx); } +static int +mpeg2enc_time_code(VAEncSequenceParameterBufferMPEG2 *seq_param, + int num_frames) +{ + int fps = (int)(seq_param->frame_rate + 0.5); + int time_code = 0; + int time_code_pictures, time_code_seconds, time_code_minutes, time_code_hours; + int drop_frame_flag = 0; + + assert(fps <= 60); + + time_code_seconds = num_frames / fps; + time_code_pictures = num_frames % fps; + time_code |= time_code_pictures; + + time_code_minutes = time_code_minutes / 60; + time_code_seconds = time_code_minutes % 60; + time_code |= (time_code_seconds << 6); + + time_code_hours = time_code_minutes / 60; + time_code_minutes = time_code_minutes % 60; + + time_code |= (1 << 12); /* marker_bit */ + time_code |= (time_code_minutes << 13); + + time_code_hours = time_code_hours % 24; + time_code |= (time_code_hours << 19); + + time_code |= (drop_frame_flag << 24); + + return time_code; +} + /* * run */ @@ -825,6 +858,7 @@ mpeg2enc_update_picture_parameter(struct mpeg2enc_context *ctx, int coded_order, int display_order) { + VAEncSequenceParameterBufferMPEG2 *seq_param; VAEncPictureParameterBufferMPEG2 *pic_param; VAStatus va_status; @@ -845,6 +879,12 @@ 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 |