2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
in praecedente articulo "Basics of getting started with audio and video: H.264 thema (11) - formula solutionis video calculandi " ", describit formulam calculandi resolutionem video per attributa H.264 encoded in SPS. Articulus hic explicat exsecutionem solutionis calculi videndi in codice FFmpeg fonte.
Ex articulo "Basics of questus incepit cum audio et video: thema H.264 (10) - Analysis structurae quae SPS attributa reponit et munus decoctionis SPS in codice fonte FFmpeg, scire possumus FFmpeg fontem codici SPS per ff_h264_decode_seq_parameter_set functionem obtinere attributa in SPS.
Sequens codice in munere ff_h264_decode_seq_parameter_set habetur.
- int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,
- H264ParamSets *ps, int ignore_truncation)
- {
- //...
-
- sps->gaps_in_frame_num_allowed_flag = get_bits1(gb);
- sps->mb_width = get_ue_golomb(gb) + 1;
- sps->mb_height = get_ue_golomb(gb) + 1;
-
- sps->frame_mbs_only_flag = get_bits1(gb);
-
- if (sps->mb_height >= INT_MAX / 2U) {
- av_log(avctx, AV_LOG_ERROR, "height overflown");
- goto fail;
- }
- sps->mb_height *= 2 - sps->frame_mbs_only_flag;
-
- //...
-
- sps->crop = get_bits1(gb);
- if (sps->crop) {
- unsigned int crop_left = get_ue_golomb(gb);
- unsigned int crop_right = get_ue_golomb(gb);
- unsigned int crop_top = get_ue_golomb(gb);
- unsigned int crop_bottom = get_ue_golomb(gb);
- int width = 16 * sps->mb_width;
- int height = 16 * sps->mb_height;
-
- if (avctx->flags2 & AV_CODEC_FLAG2_IGNORE_CROP) {
- av_log(avctx, AV_LOG_DEBUG, "discarding sps cropping, original "
- "values are l:%d r:%d t:%d b:%dn",
- crop_left, crop_right, crop_top, crop_bottom);
-
- sps->crop_left =
- sps->crop_right =
- sps->crop_top =
- sps->crop_bottom = 0;
- } else {
- int vsub = (sps->chroma_format_idc == 1) ? 1 : 0;
- int hsub = (sps->chroma_format_idc == 1 ||
- sps->chroma_format_idc == 2) ? 1 : 0;
- int step_x = 1 << hsub;
- int step_y = (2 - sps->frame_mbs_only_flag) << vsub;
-
- if (crop_left > (unsigned)INT_MAX / 4 / step_x ||
- crop_right > (unsigned)INT_MAX / 4 / step_x ||
- crop_top > (unsigned)INT_MAX / 4 / step_y ||
- crop_bottom> (unsigned)INT_MAX / 4 / step_y ||
- (crop_left + crop_right ) * step_x >= width ||
- (crop_top + crop_bottom) * step_y >= height
- ) {
- av_log(avctx, AV_LOG_ERROR, "crop values invalid %d %d %d %d / %d %dn",
- crop_left, crop_right, crop_top, crop_bottom, width, height);
- goto fail;
- }
-
- sps->crop_left = crop_left * step_x;
- sps->crop_right = crop_right * step_x;
- sps->crop_top = crop_top * step_y;
- sps->crop_bottom = crop_bottom * step_y;
- }
- } else {
- sps->crop_left =
- sps->crop_right =
- sps->crop_top =
- sps->crop_bottom =
- sps->crop = 0;
- }
-
- //...
- }
Deinde in functione parse_nal_unitatum principii fasciculi libavcodec/h264_parser.c ipsius codicis FFmpeg, sequentis codicis est:
- static inline int parse_nal_units(AVCodecParserContext *s,
- AVCodecContext *avctx,
- const uint8_t * const buf, int buf_size)
- {
- //...
-
- for (;;) {
- switch (nal.type) {
- case H264_NAL_SPS:
- ff_h264_decode_seq_parameter_set(&nal.gb, avctx, &p->ps, 0);
- break;
-
- //...
-
- case H264_NAL_IDR_SLICE:
-
- //...
-
- s->coded_width = 16 * sps->mb_width;
- s->coded_height = 16 * sps->mb_height;
- s->width = s->coded_width - (sps->crop_right + sps->crop_left);
- s->height = s->coded_height - (sps->crop_top + sps->crop_bottom);
- if (s->width <= 0 || s->height <= 0) {
- s->width = s->coded_width;
- s->height = s->coded_height;
- }
- //...
- }
- //...
- }
- }
Potes videre quod in functione parse_nal_unitatum, resolutionem video tandem obtineri per sequentia:
- s->width = s->coded_width - (sps->crop_right + sps->crop_left);
- s->height = s->coded_height - (sps->crop_top + sps->crop_bottom);
Exsecutionem videre potes calculandi resolutionis video in codice fonte FFmpeg et articulo "Basics of getting started with audio and video: H.264 thema (11) - formula solutionis video calculandiFormulae de quibus in constant.