summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhao Yakui <yakui.zhao@intel.com>2013-08-12 15:13:23 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2013-09-06 15:31:36 +0800
commit272c5a63d1854c391fc302ebdd3a48005a356444 (patch)
tree055780476f786113056b762d792243885e783297
parenta27920e84023e9be75997db6b61bbe94f36f2963 (diff)
Restrict the MV search range based on MPEG2 encoding LEVEL
Signed-off-by: Zhao Yakui <yakui.zhao@intel.com> (cherry picked from commit c05073b1f8764271ccf4fe1aa037f881dedd3818)
-rw-r--r--src/gen6_mfc_common.c18
-rw-r--r--src/gen6_vme.h6
-rw-r--r--src/gen75_vme.c8
-rw-r--r--src/shaders/vme/mpeg2_inter_haswell.asm15
-rw-r--r--src/shaders/vme/mpeg2_inter_haswell.g75b11
5 files changed, 58 insertions, 0 deletions
diff --git a/src/gen6_mfc_common.c b/src/gen6_mfc_common.c
index b77916d..1079044 100644
--- a/src/gen6_mfc_common.c
+++ b/src/gen6_mfc_common.c
@@ -1122,6 +1122,24 @@ void intel_vme_mpeg2_state_setup(VADriverContextP ctx,
VAEncSequenceParameterBufferMPEG2 *seq_param = (VAEncSequenceParameterBufferMPEG2 *)encode_state->seq_param_ext->buffer;
int width_in_mbs = ALIGN(seq_param->picture_width, 16) / 16;
int height_in_mbs = ALIGN(seq_param->picture_height, 16) / 16;
+ uint32_t mv_x, mv_y;
+
+ if (vme_context->mpeg2_level == MPEG2_LEVEL_LOW) {
+ mv_x = 512;
+ mv_y = 64;
+ } else if (vme_context->mpeg2_level == MPEG2_LEVEL_MAIN) {
+ mv_x = 1024;
+ mv_y = 128;
+ } else if (vme_context->mpeg2_level == MPEG2_LEVEL_HIGH) {
+ mv_x = 2048;
+ mv_y = 128;
+ } else {
+ WARN_ONCE("Incorrect Mpeg2 level setting!\n");
+ mv_x = 512;
+ mv_y = 64;
+ }
+
+ vme_state_message[MPEG2_MV_RANGE] = (mv_y << 16) | (mv_x);
vme_state_message[MPEG2_PIC_WIDTH_HEIGHT] = (height_in_mbs << 16) |
width_in_mbs;
diff --git a/src/gen6_vme.h b/src/gen6_vme.h
index 9d7acdf..ab0ff3b 100644
--- a/src/gen6_vme.h
+++ b/src/gen6_vme.h
@@ -85,9 +85,15 @@ struct gen6_vme_context
unsigned int h264_level;
unsigned int video_coding_type;
unsigned int vme_kernel_sum;
+ unsigned int mpeg2_level;
};
#define MPEG2_PIC_WIDTH_HEIGHT 30
+#define MPEG2_MV_RANGE 29
+#define MPEG2_LEVEL_MASK 0x0f
+#define MPEG2_LEVEL_LOW 0x0a
+#define MPEG2_LEVEL_MAIN 0x08
+#define MPEG2_LEVEL_HIGH 0x04
Bool gen75_vme_context_init(VADriverContextP ctx, struct intel_encoder_context *encoder_context);
diff --git a/src/gen75_vme.c b/src/gen75_vme.c
index 41b8564..3935528 100644
--- a/src/gen75_vme.c
+++ b/src/gen75_vme.c
@@ -948,6 +948,14 @@ gen75_vme_mpeg2_prepare(VADriverContextP ctx,
VAStatus vaStatus = VA_STATUS_SUCCESS;
VAEncSliceParameterBufferMPEG2 *slice_param = (VAEncSliceParameterBufferMPEG2 *)encode_state->slice_params_ext[0]->buffer;
+ VAEncSequenceParameterBufferMPEG2 *seq_param = (VAEncSequenceParameterBufferMPEG2 *)encode_state->seq_param_ext->buffer;
+ struct gen6_vme_context *vme_context = encoder_context->vme_context;
+
+ if ((!vme_context->mpeg2_level) ||
+ (vme_context->mpeg2_level != (seq_param->sequence_extension.bits.profile_and_level_indication & MPEG2_LEVEL_MASK))) {
+ vme_context->mpeg2_level = seq_param->sequence_extension.bits.profile_and_level_indication & MPEG2_LEVEL_MASK;
+ }
+
/*Setup all the memory object*/
gen75_vme_mpeg2_surface_setup(ctx, encode_state, slice_param->is_intra_slice, encoder_context);
gen75_vme_interface_setup(ctx, encode_state, encoder_context);
diff --git a/src/shaders/vme/mpeg2_inter_haswell.asm b/src/shaders/vme/mpeg2_inter_haswell.asm
index 17e4843..bd41a90 100644
--- a/src/shaders/vme/mpeg2_inter_haswell.asm
+++ b/src/shaders/vme/mpeg2_inter_haswell.asm
@@ -670,6 +670,21 @@ add (2) TEMP_VAR0.0<1>:w INPUT_ARG0.8<2,2,1>:w INPUT_ARG0.0<2,2,1>:w {align1};
/* The right/bottom coordinate of reference window */
add (1) TEMP_VAR0.16<1>:w TEMP_VAR0.0<0,1,0>:w 48:w {align1};
add (1) TEMP_VAR0.18<1>:w TEMP_VAR0.2<0,1,0>:w 40:w {align1};
+
+/* Firstly the MV range is checked */
+mul (2) TEMP_VAR1.16<1>:w INPUT_ARG1.16<2,2,1>:w -1:w {align1};
+add (2) TEMP_VAR1.0<1>:w INPUT_ARG0.8<2,2,1>:w TEMP_VAR1.16<2,2,1>:w {align1};
+add (2) TEMP_VAR1.4<1>:w INPUT_ARG0.8<2,2,1>:w INPUT_ARG1.16<2,2,1>:w {align1};
+
+cmp.l.f0.0 (1) null:w TEMP_VAR0.0<0,1,0>:w TEMP_VAR1.0<0,1,0>:w {align1};
+(f0.0) mov (1) TEMP_VAR0.0<1>:w TEMP_VAR1.0<0,1,0>:w {align1};
+cmp.g.f0.0 (1) null:w TEMP_VAR0.16<0,1,0>:w TEMP_VAR1.4<0,1,0>:w {align1};
+(f0.0) add (1) TEMP_VAR0.0<1>:w TEMP_VAR1.4<0,1,0>:w -48:w {align1};
+cmp.l.f0.0 (1) null:w TEMP_VAR0.2<0,1,0>:w TEMP_VAR1.2<0,1,0>:w {align1};
+(f0.0) mov (1) TEMP_VAR0.2<1>:w TEMP_VAR1.2<0,1,0>:w {align1};
+cmp.g.f0.0 (1) null:w TEMP_VAR0.18<0,1,0>:w TEMP_VAR1.6<0,1,0>:w {align1};
+(f0.0) add (1) TEMP_VAR0.2<1>:w TEMP_VAR1.6<0,1,0>:w -40:w {align1};
+
x_left_cmp:
cmp.l.f0.0 (1) null:w TEMP_VAR0.0<0,1,0>:w 0:w {align1};
(-f0.0) jmpi (1) x_right_cmp;
diff --git a/src/shaders/vme/mpeg2_inter_haswell.g75b b/src/shaders/vme/mpeg2_inter_haswell.g75b
index b3e67e7..cdaeb4c 100644
--- a/src/shaders/vme/mpeg2_inter_haswell.g75b
+++ b/src/shaders/vme/mpeg2_inter_haswell.g75b
@@ -258,6 +258,17 @@
{ 0x00200040, 0x2f6035ad, 0x00450fa8, 0x00450fa0 },
{ 0x00000040, 0x2f703dad, 0x00000f60, 0x00300030 },
{ 0x00000040, 0x2f723dad, 0x00000f62, 0x00280028 },
+ { 0x00200041, 0x2f903dad, 0x00450fd0, 0xffffffff },
+ { 0x00200040, 0x2f8035ad, 0x00450fa8, 0x00450f90 },
+ { 0x00200040, 0x2f8435ad, 0x00450fa8, 0x00450fd0 },
+ { 0x05000010, 0x200035ac, 0x00000f60, 0x00000f80 },
+ { 0x00010001, 0x2f6001ad, 0x00000f80, 0x00000000 },
+ { 0x03000010, 0x200035ac, 0x00000f70, 0x00000f84 },
+ { 0x00010040, 0x2f603dad, 0x00000f84, 0xffd0ffd0 },
+ { 0x05000010, 0x200035ac, 0x00000f62, 0x00000f82 },
+ { 0x00010001, 0x2f6201ad, 0x00000f82, 0x00000000 },
+ { 0x03000010, 0x200035ac, 0x00000f72, 0x00000f86 },
+ { 0x00010040, 0x2f623dad, 0x00000f86, 0xffd8ffd8 },
{ 0x05000010, 0x20003dac, 0x00000f60, 0x00000000 },
{ 0x00110020, 0x34001c00, 0x00001400, 0x00000020 },
{ 0x00010001, 0x2f6001ed, 0x00000000, 0x00000000 },