⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 metadata.c

📁 Sun公司Dream项目
💻 C
📖 第 1 页 / 共 2 页
字号:
    // 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 + -