⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 h264frames.c

📁 6410BSP3
💻 C
📖 第 1 页 / 共 2 页
字号:

                // Picture Height
                utmp  = ue_v(ptmp, &bit_offset);        // pic_height_in_map_units_minus1
                utmp2 = u_n(ptmp, 1, &bit_offset);        // frame_mbs_only_flag
                frame_mbs_only_flag = utmp2;            // frame_mbs_only_flag

                PicHeightInMapUnits = utmp + 1;
                FrameHeightInMbs    = (2 - utmp2) * PicHeightInMapUnits;
                PicHeightInMbs      = FrameHeightInMbs;// / (1 + field_pic_flag);
                conf_data->height   = ((unsigned int) PicHeightInMbs) << 4;
            }
        }
        // PPS case
        // (Extracting 'log2_max_frame_num_minus4' value for SPS NAL.)
        else if (nal_type == 8) {
            ptmp = buf + nStreamSize + 5;

            bit_offset = 0;
            utmp = ue_v(ptmp, &bit_offset);            // pic_parameter_set_id
            add_pps_id(utmp);
        }


        nStreamSize += nFrameSize;
    }


    // includeIframe 啊 1牢 版快绰
    // 府畔登绰 config stream俊 I-frame阑 器窃矫懦瘤 搬沥茄促.
    if (includeIframe == 1) {
        nFrameSize = NextIFrameH264(pFrameExCtx, fp, buf + nStreamSize, buf_size - nStreamSize);

        nStreamSize += nFrameSize;
    }


    return nStreamSize;
}

static int NextIFrameH264(FRAMEX_CTX  *pFrameExCtx, void *fp, unsigned char buf[], int buf_size)
{
    int                i, j;
    int                ret;
    unsigned char      frame_type[12];
    unsigned char      nal_type = 255;
    int                nFrameSize, nFrameSize2;

    H264_SLICE_INFO    h264_slice_info, h264_slice_info_next;
    int                bit_offset;


    for (i=0; i<200; i++) {

        ret = FrameExtractorNext(pFrameExCtx, fp, buf, buf_size, (int *)&nFrameSize);
        if (ret != FRAMEX_OK)
            return 0;
        nal_type = NAL_UNIT_TYPE_TYPE(buf[4]);
        if (nal_type == 5) {
            break;
        }
        // PPS case
        // (Extracting 'log2_max_frame_num_minus4' value for SPS NAL.)
        else if (nal_type == 8) {
            bit_offset = 0;
            add_pps_id(ue_v(buf + 5, &bit_offset));        // pic_parameter_set_id
        }
    }

    // I frame was not found for 200 NALs.
    if (nal_type != 5)
        return 0;


    // NAL with type == 5 is now found.
    // Multi-slice checking
    get_h264_slice_info(buf + 5, &h264_slice_info);
    for (j=0; j<200; j++) {
        ret = FrameExtractorPeek(pFrameExCtx, fp, frame_type, sizeof(frame_type), (int *)&nFrameSize2);
        if (ret != FRAMEX_OK)
            break;

        nal_type = NAL_UNIT_TYPE_TYPE(frame_type[4]);
        if (nal_type != 5) {
            // 吝埃俊 PPS啊 尝咯乐绰瘤 犬牢茄促.
            if (nal_type == 8) {
                bit_offset = 0;
                // 吝埃俊 长 PPS狼 pps_id啊 货肺款 仇捞搁, multi-slice啊 肯丰等 巴捞促.
                if (!find_pps_id(ue_v(frame_type + 5, &bit_offset)))
                    break;
                // 吝埃俊 长 PPS狼 pps_id啊 馆汗登绢 唱柯 仇捞搁,
                // 捞 PPS绰 滚妨滚赴促.
                else {
                    FrameExtractorNext(pFrameExCtx, fp, buf + nFrameSize, buf_size - nFrameSize, (int *)&nFrameSize2);
                    continue;
                }
            }
            else
                break;
        }


        // first_mb客 frame_num阑 厚背茄促.
        get_h264_slice_info(frame_type + 5, &h264_slice_info_next);
        if (h264_slice_info.frame_num != h264_slice_info_next.frame_num)
            break;
//        if (h264_slice_info.first_mb == h264_slice_info_next.first_mb)
//            break;
        if (h264_slice_info.pic_parameter_set_id != h264_slice_info_next.pic_parameter_set_id)
            break;

        ret = FrameExtractorNext(pFrameExCtx, fp, buf + nFrameSize, buf_size - nFrameSize, (int *)&nFrameSize2);

        nFrameSize += nFrameSize2;
    }


    return nFrameSize;
}


int NextFrameH264(FRAMEX_CTX  *pFrameExCtx, void *fp, unsigned char buf[], int buf_size, unsigned int *coding_type)
{
    int                i;
    int                ret;
    unsigned char      nal_first_12bytes[12];
    unsigned char      nal_type, old_nal_type;
    int                nStreamSize, nFrameSize;

    H264_SLICE_INFO    h264_slice_info, h264_slice_info_next;
    int                bit_offset;


    nStreamSize=0;

    ///////////////////////////////
    ///  SPS/PPS/SEI 何盒 眠免  ///
    ///////////////////////////////
    for (i=0; i<100; i++) {

        ret = FrameExtractorPeek(pFrameExCtx, fp, nal_first_12bytes, sizeof(nal_first_12bytes), (int *)&nFrameSize);
        nal_type = NAL_UNIT_TYPE_TYPE(nal_first_12bytes[4]);

        // SPS/PPS/SEI 何盒捞 酒聪扼搁 弊成 逞绢埃促.
        if ((nal_type != 6) && (nal_type != 7) && (nal_type != 8) && (nal_type != 9) && (nal_type != 12)) {
            break;
        }
        // PPS case
        // (Extracting 'log2_max_frame_num_minus4' value for SPS NAL.)
        if (nal_type == 8) {
            bit_offset = 0;
            add_pps_id(ue_v(nal_first_12bytes + 5, &bit_offset));        // pic_parameter_set_id
        }

        ret = FrameExtractorNext(pFrameExCtx, fp, buf + nStreamSize, buf_size - nStreamSize, (int *)&nFrameSize);
        if (ret != FRAMEX_OK)
            break;

        // Filler data牢 版快, 弊成 滚妨滚赴促.
        if (nal_type == 12)
            continue;

        nStreamSize += nFrameSize;
    }


    // SPS/PPS/SEI 促澜俊 坷绰 nal_unit狼 type捞
    // IDR slice(5锅)捞唱 non-IDR slice(1锅)捞 酒囱 版快绰
    // 泅犁 瘤盔窍瘤 臼绰促.
    // 曼绊肺 5锅,1锅狼 版快绰 slice_layer啊 slice_layer_without_partitioning_rbsp 捞促.
    if ((nal_type != 1) && (nal_type != 5)) {
        return 0;
    }
    old_nal_type = nal_type;


    /////////////////////////////////
    ///  I 肚绰 P NAL UNIT 眠免   ///
    /////////////////////////////////
    nFrameSize=0;
    ret = FrameExtractorNext(pFrameExCtx, fp, buf + nStreamSize, buf_size - nStreamSize, (int *)&nFrameSize);
    if (ret != FRAMEX_OK) {
        return 0;
    }

    get_h264_slice_info(buf + nStreamSize + 5, &h264_slice_info);
    if (coding_type) {
        *coding_type = h264_slice_info.slice_type;
    }


    nStreamSize += nFrameSize;

    ///////////////////////////////
    ///  促澜狼 NAL UNIT 眠免   ///
    ///   (Multi-slice 器窃)    ///
    ///////////////////////////////
    for (i=0; i<200; i++) {

        // 促澜 NAL UNIT狼 nal_unit_type 犬牢
        ret = FrameExtractorPeek(pFrameExCtx, fp, nal_first_12bytes, sizeof(nal_first_12bytes), (int *)&nFrameSize);
        if (ret != FRAMEX_OK)
            break;
        else if (nFrameSize < (sizeof(nal_first_12bytes) - 4))    // 4 : delimiter length
            break;

        // 促澜 NAL UNIT狼 type捞 贸澜 type苞 鞍瘤 臼促搁,
        // multi-slice老 版快啊 酒聪骨肺 府畔茄促.
        nal_type = NAL_UNIT_TYPE_TYPE(nal_first_12bytes[4]);
        if (nal_type != old_nal_type) {
            // 吝埃俊 PPS啊 尝咯乐绰瘤 犬牢茄促.
            if (nal_type == 8) {
                bit_offset = 0;
                // 吝埃俊 长 PPS狼 pps_id啊 货肺款 仇捞搁, multi-slice啊 肯丰等 巴捞促.
                if (!find_pps_id(ue_v(nal_first_12bytes + 5, &bit_offset)))
                    break;
                // 吝埃俊 长 PPS狼 pps_id啊 馆汗登绢 唱柯 仇捞搁,
                // 捞 PPS绰 滚妨滚赴促.
                else {
                    FrameExtractorNext(pFrameExCtx, fp, buf + nStreamSize, buf_size - nStreamSize, (int *)&nFrameSize);
                    continue;
                }
            }
            else
                break;
        }
        old_nal_type = nal_type;


        // first_mb客 frame_num阑 厚背茄促.
        get_h264_slice_info(nal_first_12bytes + 5, &h264_slice_info_next);
        if (h264_slice_info.frame_num != h264_slice_info_next.frame_num)
            break;
//        if (h264_slice_info.first_mb == h264_slice_info_next.first_mb)
//            break;
        if (h264_slice_info.pic_parameter_set_id != h264_slice_info_next.pic_parameter_set_id)
            break;


        // 促澜 NAL UNIT捞 Multi-slice捞骨肺 眠啊肺 眠免茄促.
        ret = FrameExtractorNext(pFrameExCtx, fp, buf + nStreamSize, buf_size - nStreamSize, (int *)&nFrameSize);
        if (ret != FRAMEX_OK)
            return 0;

        nStreamSize += nFrameSize;
    }


    return nStreamSize;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -