encoder: h264: really fix frame cropping rectangle calculation.

Make frame cropping rectangle calculation future proof, i.e. exactly
follow the specification (7-18) to (7-21), and subsampling definitions
from Table 6-1.

https://bugzilla.gnome.org/show_bug.cgi?id=722089
https://bugzilla.gnome.org/show_bug.cgi?id=722238
This commit is contained in:
Gwenole Beauchesne 2014-01-15 15:10:48 +01:00
parent b1d3f7d4c0
commit 5f5df3f723

View file

@ -995,14 +995,23 @@ fill_va_sequence_param (GstVaapiEncoderH264 * encoder,
/* frame_cropping_flag */ /* frame_cropping_flag */
if ((GST_VAAPI_ENCODER_WIDTH (encoder) & 15) || if ((GST_VAAPI_ENCODER_WIDTH (encoder) & 15) ||
(GST_VAAPI_ENCODER_HEIGHT (encoder) & 15)) { (GST_VAAPI_ENCODER_HEIGHT (encoder) & 15)) {
static const guint SubWidthC[] = { 1, 2, 2, 1 };
static const guint SubHeightC[] = { 1, 2, 1, 1 };
const guint CropUnitX =
SubWidthC[seq_param->seq_fields.bits.chroma_format_idc];
const guint CropUnitY =
SubHeightC[seq_param->seq_fields.bits.chroma_format_idc] *
(2 - seq_param->seq_fields.bits.frame_mbs_only_flag);
seq_param->frame_cropping_flag = 1; seq_param->frame_cropping_flag = 1;
seq_param->frame_crop_left_offset = 0; seq_param->frame_crop_left_offset = 0;
seq_param->frame_crop_right_offset = seq_param->frame_crop_right_offset =
16 * encoder->mb_width - GST_VAAPI_ENCODER_WIDTH (encoder); (16 * encoder->mb_width -
GST_VAAPI_ENCODER_WIDTH (encoder)) / CropUnitX;
seq_param->frame_crop_top_offset = 0; seq_param->frame_crop_top_offset = 0;
seq_param->frame_crop_bottom_offset = seq_param->frame_crop_bottom_offset =
(16 * encoder->mb_height - GST_VAAPI_ENCODER_HEIGHT (encoder)) / (16 * encoder->mb_height -
(2 - seq_param->seq_fields.bits.frame_mbs_only_flag); GST_VAAPI_ENCODER_HEIGHT (encoder)) / CropUnitY;
} }
/* vui not set */ /* vui not set */