📄 get_videoinfo.c
字号:
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 + -