コード例 #1
0
void mp4_read_safe_constructor(struct mp4_read_struct *p) {
	mp4_file_safe_constructor(&p->file);

	p->video_handle = -1;
	p->audio_handle = -1;
	
	p->current_audio_track = 0;
	
	p->video_buffer_0 = 0;
	p->video_buffer_1 = 0;
	p->audio_buffer_0 = 0;
	p->audio_buffer_1 = 0;
	p->audio_cache_buffer = 0;
}
コード例 #2
0
ファイル: mp4_file.c プロジェクト: DavisDev/pmplayer-advance
void mp4_file_close(struct mp4_file_struct *p) {
	if (p->info != 0) {
		mp4info_close(p->info);
	}
	
	int i;
	for(i=0; i < 4; i++) {
		if ( p->subtitle_track_time[i] )
			free_64(p->subtitle_track_time[i]);
	}
	
	if ( p->avc_sps )
		free_64(p->avc_sps);
	if ( p->avc_pps )
		free_64(p->avc_pps);
	if ( p->samples )
		free_64(p->samples);
	if ( p->indexes )
		free_64(p->indexes);
	mp4_file_safe_constructor(p);
}
コード例 #3
0
ファイル: mp4_file.c プロジェクト: DavisDev/pmplayer-advance
char *mp4_file_open(struct mp4_file_struct *p, char *s) {
	mp4_file_safe_constructor(p);
	
	p->info = mp4info_open(s);
	
	if (p->info == 0){
		mp4_file_close(p);
		return("mp4_file_open: can't open file");
	}
	
	int i;
	
	for(i = 0; i < p->info->total_tracks; i++) {
		mp4info_track_t* track = p->info->tracks[i];
		if (track->type != MP4_TRACK_VIDEO)
			continue;
		
		if ( track->width < 1 || track->height < 1 )
			continue;
		if ( track->width > 720 || track->height > 480 ) 
			continue;
		if ( track->video_type == 0x61766331 /*avc1*/) {
			if ( track->avc_profile==0x42 && (track->width > 480 || track->height > 272) ) 
				continue;
		}
		else {
			if ( track->width > 480 || track->height > 272 ) 
				continue;
		}
		p->video_track_id = i;
		p->video_type = track->video_type;
		if ( p->video_type == 0x61766331 ) {
			p->avc_profile = track->avc_profile;
			p->avc_sps_size = track->avc_sps_size;
			p->avc_pps_size = track->avc_pps_size;
			p->avc_nal_prefix_size = track->avc_nal_prefix_size;
			p->avc_sps = malloc_64(p->avc_sps_size);
			if ( ! p->avc_sps ) {
				mp4_file_close(p);
				return("mp4_file_open: can't malloc avc_sps buffer");
			}
			memcpy(p->avc_sps, track->avc_sps, p->avc_sps_size);
			p->avc_pps = malloc_64(p->avc_pps_size);
			if ( ! p->avc_pps ) {
				mp4_file_close(p);
				return("mp4_file_open: can't malloc avc_pps buffer");
			}
			memcpy(p->avc_pps, track->avc_pps, p->avc_pps_size);
		}
		else {
			p->mp4v_decinfo_size = track->mp4v_decinfo_size;
			p->mp4v_decinfo = malloc_64(p->mp4v_decinfo_size);
			if ( ! p->mp4v_decinfo ) {
				mp4_file_close(p);
				return("mp4_file_open: can't malloc mp4v_decinfo buffer");
			}
			memcpy(p->mp4v_decinfo, track->mp4v_decinfo, p->mp4v_decinfo_size);
		}
		break;
	}
	if ( p->video_track_id < 0 ) {
		mp4_file_close(p);
		return("mp4_file_open: can't found video track in mp4 file");
	}
	
	for(i = 0; i < p->info->total_tracks; i++) {
		mp4info_track_t* track = p->info->tracks[i];
		if (track->type != MP4_TRACK_AUDIO)
			continue;
		if ( p->audio_tracks == 0 ) {
			if ( track->audio_type != 0x6D703461 && track->audio_type != 0x73616D72 )
				continue;
//			if ( track->channels != 2 )
//				continue;
			if ( track->samplerate != 8000 && track->samplerate != 22050 && track->samplerate != 24000 && track->samplerate != 44100 && track->samplerate != 48000 )
				continue;
//			if ( track->samplebits != 16 )
//				continue;
			p->audio_tracks++;
			p->audio_track_ids[p->audio_tracks-1] = i;
			p->audio_type = track->audio_type;
			if ( track->samplerate == 22050 || track->samplerate == 24000 )
				p->audio_up_sample = 1;
			else if ( track->samplerate == 8000 )
				p->audio_up_sample = 5;
		}
		else {
			mp4info_track_t* old_track = p->info->tracks[p->audio_track_ids[p->audio_tracks-1]];
			if ( old_track->audio_type != track->audio_type )
				continue;
//			if ( old_track->channels != track->channels )
//				continue;
			if ( old_track->samplerate != track->samplerate )
				continue;
//			if ( old_track->samplebits != track->samplebits )
//				continue;
			p->audio_tracks++;
			p->audio_track_ids[p->audio_tracks-1] = i;
		}
		if ( p->audio_tracks == 6 )
			break;
	}
	if ( p->audio_tracks == 0 ) {
		mp4_file_close(p);
		return("mp4_file_open: can't found audio track in mp4 file");
	}
	
//	int sample_id = 0;
//	unsigned int trunk_size = 0;
//	int j, k;
//	
//	mp4info_track_t* video_track = p->info->tracks[p->video_track_id];
//	for( i = 0; i < video_track->stsc_entry_count-1; i++ ) {
//		int trunk_num = video_track->stsc_first_chunk[i+1] - video_track->stsc_first_chunk[i];
//		for( j = 0; j < trunk_num; j++ ) {
//			trunk_size = 0;
//			for( k = 0; k < video_track->stsc_samples_per_chunk[i]; k++, sample_id++) {
//				unsigned int sample_size = (video_track->stsz_sample_size ? video_track->stsz_sample_size : video_track->stsz_sample_size_table[sample_id]);
//				if ( sample_size > p->maximum_video_sample_size )
//					p->maximum_video_sample_size = sample_size;
//				trunk_size += sample_size;
//			}
//			if ( trunk_size > p->maximum_video_trunk_size )
//				p->maximum_video_trunk_size = trunk_size;
//		}
//	}
//	trunk_size = 0;
//	for( k = 0; k < video_track->stsc_samples_per_chunk[i]; k++, sample_id++)
//		trunk_size += (video_track->stsz_sample_size ? video_track->stsz_sample_size : video_track->stsz_sample_size_table[sample_id]);	
//	if ( trunk_size > p->maximum_video_trunk_size )
//		p->maximum_video_trunk_size = trunk_size;
//		
//	int l;
//	for( l = 0; l < p->audio_tracks; l++ ) {
//		sample_id = 0;
//		mp4info_track_t* audio_track = p->info->tracks[p->audio_track_ids[l]];
//		for( i = 0; i < audio_track->stsc_entry_count-1; i++ ) {
//			int trunk_num = audio_track->stsc_first_chunk[i+1] - audio_track->stsc_first_chunk[i];
//			for( j = 0; j < trunk_num; j++ ) {
//				trunk_size = 0;
//				for( k = 0; k < audio_track->stsc_samples_per_chunk[i]; k++, sample_id++) {
//					unsigned int sample_size = (audio_track->stsz_sample_size ? audio_track->stsz_sample_size : audio_track->stsz_sample_size_table[sample_id]);
//					if ( sample_size > p->maximum_audio_sample_size )
//						p->maximum_audio_sample_size = sample_size;
//					trunk_size += sample_size;
//				}
//				if ( trunk_size > p->maximum_audio_trunk_size )
//					p->maximum_audio_trunk_size = trunk_size;
//			}
//		}
//		trunk_size = 0;
//		for( k = 0; k < audio_track->stsc_samples_per_chunk[i]; k++, sample_id++) {
//			unsigned int sample_size = (audio_track->stsz_sample_size ? audio_track->stsz_sample_size : audio_track->stsz_sample_size_table[sample_id]);
//			if ( sample_size > p->maximum_audio_sample_size )
//				p->maximum_audio_sample_size = sample_size;
//			trunk_size += sample_size;
//		}
//		if ( trunk_size > p->maximum_audio_trunk_size )
//			p->maximum_audio_trunk_size = trunk_size;
//	}
	
	p->video_width = p->info->tracks[p->video_track_id]->width;
	p->video_height = p->info->tracks[p->video_track_id]->height;
	p->number_of_video_frames = 0;
	for( i = 0; i < p->info->tracks[p->video_track_id]->stts_entry_count; i++)
		p->number_of_video_frames += p->info->tracks[p->video_track_id]->stts_sample_count[i];
	//p->number_of_video_frames = p->info->tracks[p->video_track_id]->stts_sample_count[0];
	p->video_rate = p->info->tracks[p->video_track_id]->time_scale;
	p->video_scale = p->info->tracks[p->video_track_id]->duration / p->number_of_video_frames;
	//p->video_scale = p->info->tracks[p->video_track_id]->stts_sample_duration[0];
	
	p->audio_actual_rate = p->info->tracks[p->audio_track_ids[0]]->samplerate;
	p->audio_rate = p->audio_actual_rate * (p->audio_up_sample+1) ;
	p->audio_scale = (p->audio_type == 0x6D703461 ? 1024 : 160);
	p->audio_resample_scale = p->audio_scale * (p->audio_up_sample+1);
	
	p->audio_stereo = 1;
	
	int64_t v0 = p->video_rate * p->audio_resample_scale;
	int64_t v1 = p->audio_rate * p->video_scale;
	
	if (v0 >= v1)
		p->video_audio_interval = (int)(v0 / v1);
	else
		p->video_audio_interval = (int)(-(v1/v0));
	
	
	return(mp4_file_build_index(p));
}