/** * coda_h264_sps_fixup - fixes frame cropping values in h.264 SPS * @ctx: encoder context * @width: visible width * @height: visible height * @buf: buffer containing h.264 SPS RBSP, starting with NAL header * @size: modified RBSP size return value * @max_size: available size in buf * * Rewrites the frame cropping values in an h.264 SPS RBSP correctly for the * given visible width and height.
*/ int coda_h264_sps_fixup(struct coda_ctx *ctx, int width, int height, char *buf, int *size, int max_size)
{ int profile_idc; unsignedint pic_order_cnt_type; int pic_width_in_mbs_minus1, pic_height_in_map_units_minus1; int frame_mbs_only_flag, frame_cropping_flag; int vui_parameters_present_flag; unsignedint crop_right, crop_bottom; struct rbsp sps; int pos; int ret;
if (*size < 8 || *size >= max_size) return -EINVAL;
/* log2_max_frame_num_minus4 */
ret = rbsp_read_uev(&sps, NULL); if (ret) return ret;
ret = rbsp_read_uev(&sps, &pic_order_cnt_type); if (ret) return ret;
if (pic_order_cnt_type == 0) { /* log2_max_pic_order_cnt_lsb_minus4 */
ret = rbsp_read_uev(&sps, NULL); if (ret) return ret;
} elseif (pic_order_cnt_type == 1) { unsignedint i, num_ref_frames_in_pic_order_cnt_cycle;
/* delta_pic_order_always_zero_flag */
ret = rbsp_read_bit(&sps); if (ret < 0) return ret; /* offset_for_non_ref_pic */
ret = rbsp_read_sev(&sps, NULL); if (ret) return ret; /* offset_for_top_to_bottom_field */
ret = rbsp_read_sev(&sps, NULL); if (ret) return ret;
ret = rbsp_read_uev(&sps,
&num_ref_frames_in_pic_order_cnt_cycle); if (ret) return ret; for (i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) { /* offset_for_ref_frame */
ret = rbsp_read_sev(&sps, NULL); if (ret) return ret;
}
}
/* max_num_ref_frames */
ret = rbsp_read_uev(&sps, NULL); if (ret) return ret;
/* gaps_in_frame_num_value_allowed_flag */
ret = rbsp_read_bit(&sps); if (ret < 0) return ret;
ret = rbsp_read_uev(&sps, &pic_width_in_mbs_minus1); if (ret) return ret;
ret = rbsp_read_uev(&sps, &pic_height_in_map_units_minus1); if (ret) return ret;
frame_mbs_only_flag = ret = rbsp_read_bit(&sps); if (ret < 0) return ret; if (!frame_mbs_only_flag) { /* mb_adaptive_frame_field_flag */
ret = rbsp_read_bit(&sps); if (ret < 0) return ret;
} /* direct_8x8_inference_flag */
ret = rbsp_read_bit(&sps); if (ret < 0) return ret;
/* Mark position of the frame cropping flag */
pos = sps.pos;
frame_cropping_flag = ret = rbsp_read_bit(&sps); if (ret < 0) return ret; if (frame_cropping_flag) { unsignedint crop_left, crop_top;
ret = rbsp_read_uev(&sps, &crop_left); if (ret) return ret;
ret = rbsp_read_uev(&sps, &crop_right); if (ret) return ret;
ret = rbsp_read_uev(&sps, &crop_top); if (ret) return ret;
ret = rbsp_read_uev(&sps, &crop_bottom); if (ret) return ret;
}
vui_parameters_present_flag = ret = rbsp_read_bit(&sps); if (ret < 0) return ret; if (vui_parameters_present_flag) {
dev_err(ctx->fh.vdev->dev_parent, "%s: Handling vui_parameters not implemented\n",
__func__); return -EINVAL;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.