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); }
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); }
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); }
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); }