hardware/intel/intel-driver
Revision | 7bb3658212f49a6f8d3d61b0b5d161aca73c2a11 (tree) |
---|---|
Time | 2015-07-06 16:08:54 |
Author | Zhao Yakui <yakui.zhao@inte...> |
Commiter | Zhao, Yakui |
H264: Use macroblock pair to calculate H264 decoding parameter under MBAFF flag
Based on the H264 spec the macroblock pair should be used to calculate
the corresponding parameters under MBAFF.(mb-adaptive frame-field).
Otherwise the wrong parameter is sent to GPU HW.
Fix the GPU hang issue in https://bugs.freedesktop.org/show_bug.cgi?id=91207
Tested-by: Lim, Siew Hoon <siew.hoon.lim@intel.com>
Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
@@ -551,14 +551,20 @@ gen6_mfd_avc_slice_state(VADriverContextP ctx, | ||
551 | 551 | } |
552 | 552 | } |
553 | 553 | |
554 | - first_mb_in_slice = slice_param->first_mb_in_slice << mbaff_picture; | |
554 | + first_mb_in_slice = slice_param->first_mb_in_slice; | |
555 | 555 | slice_hor_pos = first_mb_in_slice % width_in_mbs; |
556 | 556 | slice_ver_pos = first_mb_in_slice / width_in_mbs; |
557 | 557 | |
558 | + if (mbaff_picture) | |
559 | + slice_ver_pos = slice_ver_pos << 1; | |
560 | + | |
558 | 561 | if (next_slice_param) { |
559 | - first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture; | |
562 | + first_mb_in_next_slice = next_slice_param->first_mb_in_slice; | |
560 | 563 | next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; |
561 | 564 | next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs; |
565 | + | |
566 | + if (mbaff_picture) | |
567 | + next_slice_ver_pos = next_slice_ver_pos << 1; | |
562 | 568 | } else { |
563 | 569 | next_slice_hor_pos = 0; |
564 | 570 | next_slice_ver_pos = height_in_mbs; |
@@ -862,14 +862,20 @@ gen75_mfd_avc_slice_state(VADriverContextP ctx, | ||
862 | 862 | num_ref_idx_l1 = slice_param->num_ref_idx_l1_active_minus1 + 1; |
863 | 863 | } |
864 | 864 | |
865 | - first_mb_in_slice = slice_param->first_mb_in_slice << mbaff_picture; | |
865 | + first_mb_in_slice = slice_param->first_mb_in_slice; | |
866 | 866 | slice_hor_pos = first_mb_in_slice % width_in_mbs; |
867 | 867 | slice_ver_pos = first_mb_in_slice / width_in_mbs; |
868 | 868 | |
869 | + if (mbaff_picture) | |
870 | + slice_ver_pos = slice_ver_pos << 1; | |
871 | + | |
869 | 872 | if (next_slice_param) { |
870 | - first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture; | |
873 | + first_mb_in_next_slice = next_slice_param->first_mb_in_slice; | |
871 | 874 | next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; |
872 | 875 | next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs; |
876 | + | |
877 | + if (mbaff_picture) | |
878 | + next_slice_ver_pos = next_slice_ver_pos << 1; | |
873 | 879 | } else { |
874 | 880 | next_slice_hor_pos = 0; |
875 | 881 | next_slice_ver_pos = height_in_mbs / (1 + !!pic_param->pic_fields.bits.field_pic_flag); |
@@ -556,14 +556,20 @@ gen7_mfd_avc_slice_state(VADriverContextP ctx, | ||
556 | 556 | num_ref_idx_l1 = slice_param->num_ref_idx_l1_active_minus1 + 1; |
557 | 557 | } |
558 | 558 | |
559 | - first_mb_in_slice = slice_param->first_mb_in_slice << mbaff_picture; | |
559 | + first_mb_in_slice = slice_param->first_mb_in_slice; | |
560 | 560 | slice_hor_pos = first_mb_in_slice % width_in_mbs; |
561 | 561 | slice_ver_pos = first_mb_in_slice / width_in_mbs; |
562 | 562 | |
563 | + if (mbaff_picture) | |
564 | + slice_ver_pos = slice_ver_pos << 1; | |
565 | + | |
563 | 566 | if (next_slice_param) { |
564 | - first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture; | |
567 | + first_mb_in_next_slice = next_slice_param->first_mb_in_slice; | |
565 | 568 | next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; |
566 | 569 | next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs; |
570 | + | |
571 | + if (mbaff_picture) | |
572 | + next_slice_ver_pos = next_slice_ver_pos << 1; | |
567 | 573 | } else { |
568 | 574 | next_slice_hor_pos = 0; |
569 | 575 | next_slice_ver_pos = height_in_mbs / (1 + !!pic_param->pic_fields.bits.field_pic_flag); |
@@ -625,14 +625,19 @@ gen8_mfd_avc_slice_state(VADriverContextP ctx, | ||
625 | 625 | num_ref_idx_l1 = slice_param->num_ref_idx_l1_active_minus1 + 1; |
626 | 626 | } |
627 | 627 | |
628 | - first_mb_in_slice = slice_param->first_mb_in_slice << mbaff_picture; | |
628 | + first_mb_in_slice = slice_param->first_mb_in_slice; | |
629 | 629 | slice_hor_pos = first_mb_in_slice % width_in_mbs; |
630 | 630 | slice_ver_pos = first_mb_in_slice / width_in_mbs; |
631 | 631 | |
632 | + if (mbaff_picture) | |
633 | + slice_ver_pos = slice_ver_pos << 1; | |
632 | 634 | if (next_slice_param) { |
633 | - first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture; | |
635 | + first_mb_in_next_slice = next_slice_param->first_mb_in_slice; | |
634 | 636 | next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; |
635 | 637 | next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs; |
638 | + | |
639 | + if (mbaff_picture) | |
640 | + next_slice_ver_pos = next_slice_ver_pos << 1; | |
636 | 641 | } else { |
637 | 642 | next_slice_hor_pos = 0; |
638 | 643 | next_slice_ver_pos = height_in_mbs / (1 + !!pic_param->pic_fields.bits.field_pic_flag); |