📄 metadata.c
字号:
// column. This needs to be fixed properly.
if ( curr_direction == DIR_REV ) {
fseek(meta->meta_file, -1 * offset + 4, SEEK_END);
} else {
fseek(meta->meta_file, offset, SEEK_SET);
}
// XXX
// switch_stream_offset = search_offset(meta,cur_stream_no, switch_stream_no,
// cur_offset,meta->header->no_of_streams, direction, curr_direction, frame_type);
ret_frame = search_frame(meta,cur_stream_no, switch_stream_no,
cur_offset,meta->header->no_of_streams, direction, curr_direction, frame_type);
// 23 = number of bytes to back up to get to sequence header.
// switch_stream_offset -= 23;
// back up to beginning of the transport stream packet.
// switch_stream_offset = switch_stream_offset -
// ( switch_stream_offset % 188 );
// return switch_stream_offset;
return ret_frame;
}
// search frame_offsset > offset
//FileOffset search_offset(metadata *meta,int stream_no,
picFrame_metadata * search_frame(metadata *meta,int stream_no,
int switch_stream_no,FileOffset offset, int no_of_streams, int direction,
int curr_direction, int frame_type){
picFrame_metadata *frame;
int size_of_frame;
FileOffset present_offset;
int err;
FILE *meta_file;
long pos, frame_no, seek_offset;
err = 1;
meta_file = meta->meta_file;
present_offset = -1;
frame = (picFrame_metadata*)malloc(sizeof(picFrame_metadata));
while(present_offset == -1){
present_offset = read_next_frame(meta_file,no_of_streams, stream_no,frame, &err);
if (err == 0)
return (picFrame_metadata *)-1; //will break at the lastframe: change it
}
// free(frame);
pos = ftell(meta_file);
if( (present_offset > offset && curr_direction == DIR_FWD) ||
(present_offset < offset && curr_direction == DIR_REV) ){
if(pos <= meta->header->metadata_offset) {
return frame;
}
free(frame);
frame =
search_reverse(meta_file,no_of_streams,stream_no,present_offset,offset,
curr_direction );
// frame_no = frame->frame_number;
#ifdef PRN_DEBUG
printf("\n search_reverse frame details: frame_number %d, frametype %d", frame->frame_number, frame->frametype);
#endif //PRN_DEBUG
} else {
free(frame);
frame =
search_forward(meta_file,no_of_streams,stream_no,present_offset,offset,
curr_direction );
// frame_no = frame->frame_number - 1;
#ifdef PRN_DEBUG
printf("\n search_forward frame + 1 details: frame_number %d, frametype %d", frame->frame_number, frame->frametype);
#endif //PRN_DEBUG
}
/* if frame type is not specified. */
if(frame->offsets[switch_stream_no] != -1 && ( frame_type == ANY_FRAME ||
frame_type == frame->frametype )) {
present_offset = frame->offsets[switch_stream_no];
#ifdef PRN_DEBUG
printf("\n (No find_next) found frame details: frame_number %d, frametype %d", frame->frame_number, frame->frametype);
printf("\n searched offset is %lld", present_offset);
fflush(stdout);
#endif
// free(frame);
// return present_offset;
return frame;
}
// reseting the meta file to seach for the switch stream offset
frame_no = frame->frame_number;
size_of_frame = sizeof(frame->frame_number) + sizeof(frame->frametype) +
no_of_streams*sizeof(FileOffset);
free(frame);
seek_offset = meta->header->metadata_offset + (frame_no)*size_of_frame;
fseek(meta->meta_file,seek_offset,SEEK_SET);
if(direction == DIR_FWD) {
frame =
find_next_of_frame_type(meta_file,no_of_streams,switch_stream_no,frame_type);
} else {
frame =
find_prev_of_frame_type(meta_file,no_of_streams,switch_stream_no,frame_type);
}
present_offset = frame->offsets[switch_stream_no];
#ifdef PRN_DEBUG
printf("\n found frame details: frame_number %d, frametype %d", frame->frame_number, frame->frametype);
printf("\n searched offset is %lld", present_offset);
fflush(stdout);
#endif
// free(frame);
// return present_offset;
return frame;
/*
} else { // if frame_type is specified.
#ifdef PRN_DEBUG
printf("\n frame_type is specified");
#endif //PRN_DEBUG
if( frame->offsets[switch_stream_no] != -1 && frame->frametype ==
frame_type ) {
present_offset = frame->offsets[switch_stream_no];
free(frame);
#ifdef PRN_DEBUG
printf("\n offset found. did not have to search. offset %ld", present_offset);
printf("\n frame details: frame_number %x, frametype %d",
frame->frame_number, frame->frametype);
#endif //PRN_DEBUG
return present_offset;
}
frame_no = frame->frame_number;
size_of_frame = sizeof(frame->frame_number) + sizeof(frame->frametype) +
no_of_streams*sizeof(FileOffset);
seek_offset = meta->header->metadata_offset + (frame_no)*size_of_frame;
fseek(meta->meta_file,seek_offset,SEEK_SET);
if(direction == DIR_FWD) {
frame =
find_next_of_frame_type(meta_file,no_of_streams,switch_stream_no,
frame_type);
} else {
frame =
find_prev_of_frame_type(meta_file,no_of_streams,switch_stream_no,
frame_type);
}
present_offset = frame->offsets[switch_stream_no];
#ifdef PRN_DEBUG
printf("\n searched offset of frame_type %d, is offset %ld", frame_type,
present_offset);
printf("\n frame details: frame_number %x, frametype %d",
frame->frame_number, frame->frametype);
fflush(stdout);
#endif //PRN_DEBUG
free(frame);
return present_offset;
}
*/
}
picFrame_metadata* find_next_of_frame_type(FILE *file,int no_of_streams,
int stream_no, int frame_type)
{
int err;
picFrame_metadata *frame;
#ifdef PRN_DEBUG
printf("\n Arguments to find_next_of_frame_type file %x, no_of_streams %d, stream no %d, frame_type %d", file, no_of_streams, stream_no, frame_type);
#endif //PRN_DEBUG
frame = (picFrame_metadata*)malloc(sizeof(picFrame_metadata));
do {
read_next_frame(file,no_of_streams,stream_no,frame,&err);
if(err == 0)
return frame;
}while( frame_type != frame->frametype );
return frame;
}
picFrame_metadata* find_prev_of_frame_type(FILE *file,int no_of_streams,
int stream_no, int frame_type)
{
int err;
picFrame_metadata *frame;
#ifdef PRN_DEBUG
printf("\n Arguments to find_prev_of_frame_type file %x, no_of_streams %d, stream no %d, frame_type %d", file, no_of_streams, stream_no, frame_type);
#endif //PRN_DEBUG
frame = (picFrame_metadata*)malloc(sizeof(picFrame_metadata));
do {
read_previous_frame(file,no_of_streams,stream_no,frame,&err);
if(err == 0)
return frame;
}while( frame_type != frame->frametype );
return frame;
}
picFrame_metadata *search_reverse(FILE *file,int no_of_streams,int stream_no,
FileOffset last_offset, FileOffset offset, int curr_direction ){
FileOffset present_offset;
int err;
int done;
picFrame_metadata *frame, *old_frame;
present_offset = last_offset;
frame = (picFrame_metadata*)malloc(sizeof(picFrame_metadata));
done = (curr_direction == DIR_FWD) ? present_offset < offset :
present_offset >= offset ;
while( !done ) {
old_frame = frame;
present_offset = read_previous_frame(file,no_of_streams,stream_no,frame,&err);
if(err == 0)
return frame;
done = (curr_direction == DIR_FWD) ? present_offset < offset :
present_offset >= offset ;
#ifdef PRN_DEBUG
// printf("search_forward frame->frame_number, present_offset %lld offset %lld\n",
// frame->frame_number, present_offset, offset);
// fflush(stdout);
#endif // PRN_DEBUG
}
return frame;
}
picFrame_metadata *search_forward(FILE* file,int no_of_streams,int stream_no,
FileOffset last_offset, FileOffset offset, int curr_direction ){
FileOffset tmp_offset,present_offset;
int err;
int done;
picFrame_metadata *frame, *old_frame;
present_offset = last_offset;
frame = (picFrame_metadata*)malloc(sizeof(picFrame_metadata));
done = (curr_direction == DIR_FWD) ? present_offset >= offset :
present_offset < offset ;
while( !done ) {
old_frame = frame;
tmp_offset= read_next_frame(file,no_of_streams,stream_no,frame,&err);
if(err == 0)
return frame;
present_offset = tmp_offset;
done = (curr_direction == DIR_FWD) ? present_offset >= offset :
present_offset < offset ;
#ifdef PRN_DEBUG
// printf("search_forward frame->frame_number, present_offset %lld offset %lld\n",
// frame->frame_number, present_offset, offset);
// fflush(stdout);
#endif // PRN_DEBUG
}
return frame;
}
FileOffset read_previous_frame(FILE* f,int no_of_streams, int stream_no, picFrame_metadata *frame,int *err){
int size_of_frames;
FileOffset offset;
int size_of_frame;
size_of_frame = sizeof(frame->frame_number) + sizeof(frame->frametype) +
no_of_streams*sizeof(FileOffset);
do{
*err = fseek(f,-2*(size_of_frame),SEEK_CUR);
if (*err != 0){
*err = 0;
return 0;
}
*err = fread(&(frame->frame_number),sizeof(frame->frame_number),1,f);
if(*err != 1){
*err = 0;
return 0;
}
*err = fread(&(frame->frametype),sizeof(frame->frametype),1,f);
if(*err != 1){
*err = 0;
return 0;
}
*err = fread(frame->offsets,sizeof(FileOffset),no_of_streams,f);
if(*err != no_of_streams){
*err = 0;
return 0;
}
offset = frame->offsets[stream_no];
//*err = fseek(f,-1*(size_of_frame),SEEK_CUR);
//if(*err != 0){
// *err = 0;
// return 0;
//}
}while(offset ==-1 && frame->frame_number != 0);
if(offset == -1) {
*err = 0;
return 0;
}
*err =1;
return offset;
}
FileOffset read_next_frame(FILE* f,int no_of_streams, int stream_no,picFrame_metadata *frame, int *err){
int size_of_frames;
FileOffset offset;
int size_of_frame;
size_of_frame = sizeof(frame->frame_number) + sizeof(frame->frametype) +
no_of_streams*sizeof(FileOffset);
do{
// *err = fseek(f,(size_of_frame),SEEK_CUR);
// if (*err != 0){
// *err =0;
// return 0;
// }
*err = fread(&frame->frame_number,sizeof(frame->frame_number),1,f);
if(*err != 1){
*err = 0;
return 0;
}
*err = fread(&frame->frametype,sizeof(frame->frametype),1,f);
if(*err != 1){
*err = 0;
return 0;
}
*err = fread(frame->offsets,sizeof(FileOffset),no_of_streams,f);
if(*err != no_of_streams){
*err = 0;
return 0;
}
offset = frame->offsets[stream_no];
}while(offset ==-1 && !feof(f));
if(offset == -1) {
*err = 0;
return 0;
}
*err = 1;
return offset;
}
stream_metadata *get_stream_metadata(metadata *meta, int speed, int *stream_no) {
int i;
stream_metadata *stream;
assert(meta != NULL);
assert(meta->header != NULL);
stream = NULL;
*stream_no = -1;
for(i=0;i<meta->header->no_of_streams; i++){
if(meta->stream[i]->speed == speed){
stream = meta->stream[i];
*stream_no = i;
break;
}
}
return stream;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -