Example #1
0
static char *get_audio_sample(struct mp4_read_struct *reader, unsigned int track_index, unsigned int sample, void **buffer) {
	char *result = 0;
	if ( track_index != reader->current_audio_track ) {
		result = wait_asynchronous_buffer(reader, reader->audio_next_asynchronous_buffer, reader->audio_handle);
		if (result != 0) {
			return(result);
		}
		reader->current_audio_track = track_index;
		unsigned int trunk_index ;
		trunk_index = find_trunk_index_by_sample(reader, reader->file.audio_track_ids[reader->current_audio_track], sample);
		result = audio_fill_current_and_next_asynchronous_buffer(reader, trunk_index);
		if (result != 0){
			return(result);
		}
		*buffer = reader->audio_current_asynchronous_buffer->sample_buffer[sample - reader->audio_current_asynchronous_buffer->first_sample];
	}	
	else if (sample >= reader->audio_current_asynchronous_buffer->first_sample && sample <= reader->audio_current_asynchronous_buffer->last_sample) {
		*buffer = reader->audio_current_asynchronous_buffer->sample_buffer[sample - reader->audio_current_asynchronous_buffer->first_sample];
	}
	else {
		result = wait_asynchronous_buffer(reader, reader->audio_next_asynchronous_buffer, reader->audio_handle);
		if (result != 0) {
			return(result);
		}

		if (sample >= reader->audio_next_asynchronous_buffer->first_sample && sample <= reader->audio_next_asynchronous_buffer->last_sample) {
			audio_swap_asynchronous_buffers(reader);

			result = audio_fill_next_asynchronous_buffer(reader);
			if (result != 0) {
				return(result);
			}

			*buffer = reader->audio_current_asynchronous_buffer->sample_buffer[sample - reader->audio_current_asynchronous_buffer->first_sample];
		}
		else {
			unsigned int trunk_index;
			trunk_index = find_trunk_index_by_sample(reader, reader->file.audio_track_ids[reader->current_audio_track], sample);
			result = audio_fill_current_and_next_asynchronous_buffer(reader, trunk_index);
			if (result != 0){
				return(result);
			}
			*buffer = reader->audio_current_asynchronous_buffer->sample_buffer[sample - reader->audio_current_asynchronous_buffer->first_sample];
		}
	}

	return(0);
}
Example #2
0
static char *get_video_sample(struct mp4_read_struct *reader, unsigned int sample, void **buffer) {
	if(sample >= reader->video_current_asynchronous_buffer->first_sample && sample <= reader->video_current_asynchronous_buffer->last_sample){//if sample is in the buffer
		*buffer = reader->video_current_asynchronous_buffer->sample_buffer[sample - reader->video_current_asynchronous_buffer->first_sample];
	}else{
		char *result = wait_asynchronous_buffer(reader, reader->video_next_asynchronous_buffer, reader->video_handle);
		if (result != 0) {
			return(result);
		}

		if (sample >= reader->video_next_asynchronous_buffer->first_sample && sample <= reader->video_next_asynchronous_buffer->last_sample) {
			video_swap_asynchronous_buffers(reader);

			result = video_fill_next_asynchronous_buffer(reader);
			if (result != 0) {
				return(result);
			}

			*buffer = reader->video_current_asynchronous_buffer->sample_buffer[sample - reader->video_current_asynchronous_buffer->first_sample];
		}
		else {
			unsigned int trunk_index;
			trunk_index = find_trunk_index_by_sample(reader, reader->file.video_track_id, sample);
			result = video_fill_current_and_next_asynchronous_buffer(reader, trunk_index);
			if (result != 0){
				return(result);
			}
			*buffer = reader->video_current_asynchronous_buffer->sample_buffer[sample - reader->video_current_asynchronous_buffer->first_sample];
		}
	}

	return(0);
}
Example #3
0
static char *fill_and_wait_asynchronous_buffer(struct mp4_read_struct *reader, struct mp4_asynchronous_buffer *p, SceUID handle, int track_id, unsigned int trunk_index) {
	char *result = fill_asynchronous_buffer(reader, p, handle, track_id, trunk_index);
	if (result != 0) {
		return(result);
	}

	result = wait_asynchronous_buffer(reader, p, handle);
	if (result != 0) {
		return(result);
	}

	return(0);
}
Example #4
0
static char *fill_and_wait_asynchronous_buffer(struct pmp_read_struct *reader, struct asynchronous_buffer *p, unsigned int first_packet, unsigned int first_packet_position, unsigned int seek)
	{
	char *result = fill_asynchronous_buffer(reader, p, first_packet, first_packet_position, seek);
	if (result != 0)
		{
		return(result);
		}


	result = wait_asynchronous_buffer(reader, p);
	if (result != 0)
		{
		return(result);
		}


	return(0);
	}