buffered_reader_t *buffered_reader_open(const char *path, int32_t buffer_size, int32_t seek_mode) { buffered_reader_t *reader = malloc(sizeof(buffered_reader_t)); long long result; if (reader == 0) return 0; memset(reader, 0, sizeof(buffered_reader_t)); reader->cache_enabled = 1; reader->handle = -1; reader->buffer_size = buffer_size; reader->seek_mode = seek_mode; reader->buffer_0 = malloc_64(reader->buffer_size); if (reader->buffer_0 == 0) { buffered_reader_close(reader); return 0; } reader->buffer_1 = malloc_64(reader->buffer_size); if (reader->buffer_1 == 0) { buffered_reader_close(reader); return 0; } reader->buffer_2 = malloc_64(reader->buffer_size); if (reader->buffer_2 == 0) { buffered_reader_close(reader); return 0; } reader->handle = sceIoOpen(path, PSP_O_RDONLY, 0777); if (reader->handle < 0) { buffered_reader_close(reader); return 0; } if (sceIoChangeAsyncPriority(reader->handle, 0x10) < 0) { buffered_reader_close(reader); return 0; } reader->length = sceIoLseek32(reader->handle, 0, PSP_SEEK_END); reader->first_buffer = reader->buffer_0; reader->second_buffer = reader->buffer_1; reader->third_buffer = reader->buffer_2; sceIoLseek32(reader->handle, reader->position_0, PSP_SEEK_SET); sceIoReadAsync(reader->handle, reader->first_buffer, reader->position_1 - reader->position_0); sceIoWaitAsync(reader->handle, &result); sceIoLseek32(reader->handle, reader->position_1, PSP_SEEK_SET); sceIoReadAsync(reader->handle, reader->second_buffer, reader->position_2 - reader->position_1); sceIoWaitAsync(reader->handle, &result); sceIoLseek32(reader->handle, reader->position_2, PSP_SEEK_SET); sceIoReadAsync(reader->handle, reader->third_buffer, reader->position_3 - reader->position_2); return reader; }
char *mp4_read_open(struct mp4_read_struct *p, char *s) { mp4_read_safe_constructor(p); char *result = mp4_file_open(&p->file, s); if (result != 0) { mp4_read_close(p); return(result); } p->video_handle = sceIoOpen(s, PSP_O_RDONLY, 0777); if (p->video_handle < 0) { mp4_read_close(p); return("mp4_read_open: can't open file"); } if (sceIoChangeAsyncPriority(p->video_handle, 0x10) < 0) { mp4_read_close(p); return("mp4_read_open: sceIoChangeAsyncPriority failed"); } p->audio_handle = sceIoOpen(s, PSP_O_RDONLY, 0777); if (p->audio_handle < 0) { mp4_read_close(p); return("mp4_read_open: can't open file"); } if (sceIoChangeAsyncPriority(p->audio_handle, 0x10) < 0) { mp4_read_close(p); return("mp4_read_open: sceIoChangeAsyncPriority failed"); } p->video_buffer_0 = malloc_64(p->file.maximum_video_trunk_size); if (p->video_buffer_0 == 0) { mp4_read_close(p); return("mp4_read_open: malloc_64 failed on buffer_0"); } memset(p->video_buffer_0, 0, p->file.maximum_video_trunk_size); p->video_buffer_1 = malloc_64(p->file.maximum_video_trunk_size); if (p->video_buffer_1 == 0) { mp4_read_close(p); return("mp4_read_open: malloc_64 failed on buffer_1"); } memset(p->video_buffer_1, 0, p->file.maximum_video_trunk_size); p->audio_buffer_0 = malloc_64(p->file.maximum_audio_trunk_size); if (p->audio_buffer_0== 0) { mp4_read_close(p); return("mp4_read_open: malloc_64 failed on buffer_0"); } memset(p->audio_buffer_0, 0, p->file.maximum_audio_trunk_size); p->audio_buffer_1 = malloc_64(p->file.maximum_audio_trunk_size); if (p->audio_buffer_1== 0) { mp4_read_close(p); return("mp4_read_open: malloc_64 failed on buffer_0"); } memset(p->audio_buffer_1, 0, p->file.maximum_audio_trunk_size); p->audio_cache_buffer = malloc_64((sizeof(unsigned int)+p->file.maximum_audio_sample_size) * p->file.maximun_audio_sample_number); if (p->audio_cache_buffer== 0) { mp4_read_close(p); } memset(p->audio_cache_buffer, 0, (sizeof(unsigned int)+p->file.maximum_audio_sample_size) * p->file.maximun_audio_sample_number); p->audio_output_length = (unsigned int*)p->audio_cache_buffer; p->audio_output_buffer = p->audio_cache_buffer + sizeof(unsigned int)*p->file.maximun_audio_sample_number; p->video_asynchronous_buffer_0.buffer = p->video_buffer_0; p->video_asynchronous_buffer_1.buffer = p->video_buffer_1; p->video_current_asynchronous_buffer = &p->video_asynchronous_buffer_0; p->video_next_asynchronous_buffer = &p->video_asynchronous_buffer_1; p->audio_asynchronous_buffer_0.buffer = p->audio_buffer_0; p->audio_asynchronous_buffer_1.buffer = p->audio_buffer_1; p->audio_current_asynchronous_buffer = &p->audio_asynchronous_buffer_0; p->audio_next_asynchronous_buffer = &p->audio_asynchronous_buffer_1; time_math_interleaving_constructor(&p->interleaving, p->file.video_rate, p->file.video_scale, p->file.audio_rate, p->file.audio_resample_scale); time_math_interleaving_get(&p->interleaving); result = video_fill_current_and_next_asynchronous_buffer(p, 0); if (result != 0) { mp4_read_close(p); return(result); } result = audio_fill_current_and_next_asynchronous_buffer(p, 0); if (result != 0) { mp4_read_close(p); return(result); } return(0); }