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

📄 get_videoinfo.c

📁 6410BSP1
💻 C
📖 第 1 页 / 共 2 页
字号:
            loop_exit = 1;
            break;

        default:
            break;
        }

        pdat++;
    } while (!loop_exit);


    return 1;
}





int get_mpeg4_info(unsigned char *vos, int vos_leng, int *profile, int *width, int *height)
{
    int                loop_exit = 0;
    unsigned int       delimiter;
    unsigned char     *pdat, *p_vos_end;


    int                bit_offset;
    int                nbits;
    unsigned char      utmp;

    unsigned int       video_object_layer_shape, vop_time_increment_resolution;


    pdat       = vos;
    p_vos_end  = vos + vos_leng;
    do {

        delimiter = pdat[0];
        delimiter = (delimiter << 8) | pdat[1];
        delimiter = (delimiter << 8) | pdat[2];
        delimiter &= 0x00FFFFFF;
        pdat += 3;


        while (pdat != p_vos_end) {
            if (delimiter == 0x000001)
                break;

            delimiter = ((delimiter << 8) | *pdat) & 0x00FFFFFF;
            pdat++;
        }

        switch (*pdat) {
        case 0xB0:        // VOS (Video Object Sequence)
            *profile = *(pdat + 1);
            break;

        case 0xB5:
            break;        // VO (Visual Object)

        case 0x00:        // MPEG4 Header Video Object
            break;

        default:
            if ((*pdat & 0xF0) == 0x20) {    // Video Object Layer
    //            ...

                pdat++;
                bit_offset = 0;


                utmp = read_bits(pdat, 1, &bit_offset);        // random_accessible_vol
                utmp = read_bits(pdat, 8, &bit_offset);        // video_object_type_indication
                utmp = read_bits(pdat, 1, &bit_offset);        // is_object_layer_identifier
                if (utmp) {
                    utmp = read_bits(pdat, 4, &bit_offset);        // video_object_layer_verid
                    utmp = read_bits(pdat, 3, &bit_offset);        // video_object_layer_priority
                }
                utmp = read_bits(pdat, 4, &bit_offset);        // aspect_ratio_info
                if (utmp == 15) {    // extended PAR
                    utmp = read_bits(pdat, 8, &bit_offset);        // par_width
                    utmp = read_bits(pdat, 8, &bit_offset);        // par_width
                }
                utmp = read_bits(pdat, 1, &bit_offset);        // vol_control_parameters
                if (utmp) {
                    bit_offset += 3;    // chroma_format(2) & low_delay(1)
                    utmp = read_bits(pdat, 1, &bit_offset);        // vbv_parameters
                    if (utmp) {
                        bit_offset += 63;
                    }
                }

                video_object_layer_shape = read_bits(pdat, 2, &bit_offset);        // video_object_layer_shape


                utmp = read_bits(pdat, 1, &bit_offset);        // marker_bit
                vop_time_increment_resolution = read_bits(pdat, 16, &bit_offset);    // vop_time_increment_resolution
                utmp = read_bits(pdat, 1, &bit_offset);        // marker_bit
                utmp = read_bits(pdat, 1, &bit_offset);        // fixed_vop_rate
                if (utmp) {
                    nbits = num_bits(vop_time_increment_resolution);
                    utmp  = read_bits(pdat, nbits, &bit_offset);    // fixed_vop_time_increment
                }

                if (video_object_layer_shape == 0) {
                    utmp = read_bits(pdat, 1, &bit_offset);        // marker_bit
                    *width   = read_bits(pdat, 13, &bit_offset);    // video_object_layer_width
                    utmp = read_bits(pdat, 1, &bit_offset);        // marker_bit
                    *height  = read_bits(pdat, 13, &bit_offset);    // video_object_layer_height
                    utmp = read_bits(pdat, 1, &bit_offset);        // marker_bit
                }
                utmp = read_bits(pdat, 1, &bit_offset);            // interlaced



                loop_exit = 1;
            }
            break;
        }

        pdat++;
    } while (!loop_exit);


    return 1;
}


int get_h263_info(unsigned char *frame, int frame_leng, int *profile, int *width, int *height)
{

    int            bit_offset;
    unsigned int   utmp;

    unsigned int   type_info;


    bit_offset = 22;
    utmp = read_bits(frame, 8, &bit_offset);    // Temporal Reference
    bit_offset += 5;                            // Type Information (Bit 1 ~ 5)
    type_info = read_bits(frame, 3, &bit_offset);    // Type Information (Bit 6 ~ 8) :  Source Format
    switch (type_info) {
    case 0x1:    // sub-QCIF
        *width  = 88;
        *height = 72;
        break;
    case 0x2:    // QCIF
        *width  = 176;
        *height = 144;
        break;
    case 0x3:    // CIF
        *width  = 352;
        *height = 288;
        break;
    case 0x4:    // 4CIF
        *width  = 704;
        *height = 576;
        break;
    case 0x5:    // 16CIF
        *width  = 1408;
        *height = 1152;
        break;
    case 0x7:    // extended PTYPE

        break;
    case 0x0:    // forbidden
    case 0x6:    // reserved
        return -1;
    default:
        return -1;
    }

    if (type_info == 0x7) {
        // UFEP (3 bits)
        utmp = read_bits(frame, 3, &bit_offset);

        // OPPTYPE(18 bits) if UFEP == 001
        if (utmp == 1) {
            // Source Format (3 bits)
            utmp = read_bits(frame, 3, &bit_offset);
            switch (utmp) {
            case 0x1:    // sub-QCIF
                *width  = 88;
                *height = 72;
                break;
            case 0x2:    // QCIF
                *width  = 176;
                *height = 144;
                break;
            case 0x3:    // CIF
                *width  = 352;
                *height = 288;
                break;
            case 0x4:    // 4CIF
                *width  = 704;
                *height = 576;
                break;
            case 0x5:    // 16CIF
                *width  = 1408;
                *height = 1152;
                break;
            case 0x0:    // forbidden
            case 0x7:    // reserved
                *width  = 0;
                *height = 0;
                break;
            case 0x6:    // custom source format
                *width  = 0;
                *height = 0;
            }
            // Optional custom PCF (1 bit)
            utmp = read_bits(frame, 1, &bit_offset);
            // Optional Unrestricted Motion Vector (UMV) mode (1 bit) : Annex D
            utmp = read_bits(frame, 1, &bit_offset);
            // Optional Syntax-based Arithmetic Coding (SAC) mode (1 bit) : Annex E
            utmp = read_bits(frame, 1, &bit_offset);
            // Optional Advanced Prediction (AP) mode (see Annex F) (1 bit)
            utmp = read_bits(frame, 1, &bit_offset);
            // Optional Advanced INTRA Coding (AIC) mode (Annex I) (1 bit)
            utmp = read_bits(frame, 1, &bit_offset);
            // Optional Deblocking Filter (DF) mode (see Annex J) (1 bit)
            utmp = read_bits(frame, 1, &bit_offset);
            // Optional Slice Structured (SS) mode (see Annex K), (1 bit)
            utmp = read_bits(frame, 1, &bit_offset);
            // Optional Reference Picture Selection (RPS) mode (see Annex N), (1 bit)
            utmp = read_bits(frame, 1, &bit_offset);
            // Optional Independent Segment Decoding (ISD) mode (see Annex R), (1 bit)
            utmp = read_bits(frame, 1, &bit_offset);
            // Optional Alternative INTER VLC (AIV) mode (see Annex S), (1 bit)
            utmp = read_bits(frame, 1, &bit_offset);
            // Optional Modified Quantization (MQ) mode (see Annex T), (1 bit)
            utmp = read_bits(frame, 1, &bit_offset);

            // Bit 15-18 (no meaning)
            bit_offset += 4;
        }

        // MPPTYPE(9 bits)

        // Picture Type Code (Bits 1-3)
        //       :  0(I-pic), 1(P-pic), 2(Improved PB-frame)
        //          3(B-pic), 4(EI-pic), 5(EP-pic)
        utmp = read_bits(frame, 3, &bit_offset);
        // Skip (Bits 4-9)
        bit_offset += 6;


        // CPM(1 bit) & PSBI(2 bits)
        utmp = read_bits(frame, 1, &bit_offset);
        if (utmp == 1)    // PSBI exists only if CPM==1
            utmp = read_bits(frame, 2, &bit_offset);


        // CPFMT (23 bits)

        // Bits 1-4 : Pixel Aspect Ratio Code  (1=1:1, 2=CIF 4:3, 3=525 4:3, 4=CIF 16:9, ...)
        utmp = read_bits(frame, 4, &bit_offset);
        // Bits 5-13 : Picture Width Indication (Real width = (PWI + 1) * 4
        utmp = read_bits(frame, 9, &bit_offset);
        // Bit 14 : 1
        bit_offset += 1;
        // Bits 15-23 : Picture Height Indication (Real Height = PHI * 4
        utmp = read_bits(frame, 9, &bit_offset);
    }



    *profile = 0;

    return 0;
}

⌨️ 快捷键说明

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