char* load() { Alert("vload\n"); // _lcd=*ot->lcd;//save lcd context // ot->lcd->size=256;//multipl 2^6 512/576/640/704/768 ot->me->mode=(ot->dmx->width>480||ot->dmx->height>272)?5:4; if(ot->dmx->width>272)ot->lcd->type=0;//PSP_DISPLAY_PIXEL_FORMAT_565; if(ot->dmx->width>480)return "tooBig";//still playable, but too slow. modmpg=ot->sys->modload("flash0:/kd/mpeg_vsh.prx"); if(!ot->me->pool)return("noPool"); if(sceMpegInit())return("MpegIni"); if( (ot->me->buffLen=(sceMpegQueryMemSize(ot->me->mode)&0xFFFFFFF0)+16)<0)return("noMemSz"); if(!(ot->me->buff=Memalign(64,ot->me->buffLen)))return("noMpgBf"); if(sceMpegCreate(Mpeg,ot->me->buff,ot->me->buffLen,&ot->me->ring,/*cscInit*/512,ot->me->mode,(int)ot->me->pool))return("MpgCrea");//fail if ME not started if(!(ot->me->mpegAu=(SceMpegAu*)Memalign(64,64)))return("noMpgAu"); if(sceMpegInitAu(Mpeg,(ot->me->buffAu=ot->me->pool+0x10000),ot->me->mpegAu))return("MpgInit"); return NULL; }
LPP_Mp4* LPP_Mp4Load(const char *filename) { LPP_Mp4 *tmp = (LPP_Mp4*)malloc(sizeof(LPP_Mp4)); if(!tmp) { #ifdef DEBUG dwrite_output("Function %s Line %d : Cannot allocate 'tmp' to memory.\n", __FUNCTION__, __LINE__); #endif return 0; } tmp->avc = (Mp4AvcDecoderStruct*)malloc(sizeof(Mp4AvcDecoderStruct)); if(!tmp->avc) { #ifdef DEBUG dwrite_output("Function %s Line %d : Cannot allocate 'tmp'->avc to memory.\n", __FUNCTION__, __LINE__); #endif free(tmp); return 0; } tmp->csc = (Mp4AvcCscStruct*)malloc(sizeof(Mp4AvcCscStruct)); if(!tmp->csc) { #ifdef DEBUG dwrite_output("Function %s Line %d : Cannot allocate 'tmp' to memory.\n", __FUNCTION__, __LINE__); #endif free(tmp->avc); free(tmp); return 0; } mp4_read_safe_constructor(&(tmp->reader)); memset(tmp->avc, 0, sizeof(Mp4AvcDecoderStruct)); if(mp4_read_open(&(tmp->reader), (char*)filename)) { #ifdef DEBUG dwrite_output("Function %s Line %d : mp4_read_open error.\n", __FUNCTION__, __LINE__); #endif free(tmp->csc); free(tmp->avc); free(tmp); return 0; } if(tmp->reader.file.info->tracks[tmp->reader.file.video_track_id]->avc_profile == 0x4D && (tmp->reader.file.video_width > 480 || tmp->reader.file.video_height > 272)) { cooleyesMeBootStart(devkitVersion, 1); tmp->avc->mpeg_mode = 5; } else if(tmp->reader.file.info->tracks[tmp->reader.file.video_track_id]->avc_profile == 0x4D) { cooleyesMeBootStart(devkitVersion, 3); tmp->avc->mpeg_mode = 4; } else if(tmp->reader.file.info->tracks[tmp->reader.file.video_track_id]->avc_profile == 0x42) { cooleyesMeBootStart(devkitVersion, 4); tmp->avc->mpeg_mode = 4; } tmp->avc->mpeg_ddrtop = memalign(0x400000, 0x400000); if(!tmp->avc->mpeg_ddrtop) { #ifdef DEBUG dwrite_output("Function %s Line %d : Cannot allocate 'tmp->avc->mpeg_ddrtop' to memory.\n", __FUNCTION__, __LINE__); #endif free(tmp->csc); free(tmp->avc); free(tmp); return 0; } tmp->avc->mpeg_au_buffer = tmp->avc->mpeg_ddrtop + 0x10000; int res = sceMpegQueryMemSize(tmp->avc->mpeg_mode); if(res < 0) { #ifdef DEBUG dwrite_output("Function %s Line %d : res < 0.\n", __FUNCTION__, __LINE__); #endif free(tmp->csc); free(tmp->avc->mpeg_ddrtop); free(tmp->avc); free(tmp); return 0; } tmp->avc->mpeg_buffer_size = res; if(!(res & 0xF)) res = (res & 0xFFFFFFF0) + 16; tmp->avc->mpeg_buffer = malloc_64(res); if(!tmp->avc->mpeg_buffer) { #ifdef DEBUG dwrite_output("Function %s Line %d : Cannot allocate 'tmp->avc->mpeg_buffer' to memory.\n", __FUNCTION__, __LINE__); #endif free(tmp->csc); free(tmp->avc->mpeg_ddrtop); free(tmp->avc); free(tmp); return 0; } if(sceMpegCreate(&(tmp->avc->mpeg), tmp->avc->mpeg_buffer, tmp->avc->mpeg_buffer_size, &(tmp->avc->mpeg_ringbuffer), 512, tmp->avc->mpeg_mode, (SceInt32)tmp->avc->mpeg_ddrtop)) { #ifdef DEBUG dwrite_output("Function %s Line %d : Error in sceMpegCreate.\n", __FUNCTION__, __LINE__); #endif LPP_Mp4Close(tmp); return 0; } tmp->avc->mpeg_au = (SceMpegAu*)malloc_64(64); memset(tmp->avc->mpeg_au, 0xFF, 64); if(sceMpegInitAu(&(tmp->avc->mpeg), tmp->avc->mpeg_au_buffer, tmp->avc->mpeg_au)) { #ifdef DEBUG dwrite_output("Function %s Line %d : Error in sceMpegInitAu.\n", __FUNCTION__, __LINE__); #endif LPP_Mp4Close(tmp); return 0; } tmp->avc->mpeg_sps_size = tmp->reader.file.info->tracks[tmp->reader.file.video_track_id]->avc_sps_size; tmp->avc->mpeg_pps_size = tmp->reader.file.info->tracks[tmp->reader.file.video_track_id]->avc_pps_size; tmp->avc->mpeg_nal_prefix_size = tmp->reader.file.info->tracks[tmp->reader.file.video_track_id]->avc_nal_prefix_size; tmp->avc->mpeg_sps_pps_buffer = malloc_64(tmp->avc->mpeg_sps_size + tmp->avc->mpeg_pps_size); if(!tmp->avc->mpeg_sps_pps_buffer) { #ifdef DEBUG dwrite_output("Function %s Line %d : Cannot allocate 'tmp->avc->mpeg_sps_pps_buffer' to memory.\n", __FUNCTION__, __LINE__); #endif LPP_Mp4Close(tmp); return 0; } memcpy(tmp->avc->mpeg_sps_pps_buffer, tmp->reader.file.info->tracks[tmp->reader.file.video_track_id]->avc_sps, tmp->avc->mpeg_sps_size); memcpy(tmp->avc->mpeg_sps_pps_buffer + tmp->avc->mpeg_sps_size, tmp->reader.file.info->tracks[tmp->reader.file.video_track_id]->avc_pps, tmp->avc->mpeg_pps_size); return (tmp); }