c语言文件抽取

好长时间不用C语言了,为了和以前的抽取代码兼容,今天用了一下C语言,程序先存上,以后用的时候再改。

#define _CRT_SECURE_NO_DEPRECATE
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <windows.h>

#define GOP_MEMBER_NUMBER 7*16
#define TID_NUMBER 5 //from 0 to 4
#define NO_ZERO_QID_NUMBER 6 //from 1 to 6, except 0
#define GOP_EXTRACT_FILE_NUM 30
#define PUBLIC_FIRST_LINE_NUMBER 7
#define TOTAL_GOP_NUMBER 15

//1、The first 7 lines store in every file.
//2、assume the total GOP number is 15

struct nalu {
	char start_pos[20];
	int frame_len;
	int DID;
	int QID;
	int TID;
	char slice_type[20];
	char discardable[20];
	char truncatable[20];
	int frame_no;
};

void Init_nalu(struct nalu *nalunit);
void Init_nalus(struct nalu nalus[], int len);
//Ensure every file's name .LEVEL_*_GOP_*_TID_*_QID_*.txt
void open_write_files(FILE *fpws[], int len, int GOP_number);
void close_write_files(FILE *fpws[], int len);
void read_info_in_nalus(struct nalu nalus[], int len, FILE** fpr);
void write_info_from_nalus(struct nalu nalus[], int info_number, FILE *fpws[], int file_number);
void write_info_for_current_GOP(struct nalu nalus[], int info_number, FILE *fpws[], int file_number);
void target_file_name_builder(char name[], int tid_index, int qid_index, int GOP_number, int level);


int main(int argc, char *argv[]) {
	if (argc != 2) {
		fprintf(stderr, "ERROR: argument's number is incorrect.");
		exit(0);
	}
	//extern vars
	struct nalu GOP_nalus[GOP_MEMBER_NUMBER];
	struct nalu public_first_lines[PUBLIC_FIRST_LINE_NUMBER];
	FILE *fpr = NULL;
	FILE *fpws[GOP_EXTRACT_FILE_NUM] = {NULL};
	char *read_file_name = NULL;
	int GOP_number;//store the current GOP number, start from 0
	int index;
	int GOP_before;
	int GOP_last;

	//define vars
	GOP_number = 0;
	read_file_name = argv[1];
	fpr = fopen(read_file_name, "r");
	if (!fpr) {
		fprintf(stderr, "ERROR: The source file can't be opened.");
		exit(0);
	}

	for (index = 0; index < TOTAL_GOP_NUMBER; index++) {
		printf("GOP_NUMBER : %d\n", index);
		//open the read file	
		open_write_files(fpws, GOP_EXTRACT_FILE_NUM, GOP_number);

		//Get and write the public first lines info
		read_info_in_nalus(public_first_lines, PUBLIC_FIRST_LINE_NUMBER, &fpr);
		write_info_from_nalus(public_first_lines, PUBLIC_FIRST_LINE_NUMBER, fpws, GOP_EXTRACT_FILE_NUM);

		//Write all the pre GOPs info
		for (GOP_before = 0; GOP_before < GOP_number; GOP_before++) {
			read_info_in_nalus(GOP_nalus, GOP_MEMBER_NUMBER, &fpr);
			write_info_from_nalus(GOP_nalus, GOP_MEMBER_NUMBER, fpws, GOP_EXTRACT_FILE_NUM);
		}

		//Get and write the current GOP lines info
		read_info_in_nalus(GOP_nalus, GOP_MEMBER_NUMBER, &fpr);
		write_info_for_current_GOP(GOP_nalus, GOP_MEMBER_NUMBER, fpws, GOP_EXTRACT_FILE_NUM);

		//Write all the last GOPs info
		for (GOP_last = GOP_number+1; GOP_last < TOTAL_GOP_NUMBER; GOP_last++) {
			printf("GOP_last : %d\n", GOP_last);
			read_info_in_nalus(GOP_nalus, GOP_MEMBER_NUMBER, &fpr);
			write_info_from_nalus(GOP_nalus, GOP_MEMBER_NUMBER, fpws, GOP_EXTRACT_FILE_NUM);
		}

		GOP_number++;
		fseek(fpr, 0, SEEK_SET);
		//close_write_files(fpws, GOP_EXTRACT_FILE_NUM);
	}
	fclose(fpr);
	fpr = NULL;
	return 0;
}

void Init_nalu(struct nalu *nalunit) {
	memset(nalunit->start_pos, 0, 20);
	// nalunit->frame_no=0;
	nalunit->DID = 0;
	nalunit->TID = 0;
	nalunit->QID = 0;
	memset(nalunit->slice_type, 0, 20);
	memset(nalunit->discardable, 0, 20);
	memset(nalunit->truncatable, 0, 20);
	nalunit->frame_len = 0;
	// nalunit->time=0;
	nalunit->frame_no = 0;
}

void Init_nalus(struct nalu nalus[], int len) {
	int i;
	for (i = 0; i < len; i++)
		Init_nalu(&nalus[i]);
}

//TODO:Ensure every file's name .LEVEL_*_GOP_*_TID_*_QID_*.txt
void open_write_files(FILE *fpws[], int len, int GOP_number) {
	int tid_index;
	int qid_index;
	int level = 1;
	close_write_files(fpws, len);
	for (tid_index = 0; tid_index < TID_NUMBER; tid_index++) {
		for (qid_index = 1; qid_index <= NO_ZERO_QID_NUMBER; qid_index++) {
			char name[50] = "level_";//_add number
			target_file_name_builder(name, tid_index, qid_index, GOP_number, level);
			fpws[level - 1] = fopen(name, "w");
			if (!fpws[level - 1]) {
				fprintf(stderr, "ERROR: open write file error , %s", name);
				exit(0);
			}
			level++;
		}
	}
}

void close_write_files(FILE *fpws[], int len) {
	int i;
	for (i = 0; i < len; i++) {
		if (!fpws[i]) {
			continue;
		}
		fclose(fpws[i]);
		fpws[i] = NULL;
	}
}


void read_info_in_nalus(struct nalu nalus[], int len, FILE** fpr) {
	int index;
	int read_numbers;
	Init_nalus(nalus, len);
	for (index = 0; index < len; index++) {
		read_numbers = fscanf(*fpr, "%s %d %d %d %d %s %s %s %d", nalus[index].start_pos, &nalus[index].frame_len,
			&nalus[index].DID, &nalus[index].TID, &nalus[index].QID, nalus[index].slice_type,
			nalus[index].discardable, nalus[index].truncatable, &nalus[index].frame_no);
		if (read_numbers != 9) {
			fprintf(stderr, "ERROR : READ_NUMBER wrong.(%d line)\n", index);
			fprintf(stderr, "The read number is : %d", read_numbers);
			exit(0);
		}
	}
}

void write_info_from_nalus(struct nalu nalus[], int info_number, FILE *fpws[], int file_number) {
	int file_index;
	int info_index;
	for (file_index = 0; file_index < file_number; file_index++){
		for (info_index = 0; info_index < info_number; info_index++) {
			fprintf(fpws[file_index], "%s %d %d %d %d %s %s %s %d\n", nalus[info_index].start_pos, nalus[info_index].frame_len,
				nalus[info_index].DID, nalus[info_index].TID, nalus[info_index].QID, nalus[info_index].slice_type,
				nalus[info_index].discardable, nalus[info_index].truncatable, nalus[info_index].frame_no);
		}
	}
}

//Support TID fit all number in {0,1,2,3,4}, and QID fit all number in {0,1,2,3,4,5,6}
void write_info_for_current_GOP(struct nalu nalus[], int info_number, FILE *fpws[], int file_number) {
	int file_index;
	int info_index;
	int index;

	struct nalu **ptr_nalus = (struct nalu**)malloc(sizeof(struct nalu*) * info_number);
	if (!ptr_nalus) {
		fprintf(stderr, "ERROR: malloc for ptr_nalus unsuccessful.");
		exit(0);
	}
	for (index = 0; index < info_number; index++) {
		ptr_nalus[index] = &nalus[index];
	}

	int tid = TID_NUMBER-1;
	int qid = NO_ZERO_QID_NUMBER;

	for (file_index = file_number - 1; file_index >= 0; file_index--) {
		for (info_index = 0; info_index < info_number; info_index++) {
			if (ptr_nalus[info_index] == NULL)
				continue;
			if (ptr_nalus[info_index]->QID != 0) {
				if (ptr_nalus[info_index]->TID == tid && ptr_nalus[info_index]->QID == qid) {
					ptr_nalus[info_index] = NULL;
					continue;
				}
			}
			fprintf(fpws[file_index], "%s %d %d %d %d %s %s %s %d\n", ptr_nalus[info_index]->start_pos,
				ptr_nalus[info_index]->frame_len, ptr_nalus[info_index]->DID, ptr_nalus[info_index]->TID,
				ptr_nalus[info_index]->QID, ptr_nalus[info_index]->slice_type,
				ptr_nalus[info_index]->discardable, ptr_nalus[info_index]->truncatable,
				ptr_nalus[info_index]->frame_no);
		}
		if (--qid == 0) {
			tid--;
			qid = NO_ZERO_QID_NUMBER;
		}
	}
	free(ptr_nalus);
}

void target_file_name_builder(char name[], int tid_index, int qid_index, int GOP_number, int level) {
	char tmp[10];
	_itoa(level, tmp, 10);
	strcat(name, tmp);
	strcat(name, "_GOP_");
	_itoa(GOP_number, tmp, 10);
	strcat(name, tmp);
	strcat(name, "_TID_");
	_itoa(tid_index, tmp, 10);
	strcat(name, tmp);
	strcat(name, "_QID_");
	_itoa(qid_index, tmp, 10);
	strcat(name, tmp);
	strcat(name, ".txt");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值