📄 headers.c
字号:
#include "../mpeg3private.h"
#include "../mpeg3protos.h"
#include "mpeg3video.h"
#include <stdio.h>
#include <stdlib.h>
int mpeg3video_getseqhdr(mpeg3video_t *video)
{
int i;
int aspect_ratio, picture_rate, vbv_buffer_size;
int constrained_parameters_flag;
int load_intra_quantizer_matrix, load_non_intra_quantizer_matrix;
video->horizontal_size = mpeg3bits_getbits(video->vstream, 12);
video->vertical_size = mpeg3bits_getbits(video->vstream, 12);
aspect_ratio = mpeg3bits_getbits(video->vstream, 4);
video->framerate_code = mpeg3bits_getbits(video->vstream, 4);
video->bitrate = mpeg3bits_getbits(video->vstream, 18);
mpeg3bits_getbit_noptr(video->vstream); /* marker bit (=1) */
vbv_buffer_size = mpeg3bits_getbits(video->vstream, 10);
constrained_parameters_flag = mpeg3bits_getbit_noptr(video->vstream);
video->frame_rate = mpeg3_frame_rate_table[video->framerate_code];
load_intra_quantizer_matrix = mpeg3bits_getbit_noptr(video->vstream);
if(load_intra_quantizer_matrix)
{
for(i = 0; i < 64; i++)
video->intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
}
else
{
for(i = 0; i < 64; i++)
video->intra_quantizer_matrix[i] = mpeg3_default_intra_quantizer_matrix[i];
}
load_non_intra_quantizer_matrix = mpeg3bits_getbit_noptr(video->vstream);
if(load_non_intra_quantizer_matrix)
{
for(i = 0; i < 64; i++)
video->non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
}
else
{
for(i = 0; i < 64; i++)
video->non_intra_quantizer_matrix[i] = 16;
}
/* copy luminance to chrominance matrices */
for(i = 0; i < 64; i++)
{
video->chroma_intra_quantizer_matrix[i] = video->intra_quantizer_matrix[i];
video->chroma_non_intra_quantizer_matrix[i] = video->non_intra_quantizer_matrix[i];
}
return 0;
}
/* decode sequence extension */
int mpeg3video_sequence_extension(mpeg3video_t *video)
{
int prof_lev;
int horizontal_size_extension, vertical_size_extension;
int bit_rate_extension, vbv_buffer_size_extension, low_delay;
int frame_rate_extension_n, frame_rate_extension_d;
int pos = 0;
video->mpeg2 = 1;
video->scalable_mode = SC_NONE; /* unless overwritten by seq. scal. ext. */
prof_lev = mpeg3bits_getbyte_noptr(video->vstream);
video->prog_seq = mpeg3bits_getbit_noptr(video->vstream);
video->chroma_format = mpeg3bits_getbits(video->vstream, 2);
horizontal_size_extension = mpeg3bits_getbits(video->vstream, 2);
vertical_size_extension = mpeg3bits_getbits(video->vstream, 2);
bit_rate_extension = mpeg3bits_getbits(video->vstream, 12);
mpeg3bits_getbit_noptr(video->vstream);
vbv_buffer_size_extension = mpeg3bits_getbyte_noptr(video->vstream);
low_delay = mpeg3bits_getbit_noptr(video->vstream);
frame_rate_extension_n = mpeg3bits_getbits(video->vstream, 2);
frame_rate_extension_d = mpeg3bits_getbits(video->vstream, 5);
video->horizontal_size = (horizontal_size_extension << 12) | (video->horizontal_size & 0x0fff);
video->vertical_size = (vertical_size_extension << 12) | (video->vertical_size & 0x0fff);
return 0;
}
/* decode sequence display extension */
int mpeg3video_sequence_display_extension(mpeg3video_t *video)
{
int colour_primaries = 0, transfer_characteristics = 0;
int display_horizontal_size, display_vertical_size;
int pos = 0;
int video_format = mpeg3bits_getbits(video->vstream, 3);
int colour_description = mpeg3bits_getbit_noptr(video->vstream);
if(colour_description)
{
colour_primaries = mpeg3bits_getbyte_noptr(video->vstream);
transfer_characteristics = mpeg3bits_getbyte_noptr(video->vstream);
video->matrix_coefficients = mpeg3bits_getbyte_noptr(video->vstream);
}
display_horizontal_size = mpeg3bits_getbits(video->vstream, 14);
mpeg3bits_getbit_noptr(video->vstream);
display_vertical_size = mpeg3bits_getbits(video->vstream, 14);
return 0;
}
/* decode quant matrix entension */
int mpeg3video_quant_matrix_extension(mpeg3video_t *video)
{
int i;
int load_intra_quantiser_matrix, load_non_intra_quantiser_matrix;
int load_chroma_intra_quantiser_matrix;
int load_chroma_non_intra_quantiser_matrix;
int pos = 0;
if((load_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
{
for(i = 0; i < 64; i++)
{
video->chroma_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
= video->intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
= mpeg3bits_getbyte_noptr(video->vstream);
}
}
if((load_non_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
{
for (i = 0; i < 64; i++)
{
video->chroma_non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
= video->non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
= mpeg3bits_getbyte_noptr(video->vstream);
}
}
if((load_chroma_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
{
for(i = 0; i < 64; i++)
video->chroma_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
}
if((load_chroma_non_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
{
for(i = 0; i < 64; i++)
video->chroma_non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
}
return 0;
}
/* decode sequence scalable extension */
int mpeg3video_sequence_scalable_extension(mpeg3video_t *video)
{
int layer_id;
video->scalable_mode = mpeg3bits_getbits(video->vstream, 2) + 1; /* add 1 to make SC_DP != SC_NONE */
layer_id = mpeg3bits_getbits(video->vstream, 4);
if(video->scalable_mode == SC_SPAT)
{
video->llw = mpeg3bits_getbits(video->vstream, 14); /* lower_layer_prediction_horizontal_size */
mpeg3bits_getbit_noptr(video->vstream);
video->llh = mpeg3bits_getbits(video->vstream, 14); /* lower_layer_prediction_vertical_size */
video->hm = mpeg3bits_getbits(video->vstream, 5);
video->hn = mpeg3bits_getbits(video->vstream, 5);
video->vm = mpeg3bits_getbits(video->vstream, 5);
video->vn = mpeg3bits_getbits(video->vstream, 5);
}
if(video->scalable_mode == SC_TEMP)
fprintf(stderr, "mpeg3video_sequence_scalable_extension: temporal scalability not implemented\n");
return 0;
}
/* decode picture display extension */
int mpeg3video_picture_display_extension(mpeg3video_t *video)
{
int n, i;
short frame_centre_horizontal_offset[3];
short frame_centre_vertical_offset[3];
if(video->prog_seq || video->pict_struct != FRAME_PICTURE)
n = 1;
else
n = video->repeatfirst ? 3 : 2;
for(i = 0; i < n; i++)
{
frame_centre_horizontal_offset[i] = (short)mpeg3bits_getbits(video->vstream, 16);
mpeg3bits_getbit_noptr(video->vstream);
frame_centre_vertical_offset[i] = (short)mpeg3bits_getbits(video->vstream, 16);
mpeg3bits_getbit_noptr(video->vstream);
}
return 0;
}
/* decode picture coding extension */
int mpeg3video_picture_coding_extension(mpeg3video_t *video)
{
int chroma_420_type, composite_display_flag;
int v_axis = 0, field_sequence = 0, sub_carrier = 0, burst_amplitude = 0, sub_carrier_phase = 0;
video->h_forw_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
video->v_forw_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
video->h_back_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
video->v_back_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
video->dc_prec = mpeg3bits_getbits(video->vstream, 2);
video->pict_struct = mpeg3bits_getbits(video->vstream, 2);
video->topfirst = mpeg3bits_getbit_noptr(video->vstream);
video->frame_pred_dct = mpeg3bits_getbit_noptr(video->vstream);
video->conceal_mv = mpeg3bits_getbit_noptr(video->vstream);
video->qscale_type = mpeg3bits_getbit_noptr(video->vstream);
video->intravlc = mpeg3bits_getbit_noptr(video->vstream);
video->altscan = mpeg3bits_getbit_noptr(video->vstream);
video->repeatfirst = mpeg3bits_getbit_noptr(video->vstream);
chroma_420_type = mpeg3bits_getbit_noptr(video->vstream);
video->prog_frame = mpeg3bits_getbit_noptr(video->vstream);
if(video->repeat_count > 100)
video->repeat_count = 0;
video->repeat_count += 100;
video->current_repeat = 0;
if(video->prog_seq)
{
if(video->repeatfirst)
{
if(video->topfirst)
video->repeat_count += 200;
else
video->repeat_count += 100;
}
}
else
if(video->prog_frame)
{
if(video->repeatfirst)
{
video->repeat_count += 50;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -