好长时间不用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");
}