+
+ if (picture_type == GEN7_VC1_SKIPPED_PICTURE) {
+ gen7_mfd_context->post_deblocking_output.valid = 0;
+ gen7_mfd_context->pre_deblocking_output.valid = 1;
+ } else {
+ gen7_mfd_context->post_deblocking_output.valid = pic_param->entrypoint_fields.bits.loopfilter;
+ gen7_mfd_context->pre_deblocking_output.valid = !pic_param->entrypoint_fields.bits.loopfilter;
+ }
+
+ intel_update_vc1_frame_store_index(ctx,
+ decode_state,
+ pic_param,
+ gen7_mfd_context->reference_surface);
+
+ if (picture_type == GEN7_VC1_P_PICTURE) {
+ obj_surface = decode_state->reference_objects[0];
+ gen7_vc1_current_surface = (struct gen7_vc1_surface *)(decode_state->render_object->private_data);
+ if (pic_param->forward_reference_picture != VA_INVALID_ID &&
+ obj_surface)
+ gen7_vc1_forward_surface = (struct gen7_vc1_surface *)(obj_surface->private_data);
+ else
+ gen7_vc1_forward_surface = NULL;
+
+ if (!pic_param->sequence_fields.bits.interlace ||
+ pic_param->picture_fields.bits.frame_coding_mode == 0) { /* Progressive */
+ if (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation) {
+ if (gen7_vc1_forward_surface) {
+ gen7_vc1_forward_surface->intensity_compensation_top = 1;
+ gen7_vc1_forward_surface->intensity_compensation_bottom = 1;
+ gen7_vc1_forward_surface->luma_scale_top[0] = pic_param->luma_scale;
+ gen7_vc1_forward_surface->luma_scale_bottom[0] = pic_param->luma_scale;
+ gen7_vc1_forward_surface->luma_shift_top[0] = pic_param->luma_shift;
+ gen7_vc1_forward_surface->luma_shift_bottom[0] = pic_param->luma_shift;
+ }
+ }
+ } else if (pic_param->sequence_fields.bits.interlace &&
+ pic_param->picture_fields.bits.frame_coding_mode == 1) { /* Frame-Interlace */
+ if (pic_param->picture_fields.bits.intensity_compensation) {
+ if (gen7_vc1_forward_surface) {
+ gen7_vc1_forward_surface->intensity_compensation_top = 1;
+ gen7_vc1_forward_surface->intensity_compensation_bottom = 1;
+ gen7_vc1_forward_surface->luma_scale_top[0] = pic_param->luma_scale;
+ gen7_vc1_forward_surface->luma_scale_bottom[0] = pic_param->luma_scale;
+ gen7_vc1_forward_surface->luma_shift_top[0] = pic_param->luma_shift;
+ gen7_vc1_forward_surface->luma_shift_bottom[0] = pic_param->luma_shift;
+ }
+ }
+ } else if (pic_param->sequence_fields.bits.interlace &&
+ pic_param->picture_fields.bits.frame_coding_mode == 2) { /* Field-Interlace */
+ if (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation) {
+ if (pic_param->intensity_compensation_field == 1 || /* Top field */
+ pic_param->intensity_compensation_field == 0) { /* Both fields */
+ if (is_first_field) {
+ if ((!pic_param->reference_fields.bits.num_reference_pictures &&
+ (pic_param->reference_fields.bits.reference_field_pic_indicator ==
+ pic_param->picture_fields.bits.top_field_first)) ||
+ pic_param->reference_fields.bits.num_reference_pictures) {
+ if (gen7_vc1_forward_surface) {
+ i = gen7_vc1_forward_surface->intensity_compensation_top++;
+ gen7_vc1_forward_surface->luma_scale_top[i] = pic_param->luma_scale;
+ gen7_vc1_forward_surface->luma_shift_top[i] = pic_param->luma_shift;
+ }
+ }
+ } else { /* Second field */
+ if (pic_param->picture_fields.bits.top_field_first) {
+ if ((!pic_param->reference_fields.bits.num_reference_pictures &&
+ !pic_param->reference_fields.bits.reference_field_pic_indicator) ||
+ pic_param->reference_fields.bits.num_reference_pictures) {
+ i = gen7_vc1_current_surface->intensity_compensation_top++;
+ gen7_vc1_current_surface->luma_scale_top[i] = pic_param->luma_scale;
+ gen7_vc1_current_surface->luma_shift_top[i] = pic_param->luma_shift;
+ }
+ } else {
+ if ((!pic_param->reference_fields.bits.num_reference_pictures &&
+ pic_param->reference_fields.bits.reference_field_pic_indicator) ||
+ pic_param->reference_fields.bits.num_reference_pictures) {
+ if (gen7_vc1_forward_surface) {
+ i = gen7_vc1_forward_surface->intensity_compensation_top++;
+ gen7_vc1_forward_surface->luma_scale_top[i] = pic_param->luma_scale;
+ gen7_vc1_forward_surface->luma_shift_top[i] = pic_param->luma_shift;
+ }
+ }
+ }
+ }
+ }
+ if (pic_param->intensity_compensation_field == 2 || /* Bottom field */
+ pic_param->intensity_compensation_field == 0) { /* Both fields */
+ if (is_first_field) {
+ if ((!pic_param->reference_fields.bits.num_reference_pictures &&
+ (pic_param->reference_fields.bits.reference_field_pic_indicator ^
+ pic_param->picture_fields.bits.top_field_first)) ||
+ pic_param->reference_fields.bits.num_reference_pictures) {
+ if (gen7_vc1_forward_surface) {
+ i = gen7_vc1_forward_surface->intensity_compensation_bottom++;
+ if (pic_param->intensity_compensation_field == 2) { /* Bottom field */
+ gen7_vc1_forward_surface->luma_scale_bottom[i] = pic_param->luma_scale;
+ gen7_vc1_forward_surface->luma_shift_bottom[i] = pic_param->luma_shift;
+ } else { /* Both fields */
+ gen7_vc1_forward_surface->luma_scale_bottom[i] = pic_param->luma_scale2;
+ gen7_vc1_forward_surface->luma_shift_bottom[i] = pic_param->luma_shift2;
+ }
+ }
+ }
+ } else { /* Second field */
+ if (pic_param->picture_fields.bits.top_field_first) {
+ if ((!pic_param->reference_fields.bits.num_reference_pictures &&
+ pic_param->reference_fields.bits.reference_field_pic_indicator) ||
+ pic_param->reference_fields.bits.num_reference_pictures) {
+ if (gen7_vc1_forward_surface) {
+ i = gen7_vc1_forward_surface->intensity_compensation_bottom++;
+ if (pic_param->intensity_compensation_field == 2) { /* Bottom field */
+ gen7_vc1_forward_surface->luma_scale_bottom[i] = pic_param->luma_scale;
+ gen7_vc1_forward_surface->luma_shift_bottom[i] = pic_param->luma_shift;
+ } else { /* Both fields */
+ gen7_vc1_forward_surface->luma_scale_bottom[i] = pic_param->luma_scale2;
+ gen7_vc1_forward_surface->luma_shift_bottom[i] = pic_param->luma_shift2;
+ }
+ }
+ }
+ } else {
+ if ((!pic_param->reference_fields.bits.num_reference_pictures &&
+ !pic_param->reference_fields.bits.reference_field_pic_indicator) ||
+ pic_param->reference_fields.bits.num_reference_pictures) {
+ i = gen7_vc1_current_surface->intensity_compensation_bottom++;
+ if (pic_param->intensity_compensation_field == 2) { /* Bottom field */
+ gen7_vc1_current_surface->luma_scale_bottom[i] = pic_param->luma_scale;
+ gen7_vc1_current_surface->luma_shift_bottom[i] = pic_param->luma_shift;
+ } else { /* Both fields */
+ gen7_vc1_current_surface->luma_scale_bottom[i] = pic_param->luma_scale2;
+ gen7_vc1_current_surface->luma_shift_bottom[i] = pic_param->luma_shift2;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }