///< residual_colour_transform_flag
 public void copyTo(SequenceParameterSet sps)
 {
     sps.profile_idc        = profile_idc;
     sps.level_idc          = level_idc;
     sps.chroma_format_idc  = chroma_format_idc;
     sps.transform_bypass   = transform_bypass;   ///< qpprime_y_zero_transform_bypass_flag
     sps.log2_max_frame_num = log2_max_frame_num; ///< log2_max_frame_num_minus4 + 4
     sps.poc_type           = poc_type;           ///< pic_order_cnt_type
     sps.log2_max_poc_lsb   = log2_max_poc_lsb;   ///< log2_max_pic_order_cnt_lsb_minus4
     sps.delta_pic_order_always_zero_flag = delta_pic_order_always_zero_flag;
     sps.offset_for_non_ref_pic           = offset_for_non_ref_pic;
     sps.offset_for_top_to_bottom_field   = offset_for_top_to_bottom_field;
     sps.poc_cycle_length = poc_cycle_length; ///< num_ref_frames_in_pic_order_cnt_cycle
     sps.ref_frame_count  = ref_frame_count;  ///< num_ref_frames
     sps.gaps_in_frame_num_allowed_flag = gaps_in_frame_num_allowed_flag;
     sps.mb_width            = mb_width;      ///< pic_width_in_mbs_minus1 + 1
     sps.mb_height           = mb_height;     ///< pic_height_in_map_units_minus1 + 1
     sps.frame_mbs_only_flag = frame_mbs_only_flag;
     sps.mb_aff = mb_aff;                     ///<mb_adaptive_frame_field_flag
     sps.direct_8x8_inference_flag = direct_8x8_inference_flag;
     sps.crop        = crop;                  ///< frame_cropping_flag
     sps.crop_left   = crop_left;             ///< frame_cropping_rect_left_offset
     sps.crop_right  = crop_right;            ///< frame_cropping_rect_right_offset
     sps.crop_top    = crop_top;              ///< frame_cropping_rect_top_offset
     sps.crop_bottom = crop_bottom;           ///< frame_cropping_rect_bottom_offset
     sps.vui_parameters_present_flag = vui_parameters_present_flag;
     //sps.sar = null;
     sps.sar.num = sar.num;
     sps.sar.den = sar.den;
     sps.video_signal_type_present_flag = video_signal_type_present_flag;
     sps.full_range = full_range;
     sps.colour_description_present_flag = colour_description_present_flag;
     sps.color_primaries          = color_primaries;
     sps.color_trc                = color_trc;
     sps.colorspace               = colorspace;
     sps.timing_info_present_flag = timing_info_present_flag;
     sps.num_units_in_tick        = num_units_in_tick;
     sps.time_scale               = time_scale;
     sps.fixed_frame_rate_flag    = fixed_frame_rate_flag;
     sps.offset_for_ref_frame     = new short[256]; //FIXME dyn aloc?
     Array.Copy(offset_for_ref_frame, 0, sps.offset_for_ref_frame, 0, 256);
     sps.bitstream_restriction_flag      = bitstream_restriction_flag;
     sps.num_reorder_frames              = num_reorder_frames;
     sps.scaling_matrix_present          = scaling_matrix_present;
     sps.scaling_matrix4                 = (int[][])scaling_matrix4.Clone();
     sps.scaling_matrix8                 = (int[][])scaling_matrix8.Clone();
     sps.nal_hrd_parameters_present_flag = nal_hrd_parameters_present_flag;
     sps.vcl_hrd_parameters_present_flag = vcl_hrd_parameters_present_flag;
     sps.pic_struct_present_flag         = pic_struct_present_flag;
     sps.time_offset_length              = time_offset_length;
     sps.cpb_cnt = cpb_cnt;                                             ///< See H.264 E.1.2
     sps.initial_cpb_removal_delay_length =
         initial_cpb_removal_delay_length;                              ///< initial_cpb_removal_delay_length_minus1 +1
     sps.cpb_removal_delay_length      = cpb_removal_delay_length;      ///< cpb_removal_delay_length_minus1 + 1
     sps.dpb_output_delay_length       = dpb_output_delay_length;       ///< dpb_output_delay_length_minus1 + 1
     sps.bit_depth_luma                = bit_depth_luma;                ///< bit_depth_luma_minus8 + 8
     sps.bit_depth_chroma              = bit_depth_chroma;              ///< bit_depth_chroma_minus8 + 8
     sps.residual_color_transform_flag = residual_color_transform_flag; ///< residual_colour_transform_flag
 }
示例#2
0
        ////////////////////////////
        // Decode SPS
        public int ff_h264_decode_seq_parameter_set()
        {
            int profile_idc, level_idc;
            /*unsigned */
            int sps_id;
            int i;
            SequenceParameterSet sps;

            profile_idc = (int)s.gb.get_bits(8, "profile_idc");
            s.gb.get_bits1("constraint_set0_flag");   //constraint_set0_flag
            s.gb.get_bits1("constraint_set1_flag");   //constraint_set1_flag
            s.gb.get_bits1("constraint_set2_flag");   //constraint_set2_flag
            s.gb.get_bits1("constraint_set3_flag");   //constraint_set3_flag
            s.gb.get_bits(4, "reserved"); // reserved
            level_idc = (int)s.gb.get_bits(8, "level_idc");
            sps_id = s.gb.get_ue_golomb_31("sps_id");

            if (sps_id >= MAX_SPS_COUNT)
            {
                //av_log(this.s.avctx, AV_LOG_ERROR, "sps_id (%d) out of range\n", sps_id);
                return -45;
            }
            sps = new SequenceParameterSet();
            if (sps == null)
                return -46;

            sps.time_offset_length = 24;
            sps.profile_idc = profile_idc;
            sps.level_idc = level_idc;
            //Console.WriteLine("Decode SPS, Profile: "+profile_idc+", Level: "+level_idc);

            //memset(sps.scaling_matrix4, 16, sizeof(sps.scaling_matrix4));
            //memset(sps.scaling_matrix8, 16, sizeof(sps.scaling_matrix8));
            for (int k = 0; k < sps.scaling_matrix4.Length; k++)
                Arrays.Fill(sps.scaling_matrix4[k], 16);
            for (int k = 0; k < sps.scaling_matrix8.Length; k++)
                Arrays.Fill(sps.scaling_matrix8[k], 16);

            sps.scaling_matrix_present = 0;

            if (sps.profile_idc >= 100)
            { //high profile
                sps.chroma_format_idc = s.gb.get_ue_golomb_31("chroma_format_idc");
                if (sps.chroma_format_idc == 3)
                    sps.residual_color_transform_flag = (int)s.gb.get_bits1("residual_color_transform_flag");
                sps.bit_depth_luma = s.gb.get_ue_golomb("bit_depth_luma") + 8;
                sps.bit_depth_chroma = s.gb.get_ue_golomb("bit_depth_chroma") + 8;
                sps.transform_bypass = (int)s.gb.get_bits1("transform_bypass");
                decode_scaling_matrices(sps, null, 1, sps.scaling_matrix4, sps.scaling_matrix8);
            }
            else
            {
                sps.chroma_format_idc = 1;
                sps.bit_depth_luma = 8;
                sps.bit_depth_chroma = 8;
            }

            sps.log2_max_frame_num = s.gb.get_ue_golomb("log2_max_frame_num") + 4;
            sps.poc_type = s.gb.get_ue_golomb_31("poc_type");

            // DebugTool.printDebugString("SPS: log2_max_frame_num = "+sps.log2_max_frame_num+"\n");
            // DebugTool.printDebugString("SPS: poc_type = "+sps.poc_type+"\n");

            if (sps.poc_type == 0)
            { //FIXME #define
                sps.log2_max_poc_lsb = s.gb.get_ue_golomb("log2_max_poc_lsb") + 4;

                // DebugTool.printDebugString("SPS: log2_max_poc_lsb = "+sps.log2_max_poc_lsb+"\n");
            }
            else if (sps.poc_type == 1)
            {//FIXME #define
                sps.delta_pic_order_always_zero_flag = (int)s.gb.get_bits1("delta_pic_order_always_zero_flag");
                sps.offset_for_non_ref_pic = s.gb.get_se_golomb("offset_for_non_ref_pic");
                sps.offset_for_top_to_bottom_field = s.gb.get_se_golomb("offset_for_top_to_bottom_field");
                sps.poc_cycle_length = s.gb.get_ue_golomb("poc_cycle_length");

                // DebugTool.printDebugString("SPS: delta_pic_order_always_zero_flag = "+sps.delta_pic_order_always_zero_flag+"\n");
                // DebugTool.printDebugString("SPS: offset_for_non_ref_pic = "+sps.offset_for_non_ref_pic+"\n");
                // DebugTool.printDebugString("SPS: offset_for_top_to_bottom_field = "+sps.offset_for_top_to_bottom_field+"\n");
                // DebugTool.printDebugString("SPS: poc_cycle_length = "+sps.poc_cycle_length+"\n");

                if (/*(unsigned)*/sps.poc_cycle_length >= sps.offset_for_ref_frame.Length)
                {
                    //av_log(this.s.avctx, AV_LOG_ERROR, "poc_cycle_length overflow %u\n", sps.poc_cycle_length);
                    return -47;
                }

                for (i = 0; i < sps.poc_cycle_length; i++)
                {
                    sps.offset_for_ref_frame[i] = (short)s.gb.get_se_golomb("offset_for_ref_frame");

                    // DebugTool.printDebugString("SPS: offset_for_ref_frame["+i+"] = "+sps.offset_for_ref_frame[i]+"\n");
                } // if
            }
            else if (sps.poc_type != 2)
            {
                //av_log(this.s.avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps.poc_type);
                return -48;
            }

            sps.ref_frame_count = s.gb.get_ue_golomb_31("ref_frame_count");
            // DebugTool.printDebugString("SPS: ref_frame_count = "+sps.ref_frame_count+"\n");

            if (sps.ref_frame_count > MpegEncContext.MAX_PICTURE_COUNT - 2 || sps.ref_frame_count >= 32)
            {
                //av_log(this.s.avctx, AV_LOG_ERROR, "too many reference frames\n");
                return -49;
            }
            sps.gaps_in_frame_num_allowed_flag = (int)s.gb.get_bits1("gaps_in_frame_num_allowed_flag");
            sps.mb_width = s.gb.get_ue_golomb("mb_width") + 1;
            sps.mb_height = s.gb.get_ue_golomb("mb_height") + 1;
            if (/*(unsigned)*/sps.mb_width >= int.MaxValue / 16 || /*(unsigned)*/sps.mb_height >= int.MaxValue / 16 ||
               MpegEncContext.av_image_check_size(16 * sps.mb_width, 16 * sps.mb_height, 0, this.s) != 0)
            {
                //av_log(this.s.avctx, AV_LOG_ERROR, "mb_width/height overflow\n");
                return -50;
            }

            // DebugTool.printDebugString("SPS: gaps_in_frame_num_allowed_flag = "+sps.gaps_in_frame_num_allowed_flag+"\n");
            // DebugTool.printDebugString("SPS: mb_width = "+sps.mb_width+"\n");
            // DebugTool.printDebugString("SPS: mb_height = "+sps.mb_height+"\n");

            sps.frame_mbs_only_flag = (int)s.gb.get_bits1("frame_mbs_only_flag");
            if (0 == sps.frame_mbs_only_flag)
                sps.mb_aff = (int)s.gb.get_bits1("mb_aff");
            else
                sps.mb_aff = 0;

            // DebugTool.printDebugString("SPS: frame_mbs_only_flag = "+sps.frame_mbs_only_flag+"\n");
            // DebugTool.printDebugString("SPS: mb_aff = "+sps.mb_aff+"\n");

            sps.direct_8x8_inference_flag = (int)s.gb.get_bits1("direct_8x8_inference_flag");
            if (0 == sps.frame_mbs_only_flag && 0 == sps.direct_8x8_inference_flag)
            {
                //av_log(this.s.avctx, AV_LOG_ERROR, "This stream was generated by a broken encoder, invalid 8x8 inference\n");
                return -51;
            }

            // DebugTool.printDebugString("SPS: direct_8x8_inference_flag = "+sps.direct_8x8_inference_flag+"\n");

            //	    if(sps.mb_aff)
            //	        av_log(this.s.avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n");
            sps.crop = (int)s.gb.get_bits1("crop");
            if (sps.crop != 0)
            {
                sps.crop_left = s.gb.get_ue_golomb("crop_left");
                sps.crop_right = s.gb.get_ue_golomb("crop_right");
                sps.crop_top = s.gb.get_ue_golomb("crop_top");
                sps.crop_bottom = s.gb.get_ue_golomb("crop_bottom");
                if (sps.crop_left != 0 || sps.crop_top != 0)
                {
                    //av_log(this.s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ...\n");
                }
                if (sps.crop_right >= 8 || sps.crop_bottom >= 8)
                {
                    //av_log(this.s.avctx, AV_LOG_ERROR, "brainfart cropping not supported, this could look slightly wrong ...\n");
                }
            }
            else
            {
                sps.crop_left =
                sps.crop_right =
                sps.crop_top =
                sps.crop_bottom = 0;
            }

            // DebugTool.printDebugString("SPS: crop = "+sps.crop+"\n");
            // DebugTool.printDebugString("SPS: crop_left = "+sps.crop_left+"\n");
            // DebugTool.printDebugString("SPS: crop_right = "+sps.crop_right+"\n");
            // DebugTool.printDebugString("SPS: crop_top = "+sps.crop_top+"\n");
            // DebugTool.printDebugString("SPS: crop_bottom = "+sps.crop_bottom+"\n");

            sps.vui_parameters_present_flag = (int)s.gb.get_bits1("vui_parameters_present_flag");
            if (0 != sps.vui_parameters_present_flag)
                if (this.decode_vui_parameters(sps) < 0)
                    return -52;

            if (0 == sps.sar.den)
                sps.sar.den = 1;

            /*
            if(s.avctx.debug&FF_DEBUG_PICT_INFO){
                av_log(this.s.avctx, AV_LOG_DEBUG, "sps:%u profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %s %s %d/%d\n",
                       sps_id, sps.profile_idc, sps.level_idc,
                       sps.poc_type,
                       sps.ref_frame_count,
                       sps.mb_width, sps.mb_height,
                       sps.frame_mbs_only_flag ? "FRM" : (sps.mb_aff ? "MB-AFF" : "PIC-AFF"),
                       sps.direct_8x8_inference_flag ? "8B8" : "",
                       sps.crop_left, sps.crop_right,
                       sps.crop_top, sps.crop_bottom,
                       sps.vui_parameters_present_flag ? "VUI" : "",
                       ((char*[]){"Gray","420","422","444"})[sps.chroma_format_idc],
                       sps.timing_info_present_flag ? sps.num_units_in_tick : 0,
                       sps.timing_info_present_flag ? sps.time_scale : 0
                       );
            }
            */

            //av_free(this.sps_buffers[sps_id]);
            this.sps_buffers[sps_id] = sps;
            this.sps = sps;
            return 0;
        }
示例#3
0
        public int decode_vui_parameters(SequenceParameterSet sps)
        {
            int aspect_ratio_info_present_flag;
            /*unsigned */
            int aspect_ratio_idc;

            // DebugTool.printDebugString("decode_vui_parameters called..\n");

            aspect_ratio_info_present_flag = (int)s.gb.get_bits1("aspect_ratio_info_present_flag");

            // DebugTool.printDebugString("    -- SPS: aspect_ratio_info_present_flag = "+aspect_ratio_info_present_flag+"\n");

            if (aspect_ratio_info_present_flag != 0)
            {
                aspect_ratio_idc = (int)s.gb.get_bits(8, "aspect_ratio_idc");

                // DebugTool.printDebugString("    -- decoding aspect_ratio_info..\n");
                // DebugTool.printDebugString("    -- SPS: aspect_ratio_idc = "+aspect_ratio_idc+"\n");

                if (aspect_ratio_idc == EXTENDED_SAR)
                {
                    sps.sar.num = (int)s.gb.get_bits(16, "sar_num");
                    sps.sar.den = (int)s.gb.get_bits(16, "sar_den");

                    // DebugTool.printDebugString("    -- SPS: num = "+sps.sar.num+"\n");
                    // DebugTool.printDebugString("    -- SPS: den = "+sps.sar.den+"\n");

                }
                else if (aspect_ratio_idc < pixel_aspect.Length)
                {
                    sps.sar = pixel_aspect[aspect_ratio_idc];
                }
                else
                {
                    //av_log(this.s.avctx, AV_LOG_ERROR, "illegal aspect ratio\n");
                    return -36;
                }
            }
            else
            {
                sps.sar.num =
                sps.sar.den = 0;
            }
            //	            s.avctx.aspect_ratio= sar_width*s.width / (float)(s.height*sar_height);

            if (0 != (int)s.gb.get_bits1("overscan_info_present_flag"))
            {      /* overscan_info_present_flag */
                s.gb.get_bits1("overscan_appropriate_flag");      /* overscan_appropriate_flag */

                // DebugTool.printDebugString("    -- decoding overscan_info..\n");
            }

            sps.video_signal_type_present_flag = (int)s.gb.get_bits1("video_signal_type_present_flag");
            if (0 != sps.video_signal_type_present_flag)
            {
                // DebugTool.printDebugString("    -- decoding video_signal_type..\n");

                s.gb.get_bits(3, "video_signal_type_present_flag?");    /* video_format */
                sps.full_range = (int)s.gb.get_bits1("full_range"); /* video_full_range_flag */

                // DebugTool.printDebugString("    -- SPS: full_range = "+sps.full_range+"\n");

                sps.colour_description_present_flag = (int)s.gb.get_bits1("colour_description_present_flag");
                if (0 != sps.colour_description_present_flag)
                {

                    // DebugTool.printDebugString("    -- decoding colour_description..\n");

                    sps.color_primaries = (int)s.gb.get_bits(8, "color_primaries"); /* colour_primaries */
                    sps.color_trc = (int)s.gb.get_bits(8, "color_trc"); /* transfer_characteristics */
                    sps.colorspace = (int)s.gb.get_bits(8, "colorspace"); /* matrix_coefficients */
                    if (sps.color_primaries >= MpegEncContext.AVCOL_PRI_NB)
                        sps.color_primaries = MpegEncContext.AVCOL_PRI_UNSPECIFIED;
                    if (sps.color_trc >= MpegEncContext.AVCOL_TRC_NB)
                        sps.color_trc = MpegEncContext.AVCOL_TRC_UNSPECIFIED;
                    if (sps.colorspace >= MpegEncContext.AVCOL_SPC_NB)
                        sps.colorspace = MpegEncContext.AVCOL_SPC_UNSPECIFIED;
                }
            }

            if (0 != (int)s.gb.get_bits1("chroma_location_info_present_flag"))
            {      /* chroma_location_info_present_flag */
                // DebugTool.printDebugString("    -- decoding chroma_location_info..\n");

                s.chroma_sample_location = s.gb.get_ue_golomb("chroma_sample_location") + 1;  /* chroma_sample_location_type_top_field */
                s.gb.get_ue_golomb("chroma_sample_location_type_bottom_field");  /* chroma_sample_location_type_bottom_field */
            }

            sps.timing_info_present_flag = (int)s.gb.get_bits1("timing_info_present_flag");
            // DebugTool.printDebugString("    -- SPS: timing_info_present_flag = "+sps.timing_info_present_flag+"\n");

            if (0 != sps.timing_info_present_flag)
            {
                // DebugTool.printDebugString("    -- decoding timing_info..\n");

                sps.num_units_in_tick = s.gb.get_bits_long(32, "num_units_in_tick");
                sps.time_scale = s.gb.get_bits_long(32, "time_scale");

                // DebugTool.printDebugString("        -- num_units_in_tick = "+sps.num_units_in_tick+", time_scale = "+sps.time_scale+"\n");

                if (0 == sps.num_units_in_tick || 0 == sps.time_scale)
                {
                    //av_log(this.s.avctx, AV_LOG_ERROR, "time_scale/num_units_in_tick invalid or unsupported (%d/%d)\n", sps.time_scale, sps.num_units_in_tick);
                    return -37;
                }
                sps.fixed_frame_rate_flag = (int)s.gb.get_bits1("fixed_frame_rate_flag");
            }

            sps.nal_hrd_parameters_present_flag = (int)s.gb.get_bits1("nal_hrd_parameters_present_flag");
            if (0 != sps.nal_hrd_parameters_present_flag)
                if (this.decode_hrd_parameters(sps) < 0)
                    return -38;
            sps.vcl_hrd_parameters_present_flag = (int)s.gb.get_bits1("vcl_hrd_parameters_present_flag");
            if (0 != sps.vcl_hrd_parameters_present_flag)
                if (this.decode_hrd_parameters(sps) < 0)
                    return -39;
            if (0 != sps.nal_hrd_parameters_present_flag || 0 != sps.vcl_hrd_parameters_present_flag)
                s.gb.get_bits1("low_delay_hrd_flag");     /* low_delay_hrd_flag */
            sps.pic_struct_present_flag = (int)s.gb.get_bits1("pic_struct_present_flag");

            sps.bitstream_restriction_flag = (int)s.gb.get_bits1("bitstream_restriction_flag");
            if (0 != sps.bitstream_restriction_flag)
            {
                s.gb.get_bits1("motion_vectors_over_pic_boundaries_flag");     /* motion_vectors_over_pic_boundaries_flag */
                s.gb.get_ue_golomb("max_bytes_per_pic_denom"); /* max_bytes_per_pic_denom */
                s.gb.get_ue_golomb("max_bits_per_mb_denom"); /* max_bits_per_mb_denom */
                s.gb.get_ue_golomb("log2_max_mv_length_horizontal"); /* log2_max_mv_length_horizontal */
                s.gb.get_ue_golomb("log2_max_mv_length_vertical"); /* log2_max_mv_length_vertical */
                sps.num_reorder_frames = s.gb.get_ue_golomb("num_reorder_frames");
                s.gb.get_ue_golomb("get_ue_golomb"); /*max_dec_frame_buffering*/

                if (s.gb.size_in_bits < s.gb.get_bits_count())
                {
                    //av_log(this.s.avctx, AV_LOG_ERROR, "Overread VUI by %d bits\n", get_bits_count(&s.gb) - s.gb.size_in_bits);
                    sps.num_reorder_frames = 0;
                    sps.bitstream_restriction_flag = 0;
                }

                if (sps.num_reorder_frames > 16 /*max_dec_frame_buffering || max_dec_frame_buffering > 16*/)
                {
                    //av_log(this.s.avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", sps.num_reorder_frames);
                    return -40;
                }
            }

            return 0;
        }
示例#4
0
 public void decode_scaling_matrices(SequenceParameterSet sps,
     PictureParameterSet pps, int is_sps,
     /* uint8_t (*scaling_matrix4)[16] */int[][] scaling_matrix4, /*
     * uint8_t
     * (*
     * scaling_matrix8
     * )[64]
     */
     int[][] scaling_matrix8)
 {
     int fallback_sps = (0 == is_sps && 0 != sps.scaling_matrix_present) ? 1
             : 0;
     /* const uint8_t * */
     int[][] fallback = new int[][] {
             (fallback_sps != 0) ? sps.scaling_matrix4[0]
                     : default_scaling4[0],
             (fallback_sps != 0) ? sps.scaling_matrix4[3]
                     : default_scaling4[1],
             (fallback_sps != 0) ? sps.scaling_matrix8[0]
                     : default_scaling8[0],
             (fallback_sps != 0) ? sps.scaling_matrix8[1]
                     : default_scaling8[1] };
     if (0l != s.gb.get_bits1("01?"))
     {
         sps.scaling_matrix_present |= is_sps;
         decode_scaling_list(scaling_matrix4[0], 16, default_scaling4[0],
                 fallback[0]); // Intra, Y
         decode_scaling_list(scaling_matrix4[1], 16, default_scaling4[0],
                 scaling_matrix4[0]); // Intra, Cr
         decode_scaling_list(scaling_matrix4[2], 16, default_scaling4[0],
                 scaling_matrix4[1]); // Intra, Cb
         decode_scaling_list(scaling_matrix4[3], 16, default_scaling4[1],
                 fallback[1]); // Inter, Y
         decode_scaling_list(scaling_matrix4[4], 16, default_scaling4[1],
                 scaling_matrix4[3]); // Inter, Cr
         decode_scaling_list(scaling_matrix4[5], 16, default_scaling4[1],
                 scaling_matrix4[4]); // Inter, Cb
         if (is_sps != 0 || pps.transform_8x8_mode != 0)
         {
             decode_scaling_list(scaling_matrix8[0], 64,
                     default_scaling8[0], fallback[2]); // Intra, Y
             decode_scaling_list(scaling_matrix8[1], 64,
                     default_scaling8[1], fallback[3]); // Inter, Y
         }
     }
 }
示例#5
0
        public int decode_hrd_parameters(SequenceParameterSet sps)
        {
            int cpb_count, i;
            cpb_count = s.gb.get_ue_golomb_31("cpb_count") + 1;

            if (cpb_count > 32)
            {
                //av_log(this.s.avctx, AV_LOG_ERROR, "cpb_count %d invalid\n", cpb_count);
                return -35;
            }

            s.gb.get_bits(4, "bit_rate_scale"); /* bit_rate_scale */
            s.gb.get_bits(4, "cpb_size_scale"); /* cpb_size_scale */
            for (i = 0; i < cpb_count; i++)
            {
                s.gb.get_ue_golomb("bit_rate_value_minus1"); /* bit_rate_value_minus1 */
                s.gb.get_ue_golomb("cpb_size_value_minus1"); /* cpb_size_value_minus1 */
                s.gb.get_bits1("cbr_flag");     /* cbr_flag */
            }
            sps.initial_cpb_removal_delay_length = (int)s.gb.get_bits(5, "initial_cpb_removal_delay_length") + 1;
            sps.cpb_removal_delay_length = (int)s.gb.get_bits(5, "cpb_removal_delay_length") + 1;
            sps.dpb_output_delay_length = (int)s.gb.get_bits(5, "dpb_output_delay_length") + 1;
            sps.time_offset_length = (int)s.gb.get_bits(5, "time_offset_length");
            sps.cpb_cnt = cpb_count;
            return 0;
        }
示例#6
0
        public int decode_buffering_period()
        {
            /*unsigned */
            int sps_id;
            int sched_sel_idx;
            SequenceParameterSet sps;

            sps_id = s.gb.get_ue_golomb_31("sps_id");
            if (sps_id > 31 || null == this.sps_buffers[sps_id])
            {
                //av_log(this.s.avctx, AV_LOG_ERROR, "non-existing SPS %d referenced in buffering period\n", sps_id);
                return -30;
            }
            sps = this.sps_buffers[sps_id];

            // NOTE: This is really so duplicated in the standard... See H.264, D.1.1
            if (sps.nal_hrd_parameters_present_flag != 0)
            {
                for (sched_sel_idx = 0; sched_sel_idx < sps.cpb_cnt; sched_sel_idx++)
                {
                    this.initial_cpb_removal_delay[sched_sel_idx] = (int)s.gb.get_bits(sps.initial_cpb_removal_delay_length, "initial_cpb_removal_delay");
                    s.gb.skip_bits(sps.initial_cpb_removal_delay_length); // initial_cpb_removal_delay_offset
                }
            }
            if (sps.vcl_hrd_parameters_present_flag != 0)
            {
                for (sched_sel_idx = 0; sched_sel_idx < sps.cpb_cnt; sched_sel_idx++)
                {
                    this.initial_cpb_removal_delay[sched_sel_idx] = (int)s.gb.get_bits(sps.initial_cpb_removal_delay_length, "initial_cpb_removal_delay");
                    s.gb.skip_bits(sps.initial_cpb_removal_delay_length); // initial_cpb_removal_delay_offset
                }
            }

            this.sei_buffering_period_present = 1;
            return 0;
        }
 public void copyTo(SequenceParameterSet sps)
 {
     sps.profile_idc = profile_idc;
     sps.level_idc = level_idc;
     sps.chroma_format_idc = chroma_format_idc;
     sps.transform_bypass = transform_bypass;              ///< qpprime_y_zero_transform_bypass_flag
     sps.log2_max_frame_num = log2_max_frame_num;            ///< log2_max_frame_num_minus4 + 4
     sps.poc_type = poc_type;                      ///< pic_order_cnt_type
     sps.log2_max_poc_lsb = log2_max_poc_lsb;              ///< log2_max_pic_order_cnt_lsb_minus4
     sps.delta_pic_order_always_zero_flag = delta_pic_order_always_zero_flag;
     sps.offset_for_non_ref_pic = offset_for_non_ref_pic;
     sps.offset_for_top_to_bottom_field = offset_for_top_to_bottom_field;
     sps.poc_cycle_length = poc_cycle_length;              ///< num_ref_frames_in_pic_order_cnt_cycle
     sps.ref_frame_count = ref_frame_count;               ///< num_ref_frames
     sps.gaps_in_frame_num_allowed_flag = gaps_in_frame_num_allowed_flag;
     sps.mb_width = mb_width;                      ///< pic_width_in_mbs_minus1 + 1
     sps.mb_height = mb_height;                     ///< pic_height_in_map_units_minus1 + 1
     sps.frame_mbs_only_flag = frame_mbs_only_flag;
     sps.mb_aff = mb_aff;                        ///<mb_adaptive_frame_field_flag
     sps.direct_8x8_inference_flag = direct_8x8_inference_flag;
     sps.crop = crop;                   ///< frame_cropping_flag
     sps.crop_left = crop_left;            ///< frame_cropping_rect_left_offset
     sps.crop_right = crop_right;           ///< frame_cropping_rect_right_offset
     sps.crop_top = crop_top;             ///< frame_cropping_rect_top_offset
     sps.crop_bottom = crop_bottom;          ///< frame_cropping_rect_bottom_offset
     sps.vui_parameters_present_flag = vui_parameters_present_flag;
     //sps.sar = null;
     sps.sar.num = sar.num;
     sps.sar.den = sar.den;
     sps.video_signal_type_present_flag = video_signal_type_present_flag;
     sps.full_range = full_range;
     sps.colour_description_present_flag = colour_description_present_flag;
     sps.color_primaries = color_primaries;
     sps.color_trc = color_trc;
     sps.colorspace = colorspace;
     sps.timing_info_present_flag = timing_info_present_flag;
     sps.num_units_in_tick = num_units_in_tick;
     sps.time_scale = time_scale;
     sps.fixed_frame_rate_flag = fixed_frame_rate_flag;
     sps.offset_for_ref_frame = new short[256]; //FIXME dyn aloc?
     Array.Copy(offset_for_ref_frame, 0, sps.offset_for_ref_frame, 0, 256);
     sps.bitstream_restriction_flag = bitstream_restriction_flag;
     sps.num_reorder_frames = num_reorder_frames;
     sps.scaling_matrix_present = scaling_matrix_present;
     sps.scaling_matrix4 = (int[][])scaling_matrix4.Clone();
     sps.scaling_matrix8 = (int[][])scaling_matrix8.Clone();
     sps.nal_hrd_parameters_present_flag = nal_hrd_parameters_present_flag;
     sps.vcl_hrd_parameters_present_flag = vcl_hrd_parameters_present_flag;
     sps.pic_struct_present_flag = pic_struct_present_flag;
     sps.time_offset_length = time_offset_length;
     sps.cpb_cnt = cpb_cnt;                       ///< See H.264 E.1.2
     sps.initial_cpb_removal_delay_length = initial_cpb_removal_delay_length; ///< initial_cpb_removal_delay_length_minus1 +1
     sps.cpb_removal_delay_length = cpb_removal_delay_length;      ///< cpb_removal_delay_length_minus1 + 1
     sps.dpb_output_delay_length = dpb_output_delay_length;       ///< dpb_output_delay_length_minus1 + 1
     sps.bit_depth_luma = bit_depth_luma;                ///< bit_depth_luma_minus8 + 8
     sps.bit_depth_chroma = bit_depth_chroma;              ///< bit_depth_chroma_minus8 + 8
     sps.residual_color_transform_flag = residual_color_transform_flag; ///< residual_colour_transform_flag
 }