📄 gop_list.c
字号:
fclose(out);
return 0;
}
if(! write_le_int64(in->gop[i].start_frame, out)){
fclose(out);
return 0;
}
if(! write_le_int64(in->gop[i].frame_count, out)){
fclose(out);
return 0;
}
if(! write_le_int32((int)(in->gop[i].sh - in->sh), out)){
fclose(out);
return 0;
}
}
for(i=0;i<in->num_of_sh;i++){
if(! save_sequence_header(in->sh+i, out)){
fclose(out);
return 0;
}
}
fclose(out);
return 1;
}
GOP_LIST *load_gop_list(char *filepath)
{
int offset;
GOP_LIST *r;
FILE *in;
char buf[sizeof(GL_TAG)];
int i;
in = fopen(filepath, "rb");
if(in == NULL){
return NULL;
}
i = fread(buf, 1, sizeof(buf), in);
if(i != sizeof(buf)){
fclose(in);
return NULL;
}
if(memcmp(buf, GL_TAG, sizeof(buf)) != 0){
fclose(in);
return NULL;
}
r = (GOP_LIST *)calloc(1, sizeof(GOP_LIST));
if(r == NULL){
fclose(in);
return NULL;
}
if(! read_le_int64(in, &(r->stream_length)) ){
fclose(in);
free(r);
return NULL;
}
if(! read_le_int64(in, &(r->num_of_frame)) ){
fclose(in);
free(r);
return NULL;
}
if(! read_le_int32(in, &(r->num_of_gop)) ){
fclose(in);
free(r);
return NULL;
}
if(! read_le_int32(in, &(r->num_of_sh)) ){
fclose(in);
free(r);
return NULL;
}
if(r->num_of_gop < 1){
fclose(in);
free(r);
return NULL;
}
if(r->num_of_sh < 1){
fclose(in);
free(r);
return NULL;
}
r->gop = (GOP *)calloc(r->num_of_gop, sizeof(GOP));
if(r->gop == NULL){
fclose(in);
free(r);
return NULL;
}
r->sh = (SEQUENCE_HEADER *)calloc(r->num_of_sh, sizeof(SEQUENCE_HEADER));
if(r->sh == NULL){
fclose(in);
free(r->gop);
free(r);
return NULL;
}
for(i=0;i<r->num_of_gop;i++){
if(! read_le_int64(in, &(r->gop[i].offset)) ){
fclose(in);
free(r->gop);
free(r->sh);
free(r);
return NULL;
}
if(! read_le_int64(in, &(r->gop[i].start_frame)) ){
fclose(in);
free(r->gop);
free(r->sh);
free(r);
return NULL;
}
if(! read_le_int64(in, &(r->gop[i].frame_count)) ){
fclose(in);
free(r->gop);
free(r->sh);
free(r);
return NULL;
}
if(! read_le_int32(in, &offset) ){
fclose(in);
free(r->gop);
free(r->sh);
free(r);
return NULL;
}
r->gop[i].sh = r->sh + offset;
}
for(i=0;i<r->num_of_sh;i++){
if(! load_sequence_header(r->sh+i, in)){
fclose(in);
free(r->gop);
free(r->sh);
free(r);
return NULL;
}
}
fclose(in);
return r;
}
static void release_gop_entries(GOP_ENTRY *last)
{
GOP_ENTRY *p;
GOP_ENTRY *c;
c = last;
while(c != NULL){
p = c->prev;
free(c);
c = p;
}
}
static void release_sequence_entries(SEQUENCE_ENTRY *last)
{
SEQUENCE_ENTRY *p;
SEQUENCE_ENTRY *c;
c = last;
while(c != NULL){
p = c->prev;
free(c);
c = p;
}
}
static int save_sequence_header(SEQUENCE_HEADER *sh, FILE *fp)
{
int i;
if(! write_le_int32(sh->orig_h_size, fp) ){
return 0;
}
if(! write_le_int32(sh->orig_v_size, fp) ){
return 0;
}
if(! write_le_int32(sh->h_size, fp) ){
return 0;
}
if(! write_le_int32(sh->v_size, fp) ){
return 0;
}
if(! write_le_int32(sh->aspect_ratio, fp) ){
return 0;
}
if(! write_le_int32(sh->picture_rate, fp) ){
return 0;
}
if(! write_le_int32(sh->bit_rate, fp) ){
return 0;
}
if(! write_le_int32(sh->vbv_buffer_size, fp) ){
return 0;
}
if(! write_le_int32(sh->mpeg1, fp) ){
return 0;
}
if(! write_le_int32(sh->has_intra_quantizer_matrix, fp) ){
return 0;
}
if(sh->has_intra_quantizer_matrix){
for(i=0;i<64;i++){
fputc(sh->iqm[i], fp);
}
}
if(! write_le_int32(sh->has_nonintra_quantizer_matrix, fp) ){
return 0;
}
if(sh->has_nonintra_quantizer_matrix){
for(i=0;i<64;i++){
fputc(sh->nqm[i], fp);
}
}
if(! write_le_int32(sh->has_sequence_extension, fp) ){
return 0;
}
if(sh->has_sequence_extension){
if(! write_le_int32(sh->se.profile_and_level, fp)){
return 0;
}
if(! write_le_int32(sh->se.progressive, fp)){
return 0;
}
if(! write_le_int32(sh->se.chroma_format, fp)){
return 0;
}
if(! write_le_int32(sh->se.low_delay, fp)){
return 0;
}
if(! write_le_int32(sh->se.frame_rate_ext_n, fp)){
return 0;
}
if(! write_le_int32(sh->se.frame_rate_ext_d, fp)){
return 0;
}
}
if(! write_le_int32(sh->has_sequence_display_extension, fp)){
return 0;
}
if(sh->has_sequence_display_extension){
if(! write_le_int32(sh->sd.video_format, fp)){
return 0;
}
if(! write_le_int32(sh->sd.has_color_description, fp)){
return 0;
}
if(! write_le_int32(sh->sd.color_primaries, fp)){
return 0;
}
if(! write_le_int32(sh->sd.transfer_characteristics, fp)){
return 0;
}
if(! write_le_int32(sh->sd.matrix_coefficients, fp)){
return 0;
}
if(! write_le_int32(sh->sd.display_h_size, fp)){
return 0;
}
if(! write_le_int32(sh->sd.display_v_size, fp)){
return 0;
}
}
if(! write_le_int32(sh->has_sequence_scalable_extension, fp)){
return 0;
}
if(sh->has_sequence_scalable_extension){
if(! write_le_int32(sh->ss.scalable_mode, fp)){
return 0;
}
if(! write_le_int32(sh->ss.layer, fp)){
return 0;
}
if(! write_le_int32(sh->ss.lower_layer_prediction_h_size, fp)){
return 0;
}
if(! write_le_int32(sh->ss.lower_layer_prediction_v_size, fp)){
return 0;
}
if(! write_le_int32(sh->ss.h_subsampling_facter_m, fp)){
return 0;
}
if(! write_le_int32(sh->ss.h_subsampling_facter_n, fp)){
return 0;
}
if(! write_le_int32(sh->ss.v_subsampling_facter_m, fp)){
return 0;
}
if(! write_le_int32(sh->ss.v_subsampling_facter_n, fp)){
return 0;
}
if(! write_le_int32(sh->ss.picture_mux_enable, fp)){
return 0;
}
if(! write_le_int32(sh->ss.mux_to_progressive_sequence, fp)){
return 0;
}
if(! write_le_int32(sh->ss.pixture_mux_order, fp)){
return 0;
}
if(! write_le_int32(sh->ss.pixture_mux_facter, fp)){
return 0;
}
}
return 1;
}
static int load_sequence_header(SEQUENCE_HEADER *sh, FILE *fp)
{
int i;
if(! read_le_int32(fp, &(sh->orig_h_size)) ){
return 0;
}
if(! read_le_int32(fp, &(sh->orig_v_size)) ){
return 0;
}
if(! read_le_int32(fp, &(sh->h_size)) ){
return 0;
}
if(! read_le_int32(fp, &(sh->v_size)) ){
return 0;
}
if(! read_le_int32(fp, &(sh->aspect_ratio)) ){
return 0;
}
if(! read_le_int32(fp, &(sh->picture_rate)) ){
return 0;
}
if(! read_le_int32(fp, &(sh->bit_rate)) ){
return 0;
}
if(! read_le_int32(fp, &(sh->vbv_buffer_size)) ){
return 0;
}
if(! read_le_int32(fp, &(sh->mpeg1)) ){
return 0;
}
if(! read_le_int32(fp, &(sh->has_intra_quantizer_matrix)) ){
return 0;
}
if(sh->has_intra_quantizer_matrix){
for(i=0;i<64;i++){
sh->iqm[i] = fgetc(fp);
}
}
if(! read_le_int32(fp, &(sh->has_nonintra_quantizer_matrix)) ){
return 0;
}
if(sh->has_nonintra_quantizer_matrix){
for(i=0;i<64;i++){
sh->nqm[i] = fgetc(fp);
}
}
if(! read_le_int32(fp, &(sh->has_sequence_extension)) ){
return 0;
}
if(sh->has_sequence_extension){
if(! read_le_int32(fp, &(sh->se.profile_and_level))){
return 0;
}
if(! read_le_int32(fp, &(sh->se.progressive))){
return 0;
}
if(! read_le_int32(fp, &(sh->se.chroma_format))){
return 0;
}
if(! read_le_int32(fp, &(sh->se.low_delay))){
return 0;
}
if(! read_le_int32(fp, &(sh->se.frame_rate_ext_n))){
return 0;
}
if(! read_le_int32(fp, &(sh->se.frame_rate_ext_d))){
return 0;
}
}
if(! read_le_int32(fp, &(sh->has_sequence_display_extension))){
return 0;
}
if(sh->has_sequence_display_extension){
if(! read_le_int32(fp, &(sh->sd.video_format))){
return 0;
}
if(! read_le_int32(fp, &(sh->sd.has_color_description))){
return 0;
}
if(! read_le_int32(fp, &(sh->sd.color_primaries))){
return 0;
}
if(! read_le_int32(fp, &(sh->sd.transfer_characteristics))){
return 0;
}
if(! read_le_int32(fp, &(sh->sd.matrix_coefficients))){
return 0;
}
if(! read_le_int32(fp, &(sh->sd.display_h_size))){
return 0;
}
if(! read_le_int32(fp, &(sh->sd.display_v_size))){
return 0;
}
}
if(! read_le_int32(fp, &(sh->has_sequence_scalable_extension))){
return 0;
}
if(sh->has_sequence_scalable_extension){
if(! read_le_int32(fp, &(sh->ss.scalable_mode))){
return 0;
}
if(! read_le_int32(fp, &(sh->ss.layer))){
return 0;
}
if(! read_le_int32(fp, &(sh->ss.lower_layer_prediction_h_size))){
return 0;
}
if(! read_le_int32(fp, &(sh->ss.lower_layer_prediction_v_size))){
return 0;
}
if(! read_le_int32(fp, &(sh->ss.h_subsampling_facter_m))){
return 0;
}
if(! read_le_int32(fp, &(sh->ss.h_subsampling_facter_n))){
return 0;
}
if(! read_le_int32(fp, &(sh->ss.v_subsampling_facter_m))){
return 0;
}
if(! read_le_int32(fp, &(sh->ss.v_subsampling_facter_n))){
return 0;
}
if(! read_le_int32(fp, &(sh->ss.picture_mux_enable))){
return 0;
}
if(! read_le_int32(fp, &(sh->ss.mux_to_progressive_sequence))){
return 0;
}
if(! read_le_int32(fp, &(sh->ss.pixture_mux_order))){
return 0;
}
if(! read_le_int32(fp, &(sh->ss.pixture_mux_facter))){
return 0;
}
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -