From b95ca6396414e96d4085f0a4330ffbe4f9b4b75f Mon Sep 17 00:00:00 2001 From: Oleksandr Shyshatskyi Date: Tue, 10 Mar 2026 22:53:33 +0200 Subject: [PATCH 1/3] Add video playback support for Vulkan and D3D11 renderers Integrate CRI Movie SDK video playback into both renderers: - Add YUV texture format mappings (Image_Y8_U2_V2, Image_Y8_U2_V2_A8) to Vulkan - Fix MappedTexture::Map multi-plane corruption: initialize ImageData once before the plane loop instead of per-iteration (matching D3D11 pattern) - Fix Vulkan ShaderInterface::Finish not calling base class, leaving PrimitiveOpen stuck true and crashing on next BeginPrimitive - Fix RenderSync double-EndFrame: remove duplicate RSync.BeginFrame/EndFrame from MeshCache since HAL already calls them on the same shared RSync object - Remove broken GDecodeTick/GRenderTick sync guard in Video_VideoImage that blocked all video frame decoding - Wire up video subsystem (CRI + DirectSound) in both GFxPlayerTiny samples - Add SF_ENABLE_VIDEO CMake option and libgfxvideo library target Co-Authored-By: Claude Opus 4.6 --- Apps/CMakeLists.txt | 5 +- .../GFxPlayerTiny/GFxPlayerTinyD3D1x.cpp | 20 ++++++- .../GFxPlayerTiny/GFxPlayerTinyVulkan.cpp | 58 +++++++++++++++++- CMakeLists.txt | 1 + Src/CMakeLists.txt | 60 +++++++++++++++++++ Src/Render/Render_ShaderHAL.h | 2 +- Src/Render/Vulkan/Vulkan_MeshCache.cpp | 2 - Src/Render/Vulkan/Vulkan_Shader.cpp | 11 ++-- Src/Render/Vulkan/Vulkan_Texture.cpp | 11 +++- Src/Video/Video_VideoImage.cpp | 8 --- 10 files changed, 159 insertions(+), 19 deletions(-) diff --git a/Apps/CMakeLists.txt b/Apps/CMakeLists.txt index 5b85aabf..4f86e2da 100644 --- a/Apps/CMakeLists.txt +++ b/Apps/CMakeLists.txt @@ -43,9 +43,11 @@ if(SF_RENDERER_VULKAN) target_link_libraries(GFxPlayerTinyVulkan PRIVATE sf_core gfxrender_vulkan + $<$:gfxvideo> ) target_link_options(GFxPlayerTinyVulkan PRIVATE /WHOLEARCHIVE:libgfxrender_vulkan + $<$:/WHOLEARCHIVE:libgfxvideo> ) set_target_properties(GFxPlayerTinyVulkan PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/Bin/$,x64,Win32>/Msvc10/GFxPlayerTinyVulkan" @@ -56,13 +58,14 @@ endif() # PlayerTiny -- minimal player (D3D9/D3D10/D3D11/GL, each a separate target) # --------------------------------------------------------------------------- if(SF_RENDERER_D3D11) - add_executable(PlayerTiny_D3D11 WIN32 + add_executable(PlayerTiny_D3D11 ${CMAKE_SOURCE_DIR}/Apps/Samples/Common/FxSoundFMOD.cpp ${CMAKE_SOURCE_DIR}/Apps/Samples/GFxPlayerTiny/GFxPlayerTinyD3D1x.cpp ) sf_apply_app_flags(PlayerTiny_D3D11) target_link_libraries(PlayerTiny_D3D11 PRIVATE sf_core gfxrender_d3d1x gfxsound_fmod dsound Msacm32 + $<$:gfxvideo> ) set_target_properties(PlayerTiny_D3D11 PROPERTIES OUTPUT_NAME "PlayerTiny" diff --git a/Apps/Samples/GFxPlayerTiny/GFxPlayerTinyD3D1x.cpp b/Apps/Samples/GFxPlayerTiny/GFxPlayerTinyD3D1x.cpp index dae37741..c668b094 100644 --- a/Apps/Samples/GFxPlayerTiny/GFxPlayerTinyD3D1x.cpp +++ b/Apps/Samples/GFxPlayerTiny/GFxPlayerTinyD3D1x.cpp @@ -22,6 +22,11 @@ otherwise accompanies this software in either electronic or hard copy form. #include "../Common/FxSoundFMOD.h" #endif +#ifdef GFX_ENABLE_VIDEO +#include "Video/Video_VideoPC.h" +#include "Video/Video_VideoSoundSystemDX8.h" +#endif + #include "Render/ImageFiles/PNG_ImageFile.h" #include "Render/ImageFiles/DDS_ImageFile.h" @@ -393,6 +398,14 @@ int FxPlayerTiny::Run() Ptr pAS2Support = *new GFx::AS2Support(); loader.SetAS2Support(pAS2Support); +#ifdef GFX_ENABLE_VIDEO + UInt32 affinityMasks[] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; + Ptr pVideo = *new Video::VideoPC(Video::VideoVMSupportAll(), + Thread::NormalPriority, 3, affinityMasks); + pVideo->SetSoundSystem(Ptr(*new Video::VideoSoundSystemDX8(0))); + loader.SetVideo(pVideo); +#endif + FxPlayerThreadCommandQueue* queue = new FxPlayerThreadCommandQueue; pCommandQueue = queue; // Load the movie file and create its instance. @@ -416,7 +429,7 @@ int FxPlayerTiny::Run() hMovieDisplay = pMovie->GetDisplayHandle(); // Create renderer. - pRenderHAL = *new Render::D3D1x::HAL(); + pRenderHAL = *new Render::D3D1x::HAL(queue); if (!(pRenderer = *new Render::Renderer2D(pRenderHAL.GetPtr()))) return 1; @@ -429,6 +442,11 @@ int FxPlayerTiny::Run() if (!pRenderHAL->InitHAL(D3D1x::HALInitParams(pDevice D3D11(, pDeviceContext)))) return 1; +#ifdef GFX_ENABLE_VIDEO + if (pVideo) + pVideo->SetTextureManager(pRenderHAL->GetTextureManager()); +#endif + // Set renderer on loader so that it is also applied to all children. //pRenderConfig = *new RenderConfig(pRenderer, RenderConfig::RF_EdgeAA | RenderConfig::RF_StrokeNormal); //pRenderConfig = *new RenderConfig(); diff --git a/Apps/Samples/GFxPlayerTiny/GFxPlayerTinyVulkan.cpp b/Apps/Samples/GFxPlayerTiny/GFxPlayerTinyVulkan.cpp index ee3b34e8..422e0c48 100644 --- a/Apps/Samples/GFxPlayerTiny/GFxPlayerTinyVulkan.cpp +++ b/Apps/Samples/GFxPlayerTiny/GFxPlayerTinyVulkan.cpp @@ -27,6 +27,12 @@ Authors : Scaleform Vulkan Backend #include "GFx_Renderer_Vulkan.h" #include "Render/Renderer2D.h" +#ifdef GFX_ENABLE_VIDEO +#include "Video/Video_Video.h" +#include "Video/Video_VideoPC.h" +#include "Video/Video_VideoSoundSystemDX8.h" +#endif + using namespace Scaleform; using namespace Scaleform::Render; using namespace Scaleform::GFx; @@ -136,12 +142,36 @@ class GFxFileLog : public Scaleform::Log } }; +// Single-threaded command queue: provides render interfaces (HAL, Renderer2D, +// TextureManager) to the movie system so that video textures can be created. +class VulkanThreadCommandQueue : public Render::ThreadCommandQueue +{ +public: + virtual void GetRenderInterfaces(Render::Interfaces* p) + { + p->pHAL = pHAL; + p->pRenderer2D = pR2D; + p->pTextureManager = pHAL ? pHAL->GetTextureManager() : nullptr; + p->RenderThreadID = 0; + } + virtual void PushThreadCommand(ThreadCommand* command) + { + if (command) command->Execute(); + } + Render::HAL* pHAL; + Render::Renderer2D* pR2D; +}; + // Scaleform objects static Ptr pHAL; static Ptr pRenderer; static Loader* pLoader = nullptr; static Ptr pMovieDef; static Ptr pMovie; +static VulkanThreadCommandQueue* pCommandQueue = nullptr; +#ifdef GFX_ENABLE_VIDEO +static Ptr pVideo; +#endif // Forward declarations bool InitVulkan(); @@ -1031,10 +1061,20 @@ static int AppMain(LPSTR lpCmdLine) Ptr pAS3Support = *new GFx::AS3Support(); pLoader->SetAS3Support(pAS3Support); + // Set up the single-threaded command queue so the movie system can access + // the TextureManager (required for video texture creation and BitmapData). + pCommandQueue = new VulkanThreadCommandQueue(); + pCommandQueue->pHAL = pHAL.GetPtr(); + pCommandQueue->pR2D = pRenderer.GetPtr(); + // Provide the GPU TextureManager so embedded SWF bitmaps are uploaded as GPU textures. Ptr pImageCreator = *SF_NEW GFx::ImageCreator(pHAL->GetTextureManager()); pLoader->SetImageCreator(pImageCreator); + // FileOpener is required so GFx can open SWF-referenced files (video .usm, images, etc.) + Ptr pFileOpener = *SF_NEW FileOpener; + pLoader->SetFileOpener(pFileOpener); + // Route all GFx/AS3 messages to the log file Ptr pGFxLog = *SF_NEW GFxFileLog(); pLoader->SetLog(pGFxLog); @@ -1043,6 +1083,17 @@ static int AppMain(LPSTR lpCmdLine) GFx::ActionControl::Action_Verbose | GFx::ActionControl::Action_LogAllFilenames); pLoader->SetActionControl(pActionCtrl); +#ifdef GFX_ENABLE_VIDEO + // Video playback (CRI Sofdec2) + pVideo = *new GFx::Video::VideoPC(GFx::Video::VideoVMSupportAll(), + Thread::NormalPriority, 3, NULL); + pVideo->SetSoundSystem( + Ptr(*new GFx::Video::VideoSoundSystemDX8(0))); + pVideo->SetTextureManager(pHAL->GetTextureManager()); + pLoader->SetVideo(pVideo); + if (vkLogFile) { fprintf(vkLogFile, "Video support initialized (CRI Movie + DirectSound)\n"); fflush(vkLogFile); } +#endif + if (vkLogFile) { fprintf(vkLogFile, "Loader created (AS2+AS3 support, verbose logging ON), loading SWF: %s\n", swfPath); fflush(vkLogFile); } pMovieDef = *pLoader->CreateMovie(swfPath, Loader::LoadAll); if (!pMovieDef) @@ -1052,7 +1103,7 @@ static int AppMain(LPSTR lpCmdLine) else { if (vkLogFile) { fprintf(vkLogFile, "MovieDef loaded OK: %s\n", swfPath); fflush(vkLogFile); } - pMovie = *pMovieDef->CreateInstance(); + pMovie = *pMovieDef->CreateInstance(false, 0, NULL, pCommandQueue); if (pMovie) { if (vkLogFile) { fprintf(vkLogFile, "Movie instance created, setting viewport %ux%u\n", WindowWidth, WindowHeight); fflush(vkLogFile); } @@ -1238,8 +1289,13 @@ static int AppMain(LPSTR lpCmdLine) if (vkDevice) vkDeviceWaitIdle(vkDevice); pMovie.Clear(); pMovieDef.Clear(); +#ifdef GFX_ENABLE_VIDEO + pVideo.Clear(); +#endif delete pLoader; pLoader = nullptr; + delete pCommandQueue; + pCommandQueue = nullptr; pRenderer.Clear(); if (pHAL) { pHAL->ShutdownHAL(); pHAL.Clear(); } CleanupVulkan(); diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c583261..fe4c3b2a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,7 @@ option(SF_BUILD_SAMPLES "Build sample applications" ON) option(SF_BUILD_KITS "Build kit demo applications" OFF) option(SF_BUILD_TESTS "Build test applications" OFF) option(SF_USE_SCU "Use single compilation units" OFF) +option(SF_ENABLE_VIDEO "Build video playback (CRI SDK)" OFF) # --------------------------------------------------------------------------- # Global compile settings diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index fc59ea6f..35424cd5 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -472,6 +472,7 @@ add_library(gfx_as3 STATIC ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Media/AS3_Obj_Media_SoundLoaderContext.cpp ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Media/AS3_Obj_Media_SoundMixer.cpp ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Media/AS3_Obj_Media_SoundTransform.cpp + ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Media/AS3_Obj_Media_Video.cpp ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Net/AS3_Obj_Net_FileFilter.cpp ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Net/AS3_Obj_Net_FileReference.cpp ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Net/AS3_Obj_Net_FileReferenceList.cpp @@ -479,6 +480,7 @@ add_library(gfx_as3 STATIC ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Net/AS3_Obj_Net_IDynamicPropertyWriter.cpp ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Net/AS3_Obj_Net_LocalConnection.cpp ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Net/AS3_Obj_Net_NetConnection.cpp + ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Net/AS3_Obj_Net_NetStream.cpp ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Net/AS3_Obj_Net_ObjectEncoding.cpp ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Net/AS3_Obj_Net_Responder.cpp ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Net/AS3_Obj_Net_SharedObject.cpp @@ -745,6 +747,64 @@ sf_apply_compile_flags(gfxsound_fmod) target_link_libraries(gfxsound_fmod PRIVATE fmod) set_target_properties(gfxsound_fmod PROPERTIES OUTPUT_NAME "libgfxsound_fmod") +# --------------------------------------------------------------------------- +# libgfxvideo -- CRI Movie video playback +# --------------------------------------------------------------------------- +if(SF_ENABLE_VIDEO) + # Locate CRI Movie SDK (headers + prebuilt libs) + set(SF_CRI_SDK_DIR "${CMAKE_SOURCE_DIR}/3rdParty/cri/pc" CACHE PATH + "Path to CRI Movie SDK (must contain include/ and libs/)") + if(NOT EXISTS "${SF_CRI_SDK_DIR}/include/cri_movie.h") + message(FATAL_ERROR + "SF_ENABLE_VIDEO=ON but CRI Movie SDK not found at ${SF_CRI_SDK_DIR}\n" + "Set SF_CRI_SDK_DIR to the directory containing include/cri_movie.h") + endif() + + # CRI imported libraries + add_library(cri_movie STATIC IMPORTED) + add_library(cri_base STATIC IMPORTED) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set_target_properties(cri_movie PROPERTIES IMPORTED_LOCATION + "${SF_CRI_SDK_DIR}/libs/x64/cri_movie_pcx64.lib") + set_target_properties(cri_base PROPERTIES IMPORTED_LOCATION + "${SF_CRI_SDK_DIR}/libs/x64/cri_base_pcx64.lib") + else() + set_target_properties(cri_movie PROPERTIES IMPORTED_LOCATION + "${SF_CRI_SDK_DIR}/libs/Win32/cri_movie_pcx86.lib") + set_target_properties(cri_base PROPERTIES IMPORTED_LOCATION + "${SF_CRI_SDK_DIR}/libs/Win32/cri_base_pcx86.lib") + endif() + + add_library(gfxvideo STATIC + ${CMAKE_SOURCE_DIR}/Src/Video/Video_Video.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/Video_VideoPC.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/Video_VideoPlayerImpl.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/Video_VideoCharacter.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/Video_VideoImage.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/Video_VideoAS2.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/Video_VideoAS3.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/Video_CriHeap.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/Video_CriMvFileReader.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/Video_CriMvSoundGateway.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/Video_CriMvSystemTimer.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/Video_SystemSoundInterface.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/Video_VideoSoundSystemDX8.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/AS2/AS2_NetConnection.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/AS2/AS2_NetStream.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/AS2/AS2_VideoObject.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/AS3/AS3_VideoCharacter.cpp + ${CMAKE_SOURCE_DIR}/Src/Video/AS3/AS3_VideoProviderNetStream.cpp + # AS3 runtime objects needed by video (Video, NetStream class info) + ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Media/AS3_Obj_Media_Video.cpp + ${CMAKE_SOURCE_DIR}/Src/GFx/AS3/Obj/Net/AS3_Obj_Net_NetStream.cpp + ) + sf_apply_compile_flags(gfxvideo) + target_include_directories(gfxvideo PRIVATE "${SF_CRI_SDK_DIR}/include") + target_link_libraries(gfxvideo PUBLIC cri_movie cri_base) + target_link_libraries(gfxvideo INTERFACE dsound) + set_target_properties(gfxvideo PROPERTIES OUTPUT_NAME "libgfxvideo") +endif() + # --------------------------------------------------------------------------- # libgfxrender_vulkan -- Vulkan renderer # --------------------------------------------------------------------------- diff --git a/Src/Render/Render_ShaderHAL.h b/Src/Render/Render_ShaderHAL.h index 3b94933d..ff4229d5 100644 --- a/Src/Render/Render_ShaderHAL.h +++ b/Src/Render/Render_ShaderHAL.h @@ -766,7 +766,7 @@ inline void ShaderHAL::DrawProcessedPrim ShaderData.BeginPrimitive(); const typename ShaderManagerType::Shader& pShader = - SManager.SetPrimitiveFill(pprimitive->pFill, fillFlags, pbatch->Type, pbatch->pFormat, + SManager.SetPrimitiveFill(pprimitive->pFill, fillFlags, pbatch->Type, pbatch->pFormat, batchMeshCount, Matrices, &pprimitive->Meshes[meshIndex], &ShaderData); Profiler.SetBatch(this, pprimitive, bidx); diff --git a/Src/Render/Vulkan/Vulkan_MeshCache.cpp b/Src/Render/Vulkan/Vulkan_MeshCache.cpp index 7588f8bb..817731fb 100644 --- a/Src/Render/Vulkan/Vulkan_MeshCache.cpp +++ b/Src/Render/Vulkan/Vulkan_MeshCache.cpp @@ -370,12 +370,10 @@ void MeshCache::BeginFrame() // guaranteed to no longer be referenced by any submitted command buffer. DestroyFrameCount++; destroyReadyPendingBuffers(); - RSync.BeginFrame(); } void MeshCache::EndFrame() { - RSync.EndFrame(); CacheList.EndFrame(); // Buffer destruction is now deferred to BeginFrame (after GPU fence wait). // Do NOT call destroyAllPendingBuffers() here. diff --git a/Src/Render/Vulkan/Vulkan_Shader.cpp b/Src/Render/Vulkan/Vulkan_Shader.cpp index 80b966f4..17ba3878 100644 --- a/Src/Render/Vulkan/Vulkan_Shader.cpp +++ b/Src/Render/Vulkan/Vulkan_Shader.cpp @@ -199,9 +199,11 @@ void ShaderInterface::BeginScene() bool ShaderInterface::SetStaticShader(ShaderDesc::ShaderType shader, const VertexFormat* pformat) { CurShaders.pVFormat = pformat; - CurShaders.pVS = &pHal->SManager.StaticVShaders[VertexShaderDesc::GetShaderIndex(shader, pHal->SManager.ShaderModel)]; + unsigned vsIndex = VertexShaderDesc::GetShaderIndex(shader, pHal->SManager.ShaderModel); + unsigned fsIndex = FragShaderDesc::GetShaderIndex(shader, pHal->SManager.ShaderModel); + CurShaders.pVS = &pHal->SManager.StaticVShaders[vsIndex]; CurShaders.pVDesc = CurShaders.pVS->pDesc; - CurShaders.pFS = &pHal->SManager.StaticFShaders[FragShaderDesc::GetShaderIndex(shader, pHal->SManager.ShaderModel)]; + CurShaders.pFS = &pHal->SManager.StaticFShaders[fsIndex]; CurShaders.pFDesc = CurShaders.pFS->pDesc; if (pformat) @@ -209,8 +211,7 @@ bool ShaderInterface::SetStaticShader(ShaderDesc::ShaderType shader, const Verte // Cache SysVertexFormat per (VertexFormat*, vsIndex) pair. Different shaders // assign different attribute locations (e.g. pos@loc0 vs pos@loc1), so a single // cached SysVertexFormat per VertexFormat is not safe. - unsigned vsIdx = VertexShaderDesc::GetShaderIndex(shader, pHal->SManager.ShaderModel); - UPInt cacheKey = ((UPInt)pformat * 2654435761u) ^ ((UPInt)vsIdx * 2246822519u); + UPInt cacheKey = ((UPInt)pformat * 2654435761u) ^ ((UPInt)vsIndex * 2246822519u); Ptr* ppCached = pHal->SManager.SysVFCache.Get(cacheKey); if (ppCached) { @@ -394,6 +395,8 @@ void ShaderInterface::Finish(unsigned meshCount) memset(pmgr->CurrentTextures, 0, sizeof(pmgr->CurrentTextures)); memset(pmgr->CurrentSamplers, 0, sizeof(pmgr->CurrentSamplers)); + + ShaderInterfaceBase::Finish(meshCount); } diff --git a/Src/Render/Vulkan/Vulkan_Texture.cpp b/Src/Render/Vulkan/Vulkan_Texture.cpp index 9105f5c3..25d996b7 100644 --- a/Src/Render/Vulkan/Vulkan_Texture.cpp +++ b/Src/Render/Vulkan/Vulkan_Texture.cpp @@ -24,6 +24,8 @@ static const TextureFormat::Mapping TextureFormatMapping[] = { Image_R8G8B8, VK_FORMAT_R8G8B8A8_UNORM, 4, &Image_CopyScanline24_Extend_RGB_RGBA, &Image_CopyScanline32_Retract_RGBA_RGB }, { Image_B8G8R8, VK_FORMAT_B8G8R8A8_UNORM, 4, &Image_CopyScanline24_Extend_RGB_RGBA, &Image_CopyScanline32_Retract_RGBA_RGB }, { Image_A8, VK_FORMAT_R8_UNORM, 1, &Image::CopyScanlineDefault, &Image::CopyScanlineDefault }, + { Image_Y8_U2_V2, VK_FORMAT_R8_UNORM, 1, &Image::CopyScanlineDefault, &Image::CopyScanlineDefault }, + { Image_Y8_U2_V2_A8,VK_FORMAT_R8_UNORM, 1, &Image::CopyScanlineDefault, &Image::CopyScanlineDefault }, { Image_DXT1, VK_FORMAT_BC1_RGBA_UNORM_BLOCK, 0, &Image::CopyScanlineDefault, &Image::CopyScanlineDefault }, { Image_DXT3, VK_FORMAT_BC2_UNORM_BLOCK, 0, &Image::CopyScanlineDefault, &Image::CopyScanlineDefault }, { Image_DXT5, VK_FORMAT_BC3_UNORM_BLOCK, 0, &Image::CopyScanlineDefault, &Image::CopyScanlineDefault }, @@ -508,6 +510,14 @@ bool MappedTexture::Map(Render::Texture* ptexture, unsigned mipLevel, unsigned l StartMipLevel = mipLevel; LevelCount = levelCount; + // Initialize Data once before the loop, using pre-allocated Planes array + // (matches D3D11 pattern). Calling Initialize inside the loop would Clear() + // previously set planes on each iteration, corrupting multi-plane textures (YUV). + if (levelCount <= PlaneReserveSize) + Data.Initialize(vktex->GetImageFormat(), levelCount, Planes, texPlaneCount * levelCount, true); + else if (!Data.Initialize(vktex->GetImageFormat(), levelCount, true)) + return false; + UByte* pdata = (UByte*)mapped; unsigned planeIdx = 0; for (unsigned itex = 0; itex < texPlaneCount; itex++) @@ -520,7 +530,6 @@ bool MappedTexture::Map(Render::Texture* ptexture, unsigned mipLevel, unsigned l UPInt pitch = (UPInt)mipW * mapping->BytesPerPixel; UPInt planeSize = pitch * mipH; - Data.Initialize(vktex->GetImageFormat(), level); Data.SetPlane(planeIdx, ImageSize(mipW, mipH), pitch, planeSize, pdata); pdata += planeSize; planeIdx++; diff --git a/Src/Video/Video_VideoImage.cpp b/Src/Video/Video_VideoImage.cpp index 38d6615d..dbaf93ef 100644 --- a/Src/Video/Video_VideoImage.cpp +++ b/Src/Video/Video_VideoImage.cpp @@ -28,8 +28,6 @@ namespace Scaleform { namespace GFx { namespace Video { // Scaleform can try to decode the video image multiple times and take a frame meant // for later. So we try to keep the renderer and decoder in sync to avoid that as much // as possible. -Uint64 GDecodeTick; -Uint64 GRenderTick; using namespace Render; @@ -69,12 +67,6 @@ bool VideoImage::Decode(ImageData* pdest, CopyScanlineFunc func, void* parg) con return true; } - if ( GDecodeTick >= GRenderTick ) - { - return false; - } - ++GDecodeTick; - if (pVideoPlayer->GetCriPlayer()->IsNextFrameOnTime()) { if (pdest->GetPlaneCount() >= 3) From 93ae5fad49d4d0896b9dd9285f0d51d8d3490672 Mon Sep 17 00:00:00 2001 From: Oleksandr Shyshatskyi Date: Tue, 10 Mar 2026 22:54:02 +0200 Subject: [PATCH 2/3] Add CRI Movie SDK 3.50 (video playback dependency) Headers and prebuilt libraries for PC (x86/x64), PS4, Xbox One, and Durango. Required when SF_ENABLE_VIDEO=ON. Co-Authored-By: Claude Opus 4.6 --- 3rdParty/cri/Durango/include/cri_allocator.h | 63 + 3rdParty/cri/Durango/include/cri_error.h | 368 ++ 3rdParty/cri/Durango/include/cri_heap.h | 640 +++ 3rdParty/cri/Durango/include/cri_movie_core.h | 2572 ++++++++++ 3rdParty/cri/Durango/include/cri_sj.h | 189 + 3rdParty/cri/Durango/include/cri_xpt.h | 26 + 3rdParty/cri/Durango/include/cri_xpt_post.h | 256 + .../cri/Durango/include/cri_xpts_durango.h | 132 + 3rdParty/cri/PS4/include/cri_allocator.h | 63 + 3rdParty/cri/PS4/include/cri_error.h | 368 ++ 3rdParty/cri/PS4/include/cri_heap.h | 640 +++ 3rdParty/cri/PS4/include/cri_movie.h | 4402 +++++++++++++++++ 3rdParty/cri/PS4/include/cri_movie_core.h | 2554 ++++++++++ 3rdParty/cri/PS4/include/cri_movie_ps4.h | 94 + 3rdParty/cri/PS4/include/cri_sj.h | 189 + 3rdParty/cri/PS4/include/cri_xpt.h | 27 + 3rdParty/cri/PS4/include/cri_xpt_post.h | 256 + 3rdParty/cri/PS4/include/cri_xpts_ps4.h | 133 + 3rdParty/cri/XboxOne/include/cri_allocator.h | 63 + 3rdParty/cri/XboxOne/include/cri_error.h | 368 ++ 3rdParty/cri/XboxOne/include/cri_heap.h | 640 +++ 3rdParty/cri/XboxOne/include/cri_movie.h | 4402 +++++++++++++++++ 3rdParty/cri/XboxOne/include/cri_movie_core.h | 2554 ++++++++++ .../cri/XboxOne/include/cri_movie_xboxone.h | 96 + 3rdParty/cri/XboxOne/include/cri_sj.h | 189 + 3rdParty/cri/XboxOne/include/cri_xpt.h | 26 + 3rdParty/cri/XboxOne/include/cri_xpt_post.h | 256 + .../cri/XboxOne/include/cri_xpts_xboxone.h | 132 + .../cri/XboxOne/libs/cri_base_xboxone.lib | Bin 0 -> 595226 bytes .../cri/XboxOne/libs/cri_movie_xboxone.lib | Bin 0 -> 1143940 bytes 3rdParty/cri/orbis/include/cri_allocator.h | 63 + 3rdParty/cri/orbis/include/cri_error.h | 368 ++ 3rdParty/cri/orbis/include/cri_sj.h | 189 + 3rdParty/cri/orbis/include/cri_xpt.h | 27 + 3rdParty/cri/orbis/include/cri_xpt_post.h | 256 + 3rdParty/cri/orbis/include/cri_xpts_orbis.h | 133 + 3rdParty/cri/pc/include/cri_allocator.h | 63 + 3rdParty/cri/pc/include/cri_error.h | 368 ++ 3rdParty/cri/pc/include/cri_heap.h | 640 +++ 3rdParty/cri/pc/include/cri_movie.h | 4402 +++++++++++++++++ 3rdParty/cri/pc/include/cri_movie_core.h | 2554 ++++++++++ 3rdParty/cri/pc/include/cri_movie_pc.h | 96 + 3rdParty/cri/pc/include/cri_sj.h | 189 + 3rdParty/cri/pc/include/cri_xpt.h | 51 + 3rdParty/cri/pc/include/cri_xpt_post.h | 256 + 3rdParty/cri/pc/include/cri_xpts_win.h | 164 + 3rdParty/cri/pc/libs/Win32/cri_base_pcx86.lib | Bin 0 -> 605824 bytes .../cri/pc/libs/Win32/cri_movie_pcx86.lib | Bin 0 -> 1653454 bytes 3rdParty/cri/pc/libs/x64/cri_base_pcx64.lib | Bin 0 -> 710970 bytes 3rdParty/cri/pc/libs/x64/cri_movie_pcx64.lib | Bin 0 -> 2104148 bytes 50 files changed, 31517 insertions(+) create mode 100644 3rdParty/cri/Durango/include/cri_allocator.h create mode 100644 3rdParty/cri/Durango/include/cri_error.h create mode 100644 3rdParty/cri/Durango/include/cri_heap.h create mode 100644 3rdParty/cri/Durango/include/cri_movie_core.h create mode 100644 3rdParty/cri/Durango/include/cri_sj.h create mode 100644 3rdParty/cri/Durango/include/cri_xpt.h create mode 100644 3rdParty/cri/Durango/include/cri_xpt_post.h create mode 100644 3rdParty/cri/Durango/include/cri_xpts_durango.h create mode 100644 3rdParty/cri/PS4/include/cri_allocator.h create mode 100644 3rdParty/cri/PS4/include/cri_error.h create mode 100644 3rdParty/cri/PS4/include/cri_heap.h create mode 100644 3rdParty/cri/PS4/include/cri_movie.h create mode 100644 3rdParty/cri/PS4/include/cri_movie_core.h create mode 100644 3rdParty/cri/PS4/include/cri_movie_ps4.h create mode 100644 3rdParty/cri/PS4/include/cri_sj.h create mode 100644 3rdParty/cri/PS4/include/cri_xpt.h create mode 100644 3rdParty/cri/PS4/include/cri_xpt_post.h create mode 100644 3rdParty/cri/PS4/include/cri_xpts_ps4.h create mode 100644 3rdParty/cri/XboxOne/include/cri_allocator.h create mode 100644 3rdParty/cri/XboxOne/include/cri_error.h create mode 100644 3rdParty/cri/XboxOne/include/cri_heap.h create mode 100644 3rdParty/cri/XboxOne/include/cri_movie.h create mode 100644 3rdParty/cri/XboxOne/include/cri_movie_core.h create mode 100644 3rdParty/cri/XboxOne/include/cri_movie_xboxone.h create mode 100644 3rdParty/cri/XboxOne/include/cri_sj.h create mode 100644 3rdParty/cri/XboxOne/include/cri_xpt.h create mode 100644 3rdParty/cri/XboxOne/include/cri_xpt_post.h create mode 100644 3rdParty/cri/XboxOne/include/cri_xpts_xboxone.h create mode 100644 3rdParty/cri/XboxOne/libs/cri_base_xboxone.lib create mode 100644 3rdParty/cri/XboxOne/libs/cri_movie_xboxone.lib create mode 100644 3rdParty/cri/orbis/include/cri_allocator.h create mode 100644 3rdParty/cri/orbis/include/cri_error.h create mode 100644 3rdParty/cri/orbis/include/cri_sj.h create mode 100644 3rdParty/cri/orbis/include/cri_xpt.h create mode 100644 3rdParty/cri/orbis/include/cri_xpt_post.h create mode 100644 3rdParty/cri/orbis/include/cri_xpts_orbis.h create mode 100644 3rdParty/cri/pc/include/cri_allocator.h create mode 100644 3rdParty/cri/pc/include/cri_error.h create mode 100644 3rdParty/cri/pc/include/cri_heap.h create mode 100644 3rdParty/cri/pc/include/cri_movie.h create mode 100644 3rdParty/cri/pc/include/cri_movie_core.h create mode 100644 3rdParty/cri/pc/include/cri_movie_pc.h create mode 100644 3rdParty/cri/pc/include/cri_sj.h create mode 100644 3rdParty/cri/pc/include/cri_xpt.h create mode 100644 3rdParty/cri/pc/include/cri_xpt_post.h create mode 100644 3rdParty/cri/pc/include/cri_xpts_win.h create mode 100644 3rdParty/cri/pc/libs/Win32/cri_base_pcx86.lib create mode 100644 3rdParty/cri/pc/libs/Win32/cri_movie_pcx86.lib create mode 100644 3rdParty/cri/pc/libs/x64/cri_base_pcx64.lib create mode 100644 3rdParty/cri/pc/libs/x64/cri_movie_pcx64.lib diff --git a/3rdParty/cri/Durango/include/cri_allocator.h b/3rdParty/cri/Durango/include/cri_allocator.h new file mode 100644 index 00000000..e3c18997 --- /dev/null +++ b/3rdParty/cri/Durango/include/cri_allocator.h @@ -0,0 +1,63 @@ +#ifndef _CRI_ALLOCATOR_H_INCLUDED +#define _CRI_ALLOCATOR_H_INCLUDED +/**************************************************************************** + * * + * CRI Allocator * + * * + * 2006-01-05 written by M.Oshimi * + * * + ****************************************************************************/ + +/**************************************************************************** + * Include file + ****************************************************************************/ +#include +#include "cri_xpt.h" +#include "cri_heap.h" + +/**************************************************************************** + * Macro Constants + ****************************************************************************/ +#if defined(XPT_UNSUPPORT_CPLUSPLUS_THROW) +#define CRI_ALLOCATOR_CPLUSPLUS_THROW +#else +#define CRI_ALLOCATOR_CPLUSPLUS_THROW throw() +#endif + +/**************************************************************************** + * Class Declaration + ****************************************************************************/ +#ifdef __cplusplus + +class CriAllocator +{ +public: + static const CriSint32 DEFAULT_ALIGNMENT = CRIHEAP_DEFAULT_MEM_ALIGN; + + + static void* CRIAPI operator new(size_t size, CriHeap heap) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, CriHeapType heap_type) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, const CriChar8 *name, CriUint32 align=DEFAULT_ALIGNMENT) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, CriHeapType heap_type, const CriChar8 *name, CriUint32 align=DEFAULT_ALIGNMENT) CRI_ALLOCATOR_CPLUSPLUS_THROW; + + static void CRIAPI operator delete(void *p, size_t size); + + static void* CRIAPI operator new(size_t size, void *work, CriSint32 wksize) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, void *work, CriSint32 wksize) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, void *work, CriSint32 wksize, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, void *work, CriSint32 wksize, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + +#if !defined(XPT_TGT_BCB) + static void CRIAPI operator delete(void *p, CriHeap heap) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, CriHeapType heap_type) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, const CriChar8 *name, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, CriHeapType heap_type, const CriChar8 *name, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; +#endif + + static CriSint32 GetWorstExtraSize(CriUint32 align); +}; +#endif // _CRI_ALLOCATOR_H_INCLUDED + +#endif /* end of __cplusplus */ + +/* --- end of file --- */ diff --git a/3rdParty/cri/Durango/include/cri_error.h b/3rdParty/cri/Durango/include/cri_error.h new file mode 100644 index 00000000..6fdd5f43 --- /dev/null +++ b/3rdParty/cri/Durango/include/cri_error.h @@ -0,0 +1,368 @@ +#ifndef _CRI_ERROR_H_INCLUDED +#define _CRI_ERROR_H_INCLUDED +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2006-2009 CRI Middleware Co., Ltd. + * + * Library : CRI Error + * Module : + * File : cri_error.h + * + ****************************************************************************/ +/*! + * \file cri_error.h + */ +/*JP + * \addtogroup CRI_ERROR エラーハンドリング用関数群 + * @{ + */ +/*EN + * \addtogroup CRI_ERROR Functions for error handling + * @{ + */ + +/**************************************************************************** + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" + +/**************************************************************************** + * MACRO CONSTANT * + ****************************************************************************/ + +/* バージョン番号 */ +/* Version number */ +#define CRIERROR_VER_NAME "CRI Error" +#define CRIERROR_VER_NUM "1.04.00" +#define CRIERROR_VER_OPTION + +/*JP + * \brief エラーコード + */ +/*EN + * \brief Error codes + */ +typedef enum { + CRIERR_OK = 0, /*JP< 正常終了 */ + /*EN< Succeeded */ + CRIERR_NG = -1, /*JP< エラーが発生 */ + /*EN< Error occurred */ + CRIERR_INVALID_PARAMETER = -2, /*JP< 引数が不正 */ + /*EN< Invalid argument */ + CRIERR_FAILED_TO_ALLOCATE_MEMORY = -3, /*JP< メモリの確保に失敗 */ + /*EN< Failed to allocate memory */ + CRIERR_UNSAFE_FUNCTION_CALL = -4, /*JP< 非スレッドセーフ関数の並列実行 */ + /*EN< Parallel execution of thread-unsafe function */ + CRIERR_FUNCTION_NOT_IMPLEMENTED = -5, /*JP< 未実装関数の実行 */ + /*EN< Function not implemented */ + CRIERR_LIBRARY_NOT_INITIALIZED = -6, /*JP< ライブラリが未初期化 */ + /*EN< Library not initialized */ + /* enum be 4bytes */ + CRIERR_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriError; + +/*JP + * \brief エラー通知レベル + */ +/*EN + * \brief Error notification level + */ +typedef enum { + CRIERR_NOTIFY_ALL = 0, /*JP< 全てのエラーを通知 */ + /*EN< Notify all errors */ + CRIERR_NOTIFY_FATAL = 1, /*JP< エラーのみ通知(警告は無視) */ + /*EN< Notify error (Disregards warning) */ + /* enum be 4bytes */ + CRIERR_NOTIFY_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriErrorNotificationLevel; + +/* エラーレベル */ +/* Error level */ +typedef enum { + CRIERR_LEVEL_ERROR = 0, + CRIERR_LEVEL_WARNING = 1, + /* enum be 4bytes */ + CRIERR_LEVEL_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriErrorLevel; + +/**************************************************************************** + * PROCESS MACRO * + ****************************************************************************/ + +#if defined(CRIERROR_SIMPLIFY) + /* エラーの通知 */ + /* Notification of Error */ + #define criErr_NotifyError(id, msg) criErr_NotifyErrorSimple() + #define criErr_NotifyError1(id, msg, p1) criErr_NotifyErrorSimple() + #define criErr_NotifyError2(id, msg, p1, p2) criErr_NotifyErrorSimple() + #define criErr_NotifyErrorPrmArray(id, msg, p1, p2, pa) criErr_NotifyErrorSimple() + #define criErr_NotifyErrorGeneric(_error_id, _error_no) criErr_NotifyErrorSimple() + /* 警告の通知 */ + /* Notification of Warning */ + #define criErr_NotifyWarning(id, msg) criErr_NotifyWarningSimple() + #define criErr_NotifyWarning1(id, msg, p1) criErr_NotifyWarningSimple() + #define criErr_NotifyWarning2(id, msg, p1, p2) criErr_NotifyWarningSimple() + #define criErr_NotifyWarningPrmArray(id, msg, p1, p2, pa) criErr_NotifyWarningSimple() + #define criErr_NotifyWarningGeneric(_error_id, _error_no) criErr_NotifyWarningSimple() +#else + /* エラーの通知 */ + /* Notification of Error */ + #define criErr_NotifyError(id, msg) criErr_Notify(CRIERR_LEVEL_ERROR, id ":" msg) + #define criErr_NotifyError1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1)) + #define criErr_NotifyError2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) + #define criErr_NotifyErrorPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr *)(pa)) + #define criErr_NotifyErrorGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, _error_id, _error_no) + /* 警告の通知 */ + /* Notification of Warning */ + #define criErr_NotifyWarning(id, msg) criErr_Notify(CRIERR_LEVEL_WARNING, id ":" msg) + #define criErr_NotifyWarning1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1)) + #define criErr_NotifyWarning2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) + #define criErr_NotifyWarningPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr *)(pa)) + #define criErr_NotifyWarningGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_WARNING, _error_id, _error_no) +#endif + +/**************************************************************************** + * Data type declaration * + ****************************************************************************/ + +/* Error Callback Function type */ +typedef void (CRIAPI *CriErrCbFunc)(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + +/**************************************************************************** + * 変数の宣言 * + * Variable Declaration * + ****************************************************************************/ +/* エラー出力省略用変数 */ +/* default argument of CriError */ +#ifdef __cplusplus +namespace criErr { + extern CriError ErrorContainer; +} +#endif /* __cplusplus */ + +/**************************************************************************** + * 関数の宣言 * + * Function Declaration * + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*JP + * \brief エラーID文字列からエラーメッセージへ変換 + * \ingroup CRI_ERROR + * \param[in] errid エラーID文字列 + * \return エラーメッセージ + * \par 説明: + * エラーID文字列から詳細なエラーメッセージへ変換します。
+ * \attention + * この関数は旧仕様の関数です。
+ * 代わりに ::criErr_ConvertIdToMessage 関数を使用してください。 + * \sa criErr_ConvertIdToMessage + */ +/*EN + * \brief Convert error ID to error message + * \ingroup CRI_ERROR + * \param[in] errid error ID + * \return error message + * \par Explanation: + * This function converts error ID to detailed error message.
+ * \attention + * This function is an obsolete one.
+ * Please use the ::criErr_ConvertIdToMessage function instead. + * \sa criErr_ConvertIdToMessage + */ +const CriChar8* CRIAPI criErr_ConvertIdToMsg(const CriChar8 *errid); + +/*JP + * \brief エラーID文字列からエラーメッセージへ変換 + * \ingroup CRI_ERROR + * \param[in] errid エラーID文字列 + * \param[in] p1 補足情報1 + * \param[in] p2 補足情報2 + * \return エラーメッセージ + * \par 説明: + * エラーID文字列から詳細なエラーメッセージへ変換します。
+ * \par 用例: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * \endcode + */ +/*EN + * \brief Convert error ID to error message + * \ingroup CRI_ERROR + * \param[in] errid error ID + * \param[in] p1 supplementary information 1 + * \param[in] p2 supplementary information 2 + * \return error message + * \par Explanation: + * This function converts error ID to detailed error message.
+ * \par Example: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * \endcode + */ +const CriChar8* CRIAPI criErr_ConvertIdToMessage(const CriChar8 *errid, CriUint32 p1, CriUint32 p2); + +/*JP + * \brief エラーコールバック関数の登録 + * \ingroup CRI_ERROR + * \param[in] cbf エラーコールバック関数 + * \return なし + * \par 説明: + * エラーコールバック関数を登録します。
+ * 登録された関数は、CRIミドルウエアライブラリ内でエラーが発生したときに呼び出されます。
+ * 同時に登録できるエラーコールバック関数は1つです。
+ * 登録後に再度本関数を呼び出した場合は現在の登録を上書きします。 + * \par 用例: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * + * void main(int ac, char *av[]) + * { + * : + * // エラーコールバックの登録 + * criErr_SetCallback(user_error_callback_func); + * : + * } + * \endcode + */ +/*EN + * \brief Register error callback function + * \ingroup CRI_ERROR + * \param[in] cbf error callback function + * \return NONE + * \par Explanation: + * This function registers an error callback function.
+ * The registered function is called if an error occurs within the CRI middleware library. + * \par Example: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * + * void main(int ac, char *av[]) + * { + * : + * // Registers the error callback function + * criErr_SetCallback(user_error_callback_func); + * : + * } + * \endcode + */ +void CRIAPI criErr_SetCallback(CriErrCbFunc cbf); + +/*JP + * \brief エラー通知レベルの変更 + * \ingroup CRI_ERROR + * \param[in] level エラー通知レベル + * \return なし + * \par 説明: + * エラーコールバックに通知するエラーのレベルを変更します。 + */ +/*EN + * \brief Change error notification level + * \ingroup CRI_ERROR + * \param[in] level error notification level + * \return NONE + * \par Explanation: + * This function changes the level of error information that is notified to the error callback. + */ +void CRIAPI criErr_SetErrorNotificationLevel(CriErrorNotificationLevel level); + +/*JP + * \brief エラー発生回数の取得 + * \ingroup CRI_ERROR + * \param[in] level エラーレベル + * \return エラー発生回数 + * \par 説明: + * エラー発生回数を取得します。 + */ +/*EN + * \brief Retrieve error count + * \ingroup CRI_ERROR + * \param[in] level error level + * \return number of errors occured + * \par Explanation: + * This function retrieves the number of errors occured. + */ +CriUint32 CRIAPI criErr_GetErrorCount(CriErrorLevel level); + +/*JP + * \brief エラー発生回数のリセット + * \ingroup CRI_ERROR + * \param[in] level エラーレベル + * \return なし + * \par 説明: + * エラー発生回数のカウンタを0に戻します。 + */ +/*EN + * \brief Resets error count + * \ingroup CRI_ERROR + * \param[in] level error level + * \return NONE + * \par Explanation: + * This function resets the counter for number of errors occured. + */ +void CRIAPI criErr_ResetErrorCount(CriErrorLevel level); + +/* エラーコールバックを発生させる (内部関数) */ +/* Error notification (Internal functions) */ +void CRIAPI criErr_Notify(CriErrorLevel level, const CriChar8 *errid); +void CRIAPI criErr_Notify1(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1); +void CRIAPI criErr_Notify2(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1, CriUintPtr p2); +void CRIAPI criErr_NotifyPrmArray(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1, CriUintPtr p2, CriUintPtr *pa); +void CRIAPI criErr_NotifyGeneric(CriErrorLevel level, const CriChar8 *error_id, CriError error_no); +void CRIAPI criErr_NotifyErrorSimple(void); +void CRIAPI criErr_NotifyWarningSimple(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/*************************************************************************** + * 旧バージョンとの互換用 + * For compatibility with old versions + ***************************************************************************/ +#define criErr_Invoke(errid) criErr_Notify(CRIERR_LEVEL_ERROR, errid) +#define criErr_Invoke1(errid, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, errid, p1) +#define criErr_Invoke2(errid, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, errid, p1, p2) +#define criErr_InvokePrmArray(errid, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, errid, p1, p2, pa) +#define criErr_InvokeGeneric(error_id, error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, error_id, error_no) +#define criErr_Occur(id, msg) criErr_Notify(CRIERR_LEVEL_ERROR, id ":" msg) +#define criErr_Occur1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1)) +#define criErr_Occur2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) +#define criErr_OccurPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr*)(pa)) +#define criErr_OccurGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, _error_id, _error_no) + +/*EN + * @} + */ +/*JP + * @} + */ + +#endif // _CRI_ERROR_H_INCLUDED + +/* --- end of file --- */ diff --git a/3rdParty/cri/Durango/include/cri_heap.h b/3rdParty/cri/Durango/include/cri_heap.h new file mode 100644 index 00000000..49e85012 --- /dev/null +++ b/3rdParty/cri/Durango/include/cri_heap.h @@ -0,0 +1,640 @@ +#ifndef _CRI_HEAP_H_INCLUDED +#define _CRI_HEAP_H_INCLUDED +/**************************************************************************** + * * + * CRI Heap Manager "CriHeap" Library * + * * + * 2005-03-17 written by satouo * + * * + ****************************************************************************/ +/*! + * \file cri_heap.h + */ + +/**************************************************************************** + * インクルードファイル * + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" + +#ifdef XPT_TGT_PC +#pragma pack(push) +#pragma pack(1) //The boundary value of structure is adjusted to 1 byte. +#endif + +/**************************************************************************** + * 定数マクロ * + * MACRO CONSTANT * + ****************************************************************************/ +/* Version number of CRIHEAP */ +#define CRIHEAP_NAME_STRINGS "CRI Heap" +#define CRIHEAP_VERSION_STRINGS "1.21.02" + +/* Default memory alignment */ +#define CRIHEAP_DEFAULT_MEM_ALIGN (8) + +/**************************************************************************** + * 列挙定数マクロ * + * ENUM CONSTANT * + ****************************************************************************/ +/*JP + * \brief メモリのタイプ + */ +/*EN + * \brief Types of heap + */ +typedef enum { + CRIHEAP_TYPE_FIX = (1), + CRIHEAP_TYPE_TEMPORARY = (2), + CRIHEAP_TYPE_DYNAMIC = (3), // unuse + CRIHEAP_TYPE_NONE = (0), + /* enum be 4bytes */ + CRIHEAP_TYPE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriHeapType; + +/**************************************************************************** + * データ型 * + * Data type declaration * + ****************************************************************************/ +/* CriHeapハンドル */ +/* CriHeap handle */ +#ifndef CRIHEAP_DEFINED +#define CRIHEAP_DEFINED + +/* internal */ +typedef struct CriHeapBlockTag { + struct CriHeapBlockTag *prevblock; + struct CriHeapBlockTag *nextblock; + CriSint32 memsize; + CriUint8 used; + CriUint8 type; + CriUint16 alignspc; + CriUint16 gap; + CriChar8 *nameadr; +} CriHeapBlock, *CriHeapBlockPtr; + +/*JP + * \brief CRI Heapハンドル + * \struct CriHeap + * \ingroup CRIHEAP_BASIC + * CRI Heapを用いてメモリアロケートを行うために必要なハンドルです。
+ * このハンドルに対して、メモリアロケートやメモリフリーを行います。 + * \sa criHeap_Create(), criHeap_Destroy() + */ +/*EN + * \brief CRI Heap handle + * \struct CriHeap + * \ingroup CRIHEAP_BASIC + * \par Description: + * The heap handle. This data structure needs to exist through the life cycle of + * the heap. It allows the library to allocate and deallocate memory + * internally within the heap. Typically this handle gets allocated at the + * beginning of the heap memory that you've provided for the heap, but don't + * depend on this behavior. The heap itself is opaque. You can of course + * allocate multiple non-contiguous heaps, but these will be separate heap + * structures and a single allocation won't choose between them. + * + * \sa criHeap_Create(), criHeap_Destroy() + */ +typedef struct _criheap_struct { + struct _criheap_vfunctiontable *vtbl; + CriSint32 totalsize; + CriSint32 peaksize; + CriSint32 currentsize; + CriHeapBlock *topblock; + CriHeapBlock *taleblock; +} CriHeapObj, *CriHeap; + +/*JP + * \brief CRI Heap仮想関数テーブル + * \struct criHeapVirtualFunctionTable + * \ingroup CRIHEAP_BASIC + * 独自のメモリアロケート関数を実装する際に使用する仮想関数テーブル構造体です。
+ * 各関数はマルチスレッドセーフである必要があります。
+ * \par 備考: + * 3番目のアロケート関数は現在未使用です。 + */ +/*EN + * \brief CRI Heap Virtual Function Table + * \struct criHeapVirtualFunctionTable + * \ingroup CRIHEAP_BASIC + * \par Description: + * The virtual functions table for original allocation functions.
+ * The third allocation function is not in use currently. + */ +typedef struct _criheap_vfunctiontable { + /*JP + * \brief メモリのアロケート(メモリ領域の先端から) + * \par 説明: + * criHeap_AllocFix関数呼び出し時に呼ばれます。 + * \sa criHeap_AllocFix() + */ + /*EN + * \brief Memory allocation (allocating from the top of the memory area) + * \par Description: + * Called from criHeap_AllocFix(). + * \sa criHeap_AllocFix() + */ + void *(*AllocFix)(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + /*JP + * \brief メモリのアロケート(メモリ領域の終端から) + * \par 説明: + * criHeap_AllocFix関数呼び出し時に呼ばれます。 + * \sa criHeap_AllocTemporary() + */ + /*EN + * \brief Memory allocation (allocating from the tail of the memory area) + * \par Description: + * Called from criHeap_AllocTemporary(). + * \sa criHeap_AllocTemporary() + */ + void *(*AllocTemporary)(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + /*JP + * \brief 未使用関数 + */ + /*EN + * \brief Unused + */ + void *(*AllocDynamic)(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); // unused + + /*JP + * \brief メモリのフリー + * \par 説明: + * criHeap_Free関数呼び出し時に呼ばれます。 + * \sa criHeap_Free() + */ + /*EN + * \brief Memory deallocation + * \par Description: + * Called from criHeap_Free(). + * \sa criHeap_Free() + */ + CriSint32 (*Free)(CriHeap heap, void *ptr); +} criHeapVirtualFunctionTable; + +#endif + + +/**************************************************************************** + * 関数の宣言 + * Function Declaration + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*==========================================================================* + * ライブラリの初期化と終了処理 + * Initialize and Finalize of Library + *==========================================================================*/ +/*JP + * \brief CRI Heapライブラリの初期化 + * \ingroup CRIHEAP_BASIC + * \par 説明: + * CRI Heapライブラリを使用するために必要な初期化関数です。
+ * CRI Heapを使用する際はあらかじめ本関数をコールする必要があります。 + * \sa criHeap_Finalize() + */ +/*EN + * \brief Initialize the heap manager. + * \ingroup CRIHEAP_BASIC + * \par Description: + * This function initializes the heap manager and prepares it to manage heaps. + * This function only has an effect the first time it is called in your program. + * Subsequent calls only increment an internal counter. This allows your + * program to call criHeap_Initialize() in pairs with criHeap_Finalize() + * throughout your program modules, and only the initial call to criHeap_Initialize() + * and the final call to criHeap_Finalize() will have any effect. + * \if ps2 + * \par PS2 only: + * This function does a sanity check to make sure that the size of the CriHeapObj + * data structure is a factor of 16. If it is not a factor of 16, this function + * hangs. + * \endif + * \sa criHeap_Finalize() + */ +void CRIAPI criHeap_Initialize(void); + +/*JP + * \brief CRI Heapライブラリの終了 + * \ingroup CRIHEAP_BASIC + * \par 説明: + * CRI Heapライブラリを終了するために必要な終了関数です。
+ * CRI Heapの使用を終了する際は本関数をコールしてください。 + * \sa criHeap_Initialize() + */ +/*EN + * \brief Finalize the heap manager. + * \ingroup CRIHEAP_BASIC + * \par Description: + * This function finalizes the heap manager. If the criHeap_Initialize() function + * is called n times, then the nth time that criHeap_Finalize() + * is called, this function invalidates any heaps currently in use. Calling + * any heap function after the nth call to criHeap_Finalize() will + * have unpredictable results. + * \sa criHeap_Initialize() + */ +void CRIAPI criHeap_Finalize(void); + +/*==========================================================================* + * ハンドルの生成・解放 + *==========================================================================*/ +/*JP + * \brief CRI Heapハンドルの生成 + * \ingroup CRIHEAP_BASIC + * \param ptr メモリ領域のポインタ。 + * \param size メモリ領域のサイズ。 + * \return CRI Heapハンドル。
生成に失敗した場合は、NULLが返ります。 + * \par 説明: + * CRI Heapハンドルを生成します。
+ * 本関数で与えるメモリ領域は、CRI Heap自身のハンドル領域やアロケート時に + * 確保されるメモリ領域となります。
+ * 管理領域を含むため、メモリ領域すべてがアロケート出来ない点に注意してください。 + * 管理領域の目安は「1ハンドルあたりsizeof(CriHeapObj)」+「1アロケートあたり + * sizeof(CriHeapBlock)+各メモリアライメントに必要なサイズ」となります。 + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * \endcode + * \sa criHeap_Destroy() + */ +/*EN + * \brief Create a contiguous heap in memory. + * \ingroup CRIHEAP_BASIC + * \param ptr A pointer to the start of the memory region to use as a heap. + * \param size The size of the region to be used as a heap. + * \return A valid CriHeap handle if successful, or NULL if unsuccessful. + * \par Description: + * This function allows you to set aside a region of memory for this library's + * use as a "heap". Heap allocation is required before active playback + * can begin. + * This function will fail and return NULL if the size of the memory region + * is smaller than the CriHeapObj structure. + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * \endcode + * \sa criHeap_Destroy() + */ +CriHeap CRIAPI criHeap_Create(void *ptr, CriSint32 size); + +/*JP + * \brief 非スレッドセーフなCRI Heapハンドルの生成 + * \ingroup CRIHEAP_BASIC + * \param ptr メモリ領域のポインタ。 + * \param size メモリ領域のサイズ。 + * \return CRI Heapハンドル。
生成に失敗した場合は、NULLが返ります。 + * \par 説明: + * CRI Heapハンドルを生成します。
+ * 本関数を使用して作成されたヒープは、排他制御が行なわれません。
+ * 複数スレッドから同時に参照されるヒープの作成には、criHeap_Create関数をご利用ください。 + * \sa criHeap_Create(), criHeap_Destroy() + */ +/*EN + * \brief Create a contiguous heap in memory. + * \ingroup CRIHEAP_BASIC + * \param ptr A pointer to the start of the memory region to use as a heap. + * \param size The size of the region to be used as a heap. + * \return A valid CriHeap handle if successful, or NULL if unsuccessful. + * \par Description: + * This function creates a heap to use the static memory as dynamically allocatable memory. + * The heap created by using this function is not threadsafe. + * If heap will be accessed by multiple threads, you must create the heap by using the criHeap_Create function. + * \sa criHeap_Create(), criHeap_Destroy() + */ +CriHeap CRIAPI criHeap_CreateNoSerialize(void *ptr, CriSint32 size); + +/*JP + * \brief CRI Heapハンドルの解放 + * \ingroup CRIHEAP_BASIC + * \param heap CRI Heapハンドル。 + * \par 説明: + * CRI Heapハンドルを解放します。
criHeap_Create() で指定されたメモリ領域が + * 解放され、CRI Heapハンドルは無効となります。 + * \sa criHeap_Create() + */ +/*EN + * \brief Destroy a previously created heap. + * \ingroup CRIHEAP_BASIC + * \param heap A CriHeap handle previously created with criHeap_Create(). + * \par Description: + * This function frees all internal allocations previously performed on + * the heap and frees the memory. Internally, this function does in + * fact walk through the heap, finding and freeing all allocations, e.g. + * it is not stubbed. So calling this function on a trashed heap + * will have unpredictable results. + * \sa criHeap_Create() + */ +void CRIAPI criHeap_Destroy(CriHeap heap); + +/*==========================================================================* + * Allocation + *==========================================================================*/ +/*JP + * \brief メモリのアロケート(メモリ領域の先端から) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heapハンドル。 + * \param size アロケートするメモリのサイズ。 + * \param name アロケートするメモリの名前。名前はデバッグ時に使用されます。 + * \param align アロケートするメモリのアライメント。 + * \return アロケートしたメモリへのポインタ。
アロケートに失敗した場合はNULLが返ります。 + * \par 説明: + * メモリ領域の先端側から確保するメモリアロケーション関数です。ヒープ領域内に\ref block_fix "Fixブロック"を作成します。
+ * メモリの断片化を防ぐため、同じサイズ/アライメントの解放済み\ref block_fix "Fixブロック"を先端側から探して、再利用するように試みます。それが見つからない場合は、未使用の空き領域(\ref block_free "Freeブロック")を分割してメモリを取得します。 + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * \endcode + * \sa criHeap_AllocTemporary(), criHeap_Free() + */ +/*EN + * \brief Memory allocation (allocating from the top of the memory area) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heap handle + * \param size Memory block size to be allocated + * \param name Memory block name, which is used on debugging + * \param align Memory block alignment + * \return A pointer to the allocated memory block.
Returns NULL if unsuccessful. + * \par Description: + * This function allocates a memory block from the top of the memory area and creates a \ref block_fix "Fix block" in the heap area.
+ * To prevent memory fragmentation, a released \ref block_fix "Fix block" with the same size and alignment is searched for in the heap area from the top to the bottom and tries to reused the block. And if not found, an unused free block (\ref block_free "Free block") is divided and a new block is allocated. + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * \endcode + * \sa criHeap_AllocTemporary(), criHeap_Free() + */ +void * CRIAPI criHeap_AllocFix(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + +/*JP + * \brief メモリのアロケート(メモリ領域の終端から) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heapハンドル。 + * \param size アロケートするメモリのサイズ。 + * \param name アロケートするメモリの名前。名前はデバッグ時に使用されます。 + * \param align アロケートするメモリのアライメント。 + * \return アロケートしたメモリへのポインタ。
アロケートに失敗した場合はNULLが返ります。 + * \par 説明: + * メモリ領域の終端側から確保するメモリアロケーション関数です。ヒープ領域内に\ref block_temporary "Temporaryブロック"を作成します。
+ * 要求したサイズ/アライメントをアロケート可能な解放済み\ref block_temporary "Temporaryブロック"を終端側から探して、分割または再利用するように試みます。それが見つからない場合は、未使用の空き領域(\ref block_free "Freeブロック")を分割してメモリを取得します。
+ * ヒープ領域の終端側からメモリをアロケートするため、先端側での断片化を防ぐことが出来ます。
+ * 主に、一時的に利用するメモリに使用します。 + * \sa criHeap_AllocFix(), criHeap_Free() + */ +/*EN + * \brief Memory allocation (allocating from the tail of the memory area) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heap handle + * \param size Memory block size to be allocated + * \param name Memory block name, which is used on debugging + * \param align Memory block alignment + * \return A pointer to the allocated memory block.
Returns NULL if unsuccessful. + * \par Description: + * This function allocates a memory block from the bottom of the memory area and creates a \ref block_temporary "Temporary block" in the heap area.
+ * A released \ref block_temporary "Temporary block" available with the requested size and alignment is searched for in the heap area from the bottom and tries to divide and to reuse the block. And if not found, an unused free block (\ref block_free "Free block") is divided and a new block is allocated.
+ * Allocating from the bottom of the heap area will prevent fragmentation in the top of the heap area.
+ * Temporary block is mainly used for the memory area that is temporarily used. + * \sa criHeap_AllocFix(), criHeap_Free() + */ +void * CRIAPI criHeap_AllocTemporary(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + +/* DYNAMIC (unuse) */ +//void * CRIAPI criHeap_AllocDynamic(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + +void * CRIAPI criHeap_Alloc(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align, CriSint32 type); + +/*==========================================================================* + * Free + *==========================================================================*/ +/*JP + * \brief メモリのフリー + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heapハンドル。 + * \param ptr アロケートしたメモリのポインタ。 + * \return フリーされたメモリサイズ。 + * \par 説明: + * アロケートされたメモリをフリーします。
+ * \code + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * criHeap_Free(heap, memptr); + * \endcode + * \sa criHeap_AllocFix(), criHeap_AllocTemporary() + */ +/*EN + * \brief Memory deallocation + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heap handle + * \param ptr The pointer to the allocated memory block + * \return Deallocated memory block size + * \par Description: + * This function deallocates the allocated memory block.
+ * \code + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * criHeap_Free(heap, memptr); + * \endcode + * \sa criHeap_AllocFix(), criHeap_AllocTemporary() + */ +CriSint32 CRIAPI criHeap_Free(CriHeap heap, void *ptr); + +/*==========================================================================* + * 排他制御用関数 + *==========================================================================*/ +CriSint32 CRIAPI criHeap_EnterCriticalSection(void); +CriSint32 CRIAPI criHeap_LeaveCriticalSection(void); + +/*==========================================================================* + * その他の関数 + *==========================================================================*/ +/* For only internal use */ +CriSint32 CRIAPI criHeap_SwitchAllocFunctions(CriHeap heap); + +/*==========================================================================* + * デバッグ関連 + *==========================================================================*/ +/*JP + * \brief ピークメモリサイズの取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \return 使用されたメモリの最大値。 + * \par 説明: + * 過去、使用されたメモリ量の最大値を返します。
+ * 最大値はcriHeap_DebugResetPeakMemorySize() でリセットすることが出来ます。 + * \sa criHeap_DebugResetPeakMemorySize() + */ +/*EN + * \brief Returns peak memory usage of the heap. + * \ingroup CRIHEAP_DEBUG + * \param heap The heap previously allocated by criHeap_Create(). + * \return The maximum number of bytes used by the heap. + * \par Description: + * The amount of memory used by these libraries is variable and depends + * on the number of simultaneous streams being read, the seek and error + * frequency within the stream being read, video resolution and other + * factors. This function allows you to tune the allocation of the heap + * to achieve a required performance level while allocating minimal + * heap space for this library. To get accurate readings, this function + * should typically be called just before criHeap_Destroy(), and after + * exercising all the video and audio functions in your program. + */ +CriSint32 CRIAPI criHeap_DebugGetPeakMemorySize(CriHeap heap); + +/*JP + * \brief ピークメモリサイズのリセット + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \par 説明: + * ピークメモリサイズをリセットします。 + * \sa criHeap_DebugGetPeakMemorySize() + */ +/*EN + * \brief Reset peak memory size + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap handle + * \par Description: + * The peak memory size is reset. + * \sa criHeap_DebugGetPeakMemorySize() + */ +void CRIAPI criHeap_DebugResetPeakMemorySize(CriHeap heap); + +/*JP + * \brief メモリブロック数の取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \return メモリブロック数。 + * \par 説明: + * アロケートされたメモリのブロック数を返します。
+ * CRI Heapハンドル生成直後は未使用のメモリブロックが1つ存在する状態 + * となります。また、フリーされた断片化されたメモリブロックもこの数に + * 含みます。 + * \sa criHeap_DebugGetUsedBlocks() + */ +/*EN + * \brief Get number of allocated memory blocks + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap handle + * \return Number of allocated memory blocks + * \par Description: + * The number of allocated memory blocks is returned.
+ * One unused memory block exists right after CRI Heap handle creation. + * The number of released fragmented memory blocks is also included. + * \sa criHeap_DebugGetUsedBlocks() + */ + CriSint32 CRIAPI criHeap_DebugGetNumBlocks(CriHeap heap); + +/*JP + * \brief 使用メモリブロック数の取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \return 使用メモリブロック数。 + * \par 説明: + * アロケートされているメモリブロックの数を返します。 + * \sa criHeap_DebugGetNumBlocks() + */ +/*EN + * \brief Get number of used memory blocks + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \return Number of used memory blocks + * \par Description: + * The number of used memory blocks is returned.
+ * \sa criHeap_DebugGetNumBlocks() + */ +CriSint32 CRIAPI criHeap_DebugGetUsedBlocks(CriHeap heap); + +/*JP + * \brief メモリブロック名の取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \param ptr アロケートしたメモリのポインタ。 + * \return メモリブロック名。 + * \par 説明: + * アロケート時に設定したメモリブロック名へのポインタを返します。
+ */ +/*EN + * \brief Get memory block name + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \param ptr A pointer to the allocated memory block + * \return Memory block name + * \par Description: + * The pointer to the memory block name specified on allocation is returned.
+ */ +CriChar8 * CRIAPI criHeap_DebugGetBlockName(CriHeap heap, void *ptr); + +/* メモリブロック番号の取得 */ +//CriSint32 CRIAPI criHeap_DebugGetBlockNumberFromPointer(CriHeap heap, void *ptr); + +/* メモリブロック情報の取得 */ +//void CRIAPI criHeap_DebugGetBlockInformation(CriHeap heap, +// CriSint32 blocknumber, CriHeapBlock *heapblock); + +/* メモリブロック情報の表示 */ +//void CRIAPI criHeap_DebugPrintBlockInformation(CriHeap heap, +// CriSint32 blocknumber, CriHeapBlock *heapblock); + +/*JP + * \brief メモリブロック情報の表示 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \par 説明: + * 現在のメモリブロック情報を表示します。
+ * printf関数などの標準出力に表示を行います。 + */ +/*EN + * \brief Print memory block information + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \par Description: + * The current memory block information is displayed.
+ * It is displayed on the standard output for the printf function. + */ + void CRIAPI criHeap_DebugPrintBlockInformationAll(CriHeap heap); + +/*JP + * \brief メモリアロケートサイズの取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \par 説明: + * 現在のメモリアロケートサイズの合計値を返します。 + */ +/*EN + * \brief Get total allocation size + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \par Description: + * The total size of allocated memory blocks is returned. + */ +CriSint32 CRIAPI criHeap_DebugGetTotalAllocSize(CriHeap heap); + +/* フリーサイズの取得 */ +//CriSint32 CRIAPI criHeap_DebugGetTotalFreeSize(CriHeap heap); + +/* メモリアロケートサイズの取得(タイプ別) */ +CriSint32 CRIAPI criHeap_DebugGetAllocSize(CriHeap heap, CriSint32 type); + +/* ヒープヘッダサイズの取得 */ +CriSint64 CRIAPI criHeap_DebugGetHandleHeaderSize(CriHeap heap); + +/* メモリブロックヘッダサイズの取得 ptr: Allocated Pointer */ +CriSint64 CRIAPI criHeap_DebugGetMemBlockHeaderSize(void *ptr); + +/* 追加で必要となるサイズの最大値 */ +CriSint32 CRIAPI criHeap_DebugGetWorstExtraSize(CriSint32 alignment); + +/* criHeap_AllocFixでアロケート可能なサイズ */ +CriSint32 CRIAPI criHeap_DebugGetFixAllocatableSize(CriHeap heap, CriSint32 alignment); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#ifdef XPT_TGT_PC +#pragma pack(pop) +#endif + +#endif // _CRI_HEAP_H_INCLUDED + +/* end of file */ diff --git a/3rdParty/cri/Durango/include/cri_movie_core.h b/3rdParty/cri/Durango/include/cri_movie_core.h new file mode 100644 index 00000000..d695a4df --- /dev/null +++ b/3rdParty/cri/Durango/include/cri_movie_core.h @@ -0,0 +1,2572 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2005-2013 CRI Middleware Co., Ltd. + * + * Library : CRI Movie + * Module : Library User's Header + * File : cri_movie_core.h + * Date : 2013-09-27 + * Version : (see CRIMVPLY_VER) + * + ****************************************************************************/ +/*! + * \file cri_movie_core.h + */ +#ifndef CRI_MOVIE_CORE_H_INCLUDED /* Re-definition prevention */ +#define CRI_MOVIE_CORE_H_INCLUDED + +/* Version No. */ +#define CRIMVPLY_VER "3.40" +#define CRIMVPLY_NAME "criMvPly" + +/*************************************************************************** + * Include file + ***************************************************************************/ +#include +#include +#include + +/*************************************************************************** + * MACRO CONSTANT + ***************************************************************************/ + +/*EN + * \brief Audio OFF setting of Audio Track + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +/*JP + * \brief オーディオ再生OFFの指定値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +#define CRIMV_AUDIO_TRACK_OFF (-1) + +/*EN + * \brief Default setting of Audio Track + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +/*JP + * \brief オーディオチャネルのデフォルト値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +#define CRIMV_AUDIO_TRACK_AUTO (100) + +/*EN + * \brief Maximum number of PCM tracks in one audio stream + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief オーディオデータ内の最大PCMトラック数 + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_PCM_BUFFER_MAX (8) + +/*EN + * \brief Subtitle OFF setting + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ +/*JP + * \brief 字幕再生OFFの指定値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ +#define CRIMV_SUBTITLE_CHANNEL_OFF (-1) + +/*EN + * \brief Maximum number of video tracks in a movie file + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief ムービファイル内の最大ビデオストリーム数 + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_MAX_VIDEO_NUM (1) + +/*EN + * \brief Maximum number of audio tracks in a movie file + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief ムービファイル内の最大オーディオストリーム数 + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_MAX_AUDIO_NUM (32) + +/*EN + * \brief Maximum number of alpha tracks in a movie file + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief ムービファイル内の最大アルファストリーム数 + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_MAX_ALPHA_NUM (1) + +#if defined(XPT_TGT_PC) +/*EN + * \brief Number of extra threads for multicore decoding + * \ingroup MDL_MV_OPTION + * The number of additional decoding threads that CRI Movie library internally creates. + * The threads are intended to run on multiple processors in parallel. + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +/*JP + * \brief マルチコアデコード用の追加のデコードスレッド数 + * \ingroup MDL_MV_OPTION + * CRI Movieライブラリが内部で作成する追加のデコードの数です。これらのスレッドは、マルチコアPC上で + * デコード処理を並列分散させるために作られます。 + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +#define CRIMV_NUM_EXT_DECTHREAD_PC (3) + +/*EN + * \brief Default affnity mask of a thread + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +/*JP + * \brief スレッドアフィニティマスクのデフォルト設定値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +#define CRIMV_DEFAULT_AFFNITY_MASK_PC (0xFFFFFFFF) + + +/*EN + * \brief Default priority of a thread + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +/*JP + * \brief スレッドのデフォルト優先度 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +#define CRIMV_DEFAULT_THREAD_PRIORITY_PC (0x8000000) +#endif + +/*EN + * \brief Default value of the read buffer size + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetReadBufferSize() + */ +/*JP + * \brief リードバッファサイズをデフォルト値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetReadBufferSize() + */ +#define CRIMV_READ_BUFFER_SIZE_AUTO (-1) + + +/*************************************************************************** + * Library Spec Defenition + ***************************************************************************/ + +/* */ + +/* 2007-09-06:URUSHI オーディオ処理のサブモジュール化 * + * MvPlyのオーディオ処理部分をCriMvPlyAmngという新たなクラスに切り出す。* + * CriMvPlyAmngはデマルチプレクサから全トラックデータを受け取って、 * + * トラックごとに割り振られたAdecに処理を渡します。 * + * 目的は以下の二つ * + * 1) オーディオトラックの動的切替 * + * 2) ループ再生での異なるAV尺の同期 */ + +#define NUM_MAX_ADEC (2) /* Adecの最大数 */ +/* ADECのインデックス定義 */ +/* このindexを使ってCriMvPlyAmngからAdecをコントロールしてください。 */ +#define MAIN_ADEC_IDX (0) // メイントラック用 +#define SUB_ADEC_IDX (1) // ボイストラック用 + +/* オーディオの動的切替機能をサポートするか */ +//#define ENABLE_DYNAMIC_AUDIO_SWITCH + +#if defined(ENABLE_DYNAMIC_AUDIO_SWITCH) + #define CRIMVPLYAMNG_TRACK_OFF (512) // 切り替え先トラック番号のデフォルト値(切替OFF) + + /* トラックの動的切替のための状態定義 */ + typedef enum _crimvplyamng_track_state { + CRIMVPLYAMNG_TRACK_STATE_FIXED = (1), // デフォルト + CRIMVPLYAMNG_TRACK_STATE_PREP_SWITCHING, // ユーザが切替を命令し、切替の準備段階(時刻判定のための基準時間をセット) + CRIMVPLYAMNG_TRACK_STATE_SWITCHING // 切替元と先の時刻判定を行なって切替を行なう状態 + } CriMvPlyAmngTrackState; +#endif + +/* 連結再生時、2個目以降のヘッダを取得できるようにするため */ +#define CRIMVPLY_HEAD_CONTAINER_NUM (2) + +/* 再読み込み閾値のデフォルト値 */ +#define CRIMV_DEFAULT_RELOAD_THRESHOLD (0.8f) // 0.8[sec] + +/* 再生準備中の貯金フレーム数デフォルト値 */ +#define CRIMV_DEFAULT_NUM_FRAMES_FOR_PREP (-1) /* デフォルト:不使用 (フレームプール数を採用) */ + +/* CriMvPly内部でキープするデリゲートスレッド設定用の配列数 */ +#if defined(XPT_TGT_PC) + #define CRIMV_DLGTHREAD_NUM (64) +#elif defined(XPT_TGT_XBOX360) + #define CRIMV_DLGTHREAD_NUM (6 - 1) // 6 HW thread - ユーザアイドルスレッド +#elif defined(XPT_TGT_VITA) + #define CRIMV_DLGTHREAD_NUM (2) +#elif defined(XPT_TGT_WIIU) + #define CRIMV_DLGTHREAD_NUM (2) +#endif + +/* 内部ワーク領域の確保にCRI Heapを使用しない */ +#define CRIMV_REMOVE_CRIHEAP + +/* 機種固有フレーム情報数 */ +#define CRIMV_FRAME_DETAILS_NUM (2) + +/* CriVavfios で指定する外部ファイルのパスの上限 */ +#if defined(XPT_TGT_IOS) + #define CRIMVPLY_VAVFIOS_MAX_FILEPATH (256) +#endif + +/*************************************************************************** + * Process MACRO + ***************************************************************************/ +#define criMv_SetDefaultHandleConfig(p_config) \ +{\ + (p_config)->readbuffer_size = 0;\ +} + +/*************************************************************************** + * Enum declaration + ***************************************************************************/ +/*EN + * \brief Speaker index of CRI Movie PCM output + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief CRI Movie のPCM出力のスピーカー配置 + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_PCM_BUFFER_L = 0, /*EN< The LEFT channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の LEFT チャンネル */ + CRIMV_PCM_BUFFER_R = 1, /*EN< The RIGHT channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の RIGHT チャンネル */ + CRIMV_PCM_BUFFER_LS = 2, /*EN< The Surround LEFT channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の Surround LEFT チャンネル */ + CRIMV_PCM_BUFFER_RS = 3, /*EN< The Surround RIGHT channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の Surround RIGHT チャンネル */ + CRIMV_PCM_BUFFER_C = 4, /*EN< The CENTER channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の CENTER チャンネル */ + CRIMV_PCM_BUFFER_LFE = 5, /*EN< The LFE channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の LFE チャンネル */ + CRIMV_PCM_BUFFER_EXT1 = 6, /*EN< The EXT1(Rear Left) channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の EXT1(Rear Left) チャンネル */ + CRIMV_PCM_BUFFER_EXT2 = 7, /*EN< The EXT2(Rear Right) channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の EXT2(Rear Right) チャンネル */ + + /* Keep enum 4bytes */ + CRIMV_PCM_BUFFER_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvPcmBufferIndex; + + +/*EN + * \brief Composite mode of alpha movie + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief アルファムービの合成モード + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_COMPO_OPAQ = 0, /*EN< Opacity, no alpha value */ + /*JP< 不透明、アルファ情報なし */ + CRIMV_COMPO_ALPHFULL = 1, /*EN< Full alpha blending (8bits-alpha data) */ + /*JP< フルAlpha合成(アルファ用データが8ビット) */ + CRIMV_COMPO_ALPH3STEP = 2, /*EN< 3 Step Alpha */ + /*JP< 3値アルファ */ + CRIMV_COMPO_ALPH32BIT = 3, /*EN< Full alpha blending (32bits color + alpha data) */ + /*JP< フルAlpha、(カラーとアルファデータで32ビット) */ + CRIMV_COMPO_ALPH1BIT = 4, /*EN< Alpha blending (24bits color + 1->8bits alpha) */ + /*JP< フルAlpha、(カラーとアルファデータで32bit、値は2値) */ + CRIMV_COMPO_ALPH2BIT = 5, /*EN< Alpha blending (24bits color + 2->8bits alpha) */ + /*JP< フルAlpha、(カラーとアルファデータで32bit、値は4値) */ + CRIMV_COMPO_ALPH3BIT = 6, /*EN< Alpha blending (24bits color + 3->8bits alpha) */ + /*JP< フルAlpha、(カラーとアルファデータで32bit、値は8値) */ + CRIMV_COMPO_ALPH4BIT = 7, /*EN< Alpha blending (24bits color + 4->8bits alpha) */ + /*JP< フルAlpha、(カラーとアルファデータで32bit、値は16値)*/ + + /* Keep enum 4bytes */ + CRIMV_COMPO_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvAlphaType; + + +/*EN + * \brief Result of the last video frame retrieval + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief 前回のビデオフレーム取得の結果 + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_LASTFRAME_OK = 0, /*EN< Succeeded */ + /*JP< 取得成功 */ + CRIMV_LASTFRAME_TIME_EARLY = 1, /*EN< Failed. The frame is not yet the time to draw */ + /*JP< 取得失敗。フレーム表示時刻が再生時間に達していなかった */ + CRIMV_LASTFRAME_DECODE_DELAY = 2, /*EN< Failed. The frame to draw is not decoded yet */ + /*JP< 取得失敗。ビデオフレームのデコードが間に合わなかった */ + CRIMV_LASTFRAME_DISCARDED = 3, /*EN< Failed. The video frame is discarded by app */ + /*JP< 取得失敗。アプリによって破棄された */ + //CRIMV_LASTFRAME_NO_INPUT_DATA = 4, //Not supported yet + //CRIMV_LASTFRAME_SKIPPED = 5, //Not supported yet + //CRIMV_LASTFRAME_DEMUX_STUCKED = 6, //Not supported yet + + /* Keep enum 4bytes */ + CRIMV_LASTFRAME_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvLastFrameResult; + +#if defined(XPT_TGT_PS3PPU) +/*EN + * \brief Graphic Environment type for PS3 + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief PS3のグラフィック環境 + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_GRAPHIC_ENV_GCM = 0, /*EN< GCM. (or same ARGB 32bit texture format of GCM) */ + /*JP< GCM環境 (またはテクスチャフォーマットがGCMと同じ環境) */ + CRIMV_GRAPHIC_ENV_PSGL = 1, /*EN< PSGL. (or same ARGB 32bit texture format of PSGL) */ + /*JP< PSGL環境 (またはテクスチャフォーマットがPSGLと同じ環境) */ + + /* Keep enum 4bytes */ + CRIMV_GRAPHIC_ENV_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvGraphicEnv; +#endif + + +/* CRI Movie Interanl handle status + * + * The possible legal states of a CriMvPly handle. Over the course of your application + * the CriMvPly handle will walk through the following states in roughly the following + * order. In states that are waiting states, you can request the + * CriMvPly handle to advance to the next state by calling the criMvPly_IncrementState() + * function. You can check the status of a valid CriMvPly handle at any time + * by calling criMvPly_GetStatus(). + * + * It is not possible to jump from a state to an arbitrary other state. Normal play + * proceeds from the CRIMVPLY_STATUS_STOP state through the CRIMV_PLY_STATUS_PLAYEND + * state in that order. Premature termination can be requested with the criMvPly_Stop() + * function. + * + * \sa criMvPly_IncrementState(), criMvPly_GetStatus(), criMvPly_Stop() + */ +typedef enum { + CRIMVPLY_STATUS_STOP = 0, /* Standstill. No processing is occurring. + * CriMvPly handles are created into this state. + */ + /* 停止中 */ + CRIMVPLY_STATUS_DECHDR = 1, /* The CriMvPly structure is now parsing the header + * of the file, including information on height and width + * of the video stream. + */ + /* ヘッダ解析中 */ + CRIMVPLY_STATUS_WAIT_PREP = 2, /* The header has been decoded and criMvPly_GetStreamingParameters() + * will now provide valid values. Typically you will call + * criMvPly_AllocateWorkBuffer() with this information at this point. + */ + /* PREP状態へのIncrementState待ち
+ AllocateWorkBufferしてから次へいくこと */ + CRIMVPLY_STATUS_PREP = 3, /* Transition to this state to acknowledge to the + * CriMvPly handle that you have allocated your work buffers. */ + /* 再生準備中 */ + CRIMVPLY_STATUS_WAIT_PLAYING = 4, /* The audio and video decoders are now ready to begin playback.*/ + /* PLAYING状態へのIncrementState待ち
+ この状態で既にビデオとオーディオのデコード結果は取得できる。*/ + CRIMVPLY_STATUS_PLAYING = 5, /* The decoders are currently decoding and playing output. */ + /* 再生中 */ + CRIMVPLY_STATUS_WAIT_PLAYEND = 6, /* The library is waiting for you to acknowledge the end of the movie. You + * have informed the CriMvPly structure that an end-of-file condition exists, + * but final frames of video and audio may still be pending in your application. */ + /* PLAYEND状態へのIncrementState待ち */ + CRIMVPLY_STATUS_PLAYEND = 7, /* You have acknowledged the end of the movie. Teardown can occur at this point. */ + /* 再生終了 */ + CRIMVPLY_STATUS_STOP_PROCESSING = 8, /* A request to stop has been received by the CriMvPly structure, + * that is, you have called criMvPly_Stop(), and a stop is now pending. */ + /* 停止処理中 */ + CRIMVPLY_STATUS_WAIT_STOP = 9, /* The CriMvPly handle has acknowledged the stop request and + * you may now call criMvPly_IncrementState() to transition to + * the CRIMVPLY_STATUS_STOP state. */ + /* STOP状態へのIncrementState待ち */ + CRIMVPLY_STATUS_ERROR = 10, /* An error has occurred. */ + /* エラー */ + + /* Keep enum 4bytes */ + CRIMVPLY_STATUS_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvPlyStatus; + + +/* Sofdec2 */ +typedef enum { + CRIMVPLY_META_FLAG_OFF = 0x0000, + CRIMVPLY_META_FLAG_CUE = 0x0001, + CRIMVPLY_META_FLAG_SEEK = 0x0002, + CRIMVPLY_META_FLAG_ALL = CRIMVPLY_META_FLAG_CUE + CRIMVPLY_META_FLAG_SEEK, + + /* Keep enum 4bytes */ + CRIMVPLY_META_FLAG_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvMetaFlag; + +/* Color Conversion*/ +typedef enum{ + CRIMV_COLORSPACE_CONVERSION_TYPE_ITU_R_BT601_LIMITED = 0, + CRIMV_COLORSPACE_CONVERSION_TYPE_ITU_R_BT601_FULLRANGE = 1, + + /* Keep enum 4bytes */ + CRIMV_COLORSPACE_CONVERSION_TYPE_ENUM_SINT32 = 0x7FFFFFFF +}CriMvColorSpaceConversionType; + +typedef void *(*CriMvMetaDataWorkMallocFunc)(void *obj, CriUint32 size); +typedef void (*CriMvMetaDataWorkFreeFunc)(void *obj, void *mem); + +/* OUTER_FRAMEPOOL_WORK */ +#define CriMvFramepoolWorkMallocFunc CriMvMetaDataWorkMallocFunc +#define CriMvFramepoolWorkFreeFunc CriMvMetaDataWorkFreeFunc + +/*************************************************************************** + * Data type declaration + ***************************************************************************/ + +/*EN + * \brief Audio parameters + * \ingroup MDL_MV_INFO + * + * \sa CriMvStreamingParameters, CriMvWaveInfo + */ +/*JP + * \brief オーディオパラメータ + * \ingroup MDL_MV_INFO + * + * オーディオストリームのパラメータ + * \sa CriMvStreamingParameters, CriMvWaveInfo + */ +typedef struct { + CriUint32 sampling_rate; /*EN< Sampling rate */ + /*JP< サンプリング周波数 */ + CriUint32 num_channel; /*EN< Number of channels. Monaural = 1, Stereo = 2 */ + /*JP< オーディオチャネル数 */ + CriUint32 total_samples; /*EN< Total number of samples */ + /*JP< 総サンプル数 */ + CriUint32 output_buffer_samples; /*EN< Output wave buffer size */ + /*JP< サウンド出力バッファのサンプル数 */ + CriUint32 codec_type; /*EN< Codec type */ + /*JP< コーデック種別 */ + +} CriMvAudioParameters; + +/*EN + * \brief Video Parameters + * \ingroup MDL_MV_INFO + * \sa CriMvStreamingParameters + */ +/*JP + * \brief ビデオパラメータ + * \ingroup MDL_MV_INFO + * ビデオストリームのパラメータ + * \sa CriMvStreamingParameters + */ +typedef struct { + CriUint32 max_width; /*EN< Maximum video width for stream. (multiple of 8) */ + /*JP< ムービ最大幅(8の倍数) */ + CriUint32 max_height; /*EN< Maximum video height for stream. (multiple of 8)*/ + /*JP< ムービ最大高さ(8の倍数) */ + CriUint32 disp_width; /*EN< Width of the image to draw. */ + /*JP< 表示したい映像の横ピクセル数(左端から) */ + CriUint32 disp_height; /*EN< Height of the image to draw. */ + /*JP< 表示したい映像の縦ピクセル数(上端から) */ + CriUint32 num_frame_pool; /*EN< Number of frame pools required for stream */ + /*JP< フレームプール数 */ + CriUint32 framerate; /*EN< Frame rate per second [x1000]. */ + /*JP< フレームレート[x1000] */ + CriUint32 framerate_n; /*EN< Frame rate (in rational as numerator). framerate_n/framerate_d = framerate */ /* UTODO: 変数名 */ + /*JP< フレームレートの分子(有理数形式)。framerate_n/framerate_d = framerate */ + CriUint32 framerate_d; /*EN< Frame rate (in rational as denominator). */ + /*JP< フレームレートの分母(有理数形式)。 */ + CriUint32 total_frames; /*EN< Total number of video frames */ + /*JP< 総フレーム数 */ + + CriUint32 material_width; /*EN< Width of the video source resolustion before encoding. */ + /*JP< エンコード前のビデオ素材の横ピクセル数 */ + CriUint32 material_height; /*EN< Height of the video source resolustion before encoding. */ + /*JP< エンコード前のビデオ素材の縦ピクセル数 */ + CriUint32 screen_width; /*EN< Screen width set by encoding and cropping. + * This parameter is only available when you encoded the movie with "Widescreen TV Support" option. + * Normally this value is 0. */ + /*JP< エンコード時に指定したスクリーン幅。 + * この値はエンコード時に「ワイドテレビ支援機能」を使用した場合のみ有効になります。 + * 通常は0です。 */ + + CriUint32 codec_type; /*EN< Video Codec Type. If you encoded the movie for PS2, this value is 2. + * Normally this value is 1 or 0(no info). + * If the codec_type is 1, the CRI Movie for ONLY PS2 can play the movie file. */ + /*JP< ビデオコーデック種別。PS2用にエンコードした場合 2になります。 + * 通常は 1または 0(情報無し)です。 + * コーデック種別が2のムービは、PS2版ライブラリで「のみ」再生可能です。 */ + CriUint32 codec_dc_option; /*EN< Video Codec DC Option. If you encoded the movie for PS2, this value is 10. + * Normally this value is 11 or 0(no info). + * If the codec_type is 11, the CRI Movie for PS2 can NOT play the movie file. */ + /*JP< ビデオコーデックのDCオプション種別。PS2用にエンコードした場合10になります。 + * 通常は11または 0(情報無し)です。 + * コーデックDCオプションが11のムービは、PS2版ライブラリ「では」再生できません。 */ + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< 色変換タイプ。 */ + CriSint32 capacity_of_picsize; /*EN< Capacity size of video pictures. */ + /*JP< ピクチャサイズ上限値 */ + CriUint32 average_bitrate; /*EN< Average bitrate. */ + /*JP< 平均ビットレート */ +} CriMvVideoParameters; + +/*EN + * \brief Alpha Parameters + * \ingroup MDL_MV_INFO + * \sa CriMvStreamingParameters + */ +/*JP + * \brief アルファパラメータ + * \ingroup MDL_MV_INFO + * アルファストリームのパラメータ + * \sa CriMvStreamingParameters + */ +typedef struct { + CriUint32 max_width; /*EN< Maximum alpha width for stream */ + /*JP< アルファフレームの最大幅 */ + CriUint32 max_height; /*EN< Maximum alpha height for stream */ + /*JP< アルファフレームの最大高さ */ + CriUint32 disp_width; /*EN< valid alpha width */ + /*JP< アルファフレームの実有効幅 */ + CriUint32 disp_height; /*EN< valid alpha height */ + /*JP< アルファフレームの実有効高さ */ + CriUint32 framerate; /*EN< Frame rate per second [x1000]. */ + /*JP< アルファのフレームレート[x1000] */ + CriUint32 framerate_n; /*EN< Frame rate (in rational as numerator). framerate_n/framerate_d = framerate */ /* UTODO: 変数名 */ + /*JP< フレームレートの分子(有理数形式)。framerate_n/framerate_d = framerate */ + CriUint32 framerate_d; /*EN< Frame rate (in rational as denominator). */ + /*JP< フレームレートの分母(有理数形式)。 */ + CriUint32 total_frames; /*EN< Total number of alpha frames */ + /*JP< 総フレーム数 */ + CriMvAlphaType alpha_type; /*EN< Alpha Composite Type. */ + /*JP< アルファ合成種別。 */ + CriUint32 codec_type; /*EN< Internal use only. Do not access this */ + /*JP< ライブラリ内部使用変数 */ + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< 色変換タイプ。 */ + CriSint32 capacity_of_picsize; /*EN< Capacity size of video pictures. */ + /*JP< ピクチャサイズ上限値 */ + CriUint32 average_bitrate; /*EN< Average bitrate. */ + /*JP< 平均ビットレート */ +} CriMvAlphaParameters; + + +/*EN + * \brief Streaming Parameters + * \ingroup MDL_MV_INFO + * This structure includes streaming parameters and playing parameters. + * \sa CriMvEasyPlayer::GetMovieInfo() + */ +/*JP + * \brief ストリーミング再生パラメータ + * \ingroup MDL_MV_INFO + * ストリーミング再生パラメータ。
+ * ストリーム自体の情報と、再生のために必要なパラメータの両方を含んでいる。 + * \sa CriMvEasyPlayer::GetMovieInfo() + */ +typedef struct { + /* Stream */ + CriUint32 is_playable; /*EN< Flag of the movie file is playable or not. 1 is playable. 0 is not playable.*/ + /*JP< 再生可能フラグ(1: 再生可能、0: 再生不可) */ + CriFloat32 buffering_time; /*EN< Amount of time to buffer in the stream, in seconds */ + /*JP< 読み込みデータのバッファリング時間。単位[sec]。 */ + CriUint32 max_bitrate; /*EN< Maximum bits per second for stream. This value includes video and audio both. */ + /*JP< 最大ビットレート(絵と音の合計) */ + CriUint32 max_chunk_size; /*EN< Maximum chunk size of incoming stream (USF) file */ + /*JP< 最大USFチャンクサイズ */ + CriUint32 min_buffer_size; /*EN< Minimum buffer size for reading */ + /*JP< 最低限必要な読み込みバッファサイズ。
オーディオとビデオの合計 */ + CriSint32 read_buffer_size; /*EN< Input buffer size for reading data */ + /*JP< リードバッファサイズ */ + /* Video */ + CriUint32 num_video; /*EN< Number of simultaneous video streams */ + /*JP< ビデオデコーダの数。現在は1固定。*/ + CriMvVideoParameters video_prm[CRIMV_MAX_VIDEO_NUM]; /*EN< Video parameters see CriMvVideoParameters struct for details */ + /*JP< ビデオパラメータ */ + /* Audio */ + CriUint32 num_audio; /*EN< Number of simultaneous audio streams */ + /*JP< オーディオデコーダの数。現在は1固定。*/ + CriSint32 track_play_audio; /*EN< Track of audio playback. */ + /*JP< 再生するオーディオチャネル番号。-1指定で再生無し。 */ + CriMvAudioParameters audio_prm[CRIMV_MAX_AUDIO_NUM]; /*EN< Audio parameters see CriMvAudioParameters struct for details */ + /*JP< オーディオパラメータ */ + /* Subtitle */ + CriUint32 num_subtitle; /*EN< Number of subtitles */ + /*JP< 字幕チャネル数 */ + CriSint32 channel_play_subtitle; /*EN< Channel for playing subtitles */ + /*JP< 再生する字幕チャネル番号 */ + CriUint32 max_subtitle_size; /*EN< Maximum size of subtitle data */ + /*JP< 字幕データの最大サイズ*/ + + /* Composite mode */ + CriUint32 num_alpha; /*EN< Number of alpha channels (current spec allows only one) */ + /*JP< アルファデコーダの数。現在は1固定。 */ + CriMvAlphaParameters alpha_prm[CRIMV_MAX_ALPHA_NUM]; /*EN< Alpha parameters see CriMvAlphaParameters struct for details */ + /*JP< アルファパラメータ */ + + CriBool seekinfo_flag; /*EN< Flag of the movie file inclues seek info */ + /*JP< シーク情報フラグ */ + CriUint32 format_ver; /*EN< Format version */ + /*JP< フォーマットバージョン */ +} CriMvStreamingParameters; + + +/*EN + * \brief Input Buffer Information + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetInputBufferInfo(), + * CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::SetBufferingTime() + */ +/*JP + * \brief 入力バッファ情報 + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetInputBufferInfo(), + * CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::SetBufferingTime() + */ +typedef struct { + CriUint32 buffer_size; /*EN< Input buffer size [byte] */ + /*JP< 入力バッファサイズ[byte] */ + CriUint32 data_size; /*EN< Data size in input buffer[byte] */ + /*JP< 入力バッファにあるデータサイズ[byte] */ + CriUint32 reload_threshold; /*EN< Re-load threshold. When data size is less than re-load threshold, next read is requested. */ + /*JP< 再読み込み閾値[byte]。データサイズがこの値以下になると読み込みを行います。 */ +} CriMvInputBufferInfo; + + +// TEMP: for internal use +typedef struct { + CriUint8 *imageptr; + CriUint32 bufsize; // [Byte] + CriUint32 line_pitch; // [Byte] + CriUint32 line_size; // [Byte] + CriUint32 num_lines; +} CriMvImageBufferInfo; + +/*EN + * \brief Video Frame Information + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB(), CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers, + * CriMvEasyPlayer::GetFrameOnTimeAsYUV422(), CriMvEasyPlayer::DiscardNextFrame() + */ +/*JP + * \brief ビデオフレーム情報 + * \ingroup MDL_MV_INFO + * ビデオフレーム情報 + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB(), CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers, + * CriMvEasyPlayer::GetFrameOnTimeAsYUV422(), CriMvEasyPlayer::DiscardNextFrame() + */ +typedef struct { + CriUint8 *imageptr; /*EN< Pointer to image data */ + /*JP< 画像データのポインタ */ + CriSint32 frame_id; /*EN< Frame ID ot the playback */ + /*JP< フレーム識別ID(ループ/連結再生時は通算) */ + CriUint32 width; /*EN< Width of movie frame [pixel] (multiple of 8) */ + /*JP< ムービの横幅[pixel] (8の倍数) */ + CriUint32 height; /*EN< Height of movie frame [pixel] (multiple of 8) */ + /*JP< ムービの高さ[pixel] (8の倍数) */ + CriUint32 pitch; /*EN< Pitch of movie frame [byte]*/ + /*JP< ムービのピッチ[byte] */ + CriUint32 disp_width; /*EN< Width of the image to draw. */ + /*JP< 表示したい映像の横ピクセル数(左端から) */ + CriUint32 disp_height; /*EN< Height of the image to draw. */ + /*JP< 表示したい映像の縦ピクセル数(上端から) */ + CriUint32 framerate; /*EN< Frames per second times 1000 */ + /*JP< フレームレートの1000倍の値 */ + CriUint32 framerate_n; /*EN< Frame rate (in rational as numerator). framerate_n/framerate_d = framerate */ /* UTODO: 変数名 */ + /*JP< フレームレートの分子(有理数形式)。framerate_n/framerate_d = framerate */ + CriUint32 framerate_d; /*EN< Frame rate (in rational as denominator). */ + /*JP< フレームレートの分母(有理数形式)。 */ + CriUint64 time; /*EN< Frame time ('time / tunit' indicates time in seconds) */ + /*JP< 時刻。time / tunit で秒を表す。 */ + CriUint64 tunit; /*EN< Unit of time measurement */ + /*JP< 時刻単位 */ + CriUint32 cnt_concatenated_movie; /*EN< Number of concatenated movie data */ + /*JP< ムービの連結回数 */ + CriSint32 frame_id_per_data; /*EN< Frame ID of the movie data */ + /*JP< ムービデータごとのフレーム番号 */ + + CriBool csc_flag; /*EN< This is temporary variable. Please don't access. */ + /*JP< テスト中の変数です。アクセスしないでください。 */ + + CriMvAlphaType alpha_type; /*EN< Composite mode */ + /*JP< アルファの合成モード*/ + + void *details_ptr[CRIMV_FRAME_DETAILS_NUM]; // for internal use + + CriSint32 num_images; // TEMP: for internal use + CriMvImageBufferInfo image_info[4]; // TEMP: for internal use + + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< 色変換タイプ。 */ + CriUint32 total_frames_per_data; /* EN< Total frames of the movie data*/ + /*JP< ムービデータ単位の総フレーム数 */ +} CriMvFrameInfo; + +/*EN + * \brief Subtitle Information + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetSubtitleOnTime() + */ +/*JP + * \brief 字幕情報 + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetSubtitleOnTime() + */ +typedef struct { + CriUint8 *dataptr; /*EN< Pointer to subtitle data */ + /*JP< 字幕データのポインタ */ + CriUint32 data_size; /*EN< Size of subtitle data */ + /*JP< 字幕データサイズ */ + CriSint32 channel_no; /*EN< Channel number of subtitle data */ + /*JP< 字幕データのチャネル番号 */ + CriUint64 time_unit; /*EN< Unit of time measurement */ + /*JP< 時刻単位 */ + CriUint64 in_time; /*EN< Display start time */ + /*JP< 表示開始時刻*/ + CriUint64 duration_time; /*EN< Display duration time */ + /*JP< 表示持続時間 */ + CriUint32 cnt_concatenated_movie; /*EN< Number of concatenated movie data */ + /*JP< ムービの連結回数 */ + CriUint64 in_time_per_data; /*EN< Display start time per movie data*/ + /*JP< ムービデータごとに表示開始時刻*/ +} CriMvSubtitleInfo; + +/*EN + * \brief Event Point Info + * \ingroup MDL_MV_INFO + * Event point info is the each timing info was embeded to movie data as cue point info. + * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +/*JP + * \brief イベントポイント情報 + * \ingroup MDL_MV_INFO + * キューポイント機能でムービデータに埋め込まれた個々のタイミング情報です。 + * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +typedef struct { + CriChar8 *cue_name; /*EN< The name string of event point. Char code depends on cue point text. */ + /*JP< イベントポイント名。文字コードはキューポイント情報テキストに従います。 */ + CriUint32 size_name; /*EN< The data size of name string */ + /*JP< イベントポイント名のデータサイズ */ + CriUint64 time; /*EN< Timer counter */ + /*JP< タイマカウント */ + CriUint64 tunit; /*EN< Counter per 1 second. "count / unit" indicates the timer on the second time scale. */ + /*JP< 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 */ + CriSint32 type; /*EN< Event point type */ + /*JP< イベントポイント種別 */ + CriChar8 *param_string; /*EN< The string of user parameters. Char code depends on cue point text. */ + /*JP< ユーザパラメータ文字列。文字コードはキューポイント情報テキストに従います。 */ + CriUint32 size_param; /*EN< The data size of user parameters string */ + /*JP< ユーザパラメータ文字列のデータサイズ */ + CriUint32 cnt_callback; /*EN< The counter of calling cue point callback. */ + /*JP< キューポイントコールバックの呼び出しカウンタ */ +} CriMvEventPoint; + +/*EN + * \brief Cue Point Info + * \ingroup MDL_MV_INFO + * Cue point info includes the number of event points and the list. + * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +/*JP + * \brief キューポイント情報 + * \ingroup MDL_MV_INFO + * キューポイント情報は、イベントポイントの個数と一覧です。
+ * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +typedef struct { + CriUint32 num_eventpoint; /*EN< The number of event points */ + /*JP< イベントポイント個数 */ + CriMvEventPoint *eventtable; /*EN< The list of event points */ + /*JP< イベントポイント一覧 */ +} CriMvCuePointInfo; + +/*EN + * \brief YUV Texture Buffer Parameters + * \ingroup MDL_MV_INFO + * The output buffer parameters for CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers(). + * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() outputs data for pixel shader.
+ * If an application doesn't play alpha movie, CRI Movie library doesn't use alpha buffer parameters.
+ * \sa CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() + */ +/*JP + * \brief YUV個別バッファ情報 + * \ingroup MDL_MV_INFO + * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() の出力バッファ情報です。
+ * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() はPixel Shader 向けのデコード結果を出力します。
+ * アルファムービ再生を行わない場合(不透明の通常再生)は、Alphaテクスチャ関連のパラメータは使用しません。
+ * \sa CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() + */ +typedef struct { + CriUint8 *y_imagebuf; /*EN< Pointer to the buffer of Y texture */ + /*JP< Yテクスチャのバッファポインタ */ + CriUint32 y_bufsize; /*EN< Size of the buffer of Y texture [byte] */ + /*JP< Yテクスチャのバッファサイズ[byte] */ + CriUint32 y_pitch; /*EN< Pitch of the buffer of Y texture [byte] */ + /*JP< Yテクスチャのピッチ[byte] */ + CriUint8 *u_imagebuf; /*EN< Pointer to the buffer of U texture */ + /*JP< Uテクスチャのバッファポインタ */ + CriUint32 u_bufsize; /*EN< Size of the buffer of U texture [byte] */ + /*JP< Uテクスチャのバッファサイズ[byte] */ + CriUint32 u_pitch; /*EN< Pitch of the buffer of U texture [byte] */ + /*JP< Uテクスチャのピッチ[byte] */ + CriUint8 *v_imagebuf; /*EN< Pointer to the buffer of V texture */ + /*JP< Vテクスチャのバッファポインタ */ + CriUint32 v_bufsize; /*EN< Size of the buffer of V texture [byte] */ + /*JP< Vテクスチャのバッファサイズ[byte] */ + CriUint32 v_pitch; /*EN< Pitch of the buffer of V texture [byte] */ + /*JP< Vテクスチャのピッチ[byte] */ + CriUint8 *a_imagebuf; /*EN< Pointer to the buffer of Alpha texture */ + /*JP< Alphaテクスチャのバッファポインタ */ + CriUint32 a_bufsize; /*EN< Size of the buffer of Alpha texture [byte] */ + /*JP< Alphaテクスチャのバッファサイズ[byte] */ + CriUint32 a_pitch; /*EN< Pitch of the buffer of Alpha texture [byte] */ + /*JP< Alphaテクスチャのピッチ[byte] */ +} CriMvYuvBuffers; + + +/*EN + * \brief Playback Information + * \ingroup MDL_MV_INFO + * The output playback information of CriMvEasyPlayer::GetPlaybackInfo(). + * These parameters represents current movie playback information such as decode delay of movie data and + * interval of video frames retrieval. + * \sa CriMvEasyPlayer::GetPlaybackInfo() + */ +/*JP + * \brief 再生情報 + * \ingroup MDL_MV_INFO + * CriMvEasyPlayer::GetPlaybackInfo() の出力再生情報です。
+ * フレームの取得間隔やデコードの遅延などの現在再生しているムービの再生情報を表します。
+ * \sa CriMvEasyPlayer::GetPlaybackInfo() + */ +typedef struct { + CriUint64 cnt_app_loop; /*EN< Loop count of application. Precisely, this is a number of calls of CriMvEasyPlayer::Update(). The count up will start after app is able to acquire the first video frame */ + /*JP< アプリケーションのループカウント。具体的には CriMvEasyPlayer::Update() の呼び出し回数になります。最初のフレームが取得可能になるとカウントが始まります。*/ + CriUint64 cnt_frame_interval[4]; /*EN< Interval of video frames retrieval. These values are count up when CriMvEasyPlayer::IsNextFrameOnTime() returns TRUE. + * + * The interval of video frames retrieval indicates a number of the loop count when your application calls CriMvEasyPlayer::IsNextFrameOnTime() in the main loop. + * In case that the application waits for vertical retrace, 1 interval equals about 16.7 msec. + * The index of array represents the count of intervals as follows: + * + *
Index Interval of video frames retrieval + *
0 Every main loop + *
1 2 main loops + *
2 3 main loops + *
3 4 or more main loops + *
+ * With these values, you can check if the application gets video frames with appropriate intervals. Please use the values as measuring playback smoothness + * + * In order to use these values, the application must meet the following conditions: + * - The main loop should work periodically and stably (Ideally sync with vertical retrace) + * - The application should call CriMvEasyPlayer::IsNextFrameOnTime() once in everly main loop + * + * For example, if the application runs at 59.94fps by waiting for vertical retrace and a framerate of playing movie file is 29.97fps, + * only cnt_frame_interval[1] should be increased. + */ + /*JP< フレームの取得間隔。これらの値は、 CriMvEasyPlayer::IsNextFrameOnTime() がTRUEを返した時にカウントアップされます。
+ * + * フレームの取得間隔とは、アプリケーションがメインループ内でフレーム取得関数を読んだ時のループの回数を意味します。 + * メインループがVSyncと同期している場合は、1 Interval = 約16.7msecということになります。 + * 配列のインデックスは、以下のように取得間隔を表します。
+ * + *
インデックス フレームの取得間隔 + *
0 毎メインループ + *
1 2 メインループ + *
2 3 メインループ + *
3 4 メインループ以上 + *
+ * これらの値を見ることで、アプリが正しい間隔でフレームを取得できたのかどうかをチェックすることができます。ムービが滑らかに再生できているかの目安にしてください。
+ * + * ただし前提として、以下の条件をアプリが満たしている必要があります。 + * - アプリがVSyncなど、一定の周期で安定して動作している + * - メインループ内で毎回 CriMvEasyPlayer::IsNextFrameOnTime() を呼び出す + * + * 上記の条件下において、例えばアプリが59.94fpsで動作している状態で、フレームレートが29.97fpsのムービを再生した場合、cnt_frame_interval[1]のみが増え続けれれば + * 正しい間隔でフレームの取得が出来たことになります。 + */ + CriUint64 cnt_time_early; /*EN< A count of how many times CriMvEasyPlayer::IsNextFrameOnTime() returns FALSE due to the determination if it is the time to provide the next video frame */ + /*JP< CriMvEasyPlayer::IsNextFrameOnTime() が、フレーム表示時刻判定によりFALSEを返した回数。*/ + CriUint64 cnt_decode_delay; /*EN< A count of how many times CriMvEasyPlayer::IsNextFrameOnTime() returns FALSE due to the delay of decoding movie data */ + /*JP< CriMvEasyPlayer::IsNextFrameOnTime()が、ビデオフレームのデコード遅延によりFALSEを返した回数 */ + CriFloat32 time_max_delay; /*EN< Maximum delay time [msec] of the actual time a video frame retrieved against the original time should be retrieved */ + /*JP< ビデオフレームを取得した実際の時刻と、本来表示すべき時刻との最大遅延時間 [msec]。 */ + CriFloat32 time_average_delay; /*EN< Average delay time [msec] of the actual time a video frame retrieved against the original time should be retrieved */ + /*JP< ビデオフレームを取得した実際の時刻と、本来表示すべき時刻との平均遅延時間 [msec]。 */ +} CriMvPlaybackInfo; + +#if defined(XPT_TGT_PS3PPU) +/*EN + * \brief Parameters of SPURS and PPU for decoding + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupSpursParameters_PS3(), CriMv::CalcSpursWorkSize_PS3() + */ +/*JP + * \brief デコードに使うSPURSおよびPPUのパラメータ + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupSpursParameters_PS3(), CriMv::CalcSpursWorkSize_PS3() + */ +typedef struct { + void *spurs_handler; /*EN< SPURS handler */ + /*JP< SPURSハンドル */ + void *spurs_work; /*EN< SPURS work area. The size is spurs_worksize. The alignment is 128 byte. */ + /*JP< SPURS用ワークバッファ。バッファサイズは spurs_worksize で128バイト境界。 */ + CriSint32 spurs_worksize; /*EN< SPURS work size. This size is calculated by CriMv::CalcSpursWorkSize_PS3 function. */ + /*JP< SPURS用ワークサイズ。CriMv::CalcSpursWorkSize_PS3 関数で取得した値。 */ + CriSint32 spurs_max_contention; /*EN< SPURS max contention */ + /*JP< SPURS でムービデコード用に使うSPUの最大数 */ + CriUint8 *spurs_task_priority; /*EN< SPURS task priority x 8 */ + /*JP< SPURS のタスクプライオリティ配列。配列要素は8個。 */ + + CriUint32 ppu_num; /*EN< The number of PPU for decoding (0-2) */ + /*JP< The number of PPU for decoding (0-2) */ + CriSint32 ppu_thread_prio; /*EN< PPU Thread Priority. This priority is used for decoding thread in the case of ppu_num equal 2. */ + /*JP< PPU Thread Priority. この値は ppu_num に2を指定した場合に作成するスレッドに使われる。 */ +} CriMvProcessorParameters_PS3; + +// [NOT SUPPORT on normal library] +// for SPU Thread +typedef struct { + CriUint32 ppu_num; /* The number of PPU for decoding (0-2) */ + CriSint32 ppu_prio; /* PPU Thread Priority */ + CriUint32 spu_num; /* The number of SPU for decoding (0-6) */ + CriSint32 spu_grp_prio; /* SPU Thread Group Priority */ +} CriMvSpuThreadParameters_PS3; + +#endif + +#if defined(XPT_TGT_XBOX360) +/*EN + * \brief Parameters of Xbox360 processors for decoding + * \ingroup MDL_MV_BASIC + * + * \sa CriMvEasyPlayer::SetUsableProcessors_XBOX360() + */ +/*JP + * \brief デコードに使うXbox360プロセッサのパラメータ + * \ingroup MDL_MV_BASIC + * + * \sa CriMvEasyPlayer::SetUsableProcessors_XBOX360() + */ +typedef struct { + CriBool processor0_flag; /*EN< Processor 0 (Core 0, Thread 0) usable flag */ + /*JP< プロセッサ0 (コア0スレッド0) 使用可能フラグ */ + CriBool processor1_flag; /*EN< Processor 1 (Core 0, Thread 1) usable flag */ + /*JP< プロセッサ1 (コア0スレッド1) 使用可能フラグ */ + CriBool processor2_flag; /*EN< Processor 2 (Core 1, Thread 0) usable flag */ + /*JP< プロセッサ2 (コア1スレッド0) 使用可能フラグ */ + CriBool processor3_flag; /*EN< Processor 3 (Core 1, Thread 1) usable flag */ + /*JP< プロセッサ3 (コア1スレッド1) 使用可能フラグ */ + CriBool processor4_flag; /*EN< Processor 4 (Core 2, Thread 0) usable flag */ + /*JP< プロセッサ4 (コア2スレッド0) 使用可能フラグ */ + CriBool processor5_flag; /*EN< Processor 5 (Core 2, Thread 1) usable flag */ + /*JP< プロセッサ5 (コア2スレッド1) 使用可能フラグ */ + CriSint32 thread_priority; /*EN< Priority of decoding threads on the active processors */ + /*JP< 各プロセッサ上でデコード処理を行うスレッドの優先度 */ +} CriMvProcessorParameters_XBOX360; +#endif + +#if defined(XPT_TGT_VITA) +/*EN + * \brief AVC Decoder Parameters + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupAvcDecoderParameters_VITA() + */ +/*JP + * \brief AVCデコーダパラメータ + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupAvcDecoderParameters_VITA() + */ +typedef struct { + CriUint32 horizontal; /*EN< Maximum width for decoding (in pixel) */ + /*JP< 最大デコード画像の横幅 (単位:ピクセル) */ + CriUint32 vertical; /*EN< Maximum height for decoding (in pixel) */ + /*JP< 最大デコード画像の高さ (単位:ピクセル) */ + CriUint32 n_ref_frames; /*EN< Maximum reference frames on decoding (default:3) */ + /*JP< デコード時の最大参照画像の枚数 */ + CriUint32 n_decoders; /*EN< Maximum number of avc decoders (max:1) */ + /*JP< 同時に使用するAVCでコーダの最大数 (1固定) */ + +} CriMvAvcDecoderParameters_VITA; +#endif + +/*--------------------------------------------------------------------------*/ +/* */ +/*--------------------------------------------------------------------------*/ +typedef enum { + CRIMV_PCM_FORMAT_SINT16 = 0, + CRIMV_PCM_FORMAT_FLOAT32 = 1, + + /* Keep enum 4bytes */ + CRIMV_PCM_FORMAT__MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvPcmFormat; +/* + * \brief 16bit wave data information + * \ingroup MDL_MV_INFO + * Information about a 16-bit waveform. + */ +/* 16bit Waveform 情報 */ +typedef struct { + CriUint32 num_channel; /* Number of Channels. monaural = 1, stereo = 2 */ + /* Number of Channels. monaural = 1, stereo = 2 */ + CriUint32 num_samples; /* Number of sample */ + /* サンプル数 */ + CriUint32 sampling_rate; /* Sampling rate */ + /* サンプリング周波数 */ +} CriMvWaveInfo; + +/* オーディオヘッダ */ +typedef struct { + /* ストリーミングパラメータと共通 */ + CriUint32 sampling_rate; + CriUint32 num_channel; + CriUint32 total_samples; + CriUint32 codec_type; + + CriUint32 metadata_count; + CriUint32 metadata_size; + + /* ヘッダ固有 */ + CriUint32 a_input_xsize; +} CriMvPlyAudioHeader; + +/* ビデオヘッダ */ +typedef struct { + /* ヘッダ固有 */ + CriUint32 width; + CriUint32 height; + CriUint32 disp_width; + CriUint32 disp_height; + CriUint32 framerate_n; + CriUint32 framerate_d; + CriUint32 total_frames; + + CriUint32 material_width; /* width of video original source. 0 means no info. */ + CriUint32 material_height; /* height of video original source. 0 means no info. */ + CriUint32 screen_width; /* screen width for Wii */ + + CriUint32 codec_type; + CriUint32 codec_dc_option; /* 11 or 10 */ + + CriUint32 metadata_count; + CriUint32 metadata_size; + + CriUint32 pre_padding; + CriUint32 color_conversion_type; + CriSint32 max_picture_size; + CriSint32 average_bitrate; +} CriMvPlyVideoHeader; + +/* サブタイトルヘッダ */ +typedef struct { + CriBool is_subtitle_data; + CriUint32 num_channel; + CriUint64 time_unit; + CriUint32 max_subtitle_size; +} CriMvPlySubtitleHeader; + +/* キューポイントヘッダ */ +typedef struct { + CriBool is_cuepoint_data; + CriUint32 metadata_count; + CriUint32 metadata_size; + CriUint32 num_eventpoint; + CriUint64 time_unit; +} CriMvPlyCuePointHeader; + +/* アルファヘッダ */ +typedef struct { + /* ヘッダ固有 */ + CriUint32 width; + CriUint32 height; + CriUint32 disp_width; + CriUint32 disp_height; + CriUint32 framerate_n; + CriUint32 framerate_d; + CriUint32 total_frames; + + CriMvAlphaType alpha_type; + CriUint32 codec_type; + + CriUint32 metadata_count; + CriUint32 metadata_size; + + CriUint32 pre_padding; + CriUint32 color_conversion_type; + CriSint32 max_picture_size; + CriSint32 average_bitrate; +} CriMvPlyAlphaHeader; + +/* アルファのみのフレーム情報 */ +typedef struct { + CriUint8 *imageptr; /*EN< Pointer to image data */ + /*JP< 画像データのポインタ */ + CriSint32 frame_id; /*EN< Frame ID */ + /*JP< フレーム識別ID */ + CriUint32 width; /*EN< Width of movie frame [pixel] */ + /*JP< ムービの横幅[pixel] */ + CriUint32 height; /*EN< Height of movie frame [pixel] */ + /*JP< ムービの高さ[pixel] */ + CriUint32 disp_width; /*EN< Width of image [pixel] */ + /*JP< 有効な映像の横幅[pixel] */ + CriUint32 disp_height; /*EN< Height of image [pixel] */ + /*JP< 有効な映像の高さ[pixel] */ + CriUint32 pitch; /*EN< Pitch of movie frame [byte]*/ + /*JP< ムービのピッチ[byte] */ + CriUint64 time; /*EN< Frame time ('time / tunit' indicates time in seconds) */ + /*JP< 時刻。time / tunit で秒を表す。 */ + CriUint64 tunit; /*EN< Unit of time measurement */ + /*JP< 時刻単位 */ + CriSint32 frame_id_per_data; /*EN< Frame ID of the movie data */ + /*JP< ムービデータごとのフレーム番号 */ + CriMvAlphaType alpha_type; /*EN< Composite mode */ + /*JP< アルファの合成モード*/ + void *detail_ptr; /* TEMP: for internal use */ + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< 色変換タイプ。 */ +} CriMvAlphaFrameInfo; + +// 内部管理用。ムービ情報をユーザに渡す時はこれとほぼ同じだろうか。 +/* Information of USF File */ +typedef struct { + CriBool is_usf_file; + CriUint32 max_chunk_size; + CriUint32 min_buffer_size; + CriUint32 bitrate; + CriUint32 format_version; + /* Video */ + CriUint32 num_video; + CriMvPlyVideoHeader videohead[CRIMV_MAX_VIDEO_NUM]; + /* Audio */ + CriUint32 num_audio; + CriMvPlyAudioHeader audiohead[CRIMV_MAX_AUDIO_NUM]; + /* Subtitle */ + CriUint32 num_subtitle; + CriMvPlySubtitleHeader subtitlehead; + /* Alpha */ + CriUint32 num_alpha; + CriMvPlyAlphaHeader alphahead[CRIMV_MAX_ALPHA_NUM]; + /* CuePoint */ + CriUint32 num_cuepoint; + CriMvPlyCuePointHeader cuepointhead; +} CriMvPlyHeaderInfo; + +/* Video Elementary Stream */ +typedef struct { + CriUint32 fcid; + CriSint32 track_no; // チャンクのチャネル番号 + void *vdec; +} CriMvPlyVideo; + +typedef struct { + CriUint32 fcid; + CriSint32 track_no; // チャンクのチャネル番号 + void *dec; +} CriMvPlyAlpha; + +/* ムービヘッダを管理するための構造体 */ +typedef struct { + CriMvPlyHeaderInfo info; + CriBool write_new_head_flag; // CRIDが見つかって次のヘッダを書き込む準備ができたか? + CriUint32 num_remaining_adec_head; // 必要な残りのオーディオヘッダの数 + CriUint32 num_remaining_vdec_head; // 必要な残りのビデオのヘッダの数 + CriUint32 num_remaining_subtitle_head; // 必要な残りの字幕のヘッダの数 + CriUint32 num_remaining_alpha_head; // 必要な残りのアルファのヘッダ数 + CriUint32 num_remaining_cuepoint_head; // 必要な残りのキューポイントのヘッダ数 + /* 2010-08-19: TEMP: CONCAT_KAI: Don't refer this member. */ + CriUint64 accumulated_tcount; +} CriMvHeaderInfoContainer; + +typedef struct { + CriBool is_play_audio; + CriUint32 fcid; + CriUint32 track_no; // チャンクのチャネル番号 + void *adec; // 実際のオーディオコーデック + CriUint32 num_channel; // データのチャネル数 + CriUint32 sampling_rate; // サンプリング周波数 + CriUint32 output_buffer_samples; + CriSj sji; // UNI + CriSj sjo[CRIMV_PCM_BUFFER_MAX]; // RBF + CriUint32 sjo_bufsize[CRIMV_PCM_BUFFER_MAX]; + CriBool term_supply; // データ供給終了通知フラグ + CriBool is_working; // コンテンツチャンク処理中 + +#if defined(ENABLE_DYNAMIC_AUDIO_SWITCH) + CriUint32 next_track_no; // ユーザが指定した切替先のトラック番号 + CriUint32 last_track_switch_time; // 切替元のトラックの最後にチャンクをとった時刻 + CriUint32 last_track_switch_tunit; // 上記時刻の単位 (in Hz?) + CriMvPlyAmngTrackState switch_state; // トラック切替による状態 +#endif +} *CriMvPlyAdec, CriMvPlyAdecObj; + +typedef struct { + + CriMvPlyAdec mvply_adecs[NUM_MAX_ADEC]; + CriSint32 num_adecs; + CriUint32 size_smpl; + CriSj sji; + CriUint32 chunk_num_per_server; + + CriBool (*cbfunc_nofify_found_header)(void *usrobj, CriChunk *ckc, CriUint8 chno); + void *usrobj_nofify_found_header; + +} *CriMvPlyAmng, CriMvPlyAmngObj; + + +/* シークブロック情報 */ +typedef struct { + CriSint32 top_frame_id; +} CriMvSeekBlockInfo; + +/* ストリーマ用情報 */ +typedef struct { + CriUint32 max_chunk_size; + CriUint32 average_bitrate; +} CriMvStreamerInfo; + + +/* ハンドル作成用コンフィグ構造体 */ +typedef struct { + CriUint32 readbuffer_size; +} CriMvHandleConfig; + + +/*JP CRI Movie ハンドル */ +/*EN + * A handle for a single movie. If multiple movies are to be played simultaneously, + * create a CriMvPly handle for each movie. + * + * \sa criMvPly_Create(), criMvPly_Destroy() */ +typedef struct { + /*** Member variable is ***/ + CriBool used; + CriMvPlyStatus stat; + CriBool request_stop; + CriBool restrain_supply; + CriBool term_supply; + void *cs_work; + void *cshn; + /* USF Header */ + + CriMvHeaderInfoContainer headinfo_container[CRIMVPLY_HEAD_CONTAINER_NUM]; + Uint16 cur_dechead_idx; + CriUint32 cnt_dechead; /* ヘッダ解析ごとに更新 */ + CriUint32 cnt_concat; /* GetFrameで更新 */ + + CriMvPlyHeaderInfo headinfo; + CriUint32 num_headck; /* ヘッダ解析処理したチャンク数 */ + CriFloat32 def_buffering_time; + CriUint32 def_max_stream; + CriUint32 def_sound_output_buffer_samples; + CriSint32 def_track_play_audio; /* -1 でオーディオ再生無し */ + +#if defined(XPT_TGT_XBOX360) || defined(XPT_TGT_PC) || defined(XPT_TGT_VITA) || defined(XPT_TGT_WIIU) + CriSint32 def_num_dlg_threads; + CriUint32 def_processor_mask; + CriUint32 def_affinity_masks[CRIMV_DLGTHREAD_NUM]; + CriSint32 def_thread_priorities[CRIMV_DLGTHREAD_NUM]; +#endif + + CriBool is_prepare_work; + CriMvStreamingParameters stmprm; /* ストリーミングパラメータの記録 */ + /* Demultiplexer */ + CriSint32 inputtype; /* ストリーミングかメモリか?メモリ=ユニSJ再生 */ + CriBool is_usf_data; /* 入力ファイルはUSFファイルか? */ + void *demux; /* USFデマルチプレクサハンドル */ + CriUint32 max_demuxout; /* デマルチプレクサ出力の最大種別数 */ + CriUint32 num_demuxout; /* デマルチプレクサ出力に設定済みの種別数 */ + CriSj headanaly_in_sj; // RBF + CriSj headanaly_out_sj; // UNI + CriSj read_sj; // RBF + CriChunk readck; + + CriSj memplay_sj; // UNI (for memory playback) + CriChunk movie_on_mem; /* メモリ指定のムービデータ記憶用(1個) */ + CriUint32 offset_content; /* メモリ指定先頭データのコンテンツ本体までのサイズ */ + + /* === ハンドル作成時に確保 === */ + CriHeap heap_gen; + /* ヘッダ解析用の読み込み領域 */ + CriUint32 headanaly_bufsize; + /* ハンドル内部メモリは最初に10kbyte確保して使いまわす。具体的にはヘッダ解析用。 */ + CriHeap local_heap; /* ハンドル内部専用Heap */ + CriSint32 local_bufsize; /* ハンドル内部専用Heap用のバッファサイズ */ + CriUint8 *local_bufptr; /* ハンドル内部専用Heap用のバッファポインタ */ + /* === メタワークバッファ (ヘッダ解析時に確保) === */ + CriHeap heap_meta; + /* === ワークバッファ作成時に確保 === */ + CriHeap heap_core; + /* 読み込みバッファ */ + CriUint32 size_readbuf_main; + CriUint32 size_readbuf_ext; + /* Video Decoder */ + CriMvPlyVideo video; + CriUint32 framerate_n; + CriUint32 framerate_d; + /* Audio Decoder */ + CriMvPlyAmng audio_mngr; + CriMvPcmFormat pcmfmt; + CriUint32 size_smpl; + CriHeap heap_audio2; + /* Subtitle */ + CriSj sjo_subtitle; + CriSint32 concat_subtitle_cnt; /* 字幕の連結処理回数 */ + CriSint32 ch_subtitle; /* 字幕の連結処理回数 */ + /* Alpha */ + CriMvPlyAlpha alpha; + + /* 折り返しチャンク対応用(使うかどうかに関係なく変数だけは定義する) */ + CriUint32 bufsize_read_main; /* 入力SJのバッファ本体サイズ */ + CriUint32 bufsize_read_ext; /* 入力SJののりしろサイズ */ + CriUint8 *read_sj_bufptr; /* 入力RBSJの先頭バッファアドレス */ + + /* ストリーミングパラメータに入れるという手段もアリかも? */ + CriSint32 seek_frame_id; /* シークしたいフレームID(GOPの途中の可能性あり) */ + CriSint32 video_gop_top_id; /* シーク後のビデオGOP先頭フレームID : 0以下でシーク無し */ + CriSint32 alpha_gop_top_id; /* シーク後のアルファGOP先頭フレームID : 0以下でシーク無し */ + CriBool seek_video_prep_flag; /* シーク再生のビデオ準備完了フラグ(GOP途中まで進んだか?) */ + CriBool seek_alpha_prep_flag; /* シーク再生のアルファ準備完了フラグ(GOP途中まで進んだか?) */ + CriBool seek_audio_prep_flag; /* シーク再生のオーディオ準備完了フラグ(シーク指定時刻まで捨てたか?) */ + + CriSint32 dechdr_stage; /* DECHDRの進み具合 */ + CriSint32 sji_meta_bufsize; /* メタデータ用入力バッファサイズ */ + CriSj sji_meta; /* メタデータ用入力SJ */ + CriUint32 cnt_meta_ck; /* メタデータ用入力SJ */ + void *video_seektbl_ptr; + CriUint32 video_seektbl_size; + CriSint32 video_gop_num; + void *alpha_seektbl_ptr; + CriUint32 alpha_seektbl_size; + CriSint32 alpha_gop_num; + + void *audio_header_ptr[CRIMV_MAX_AUDIO_NUM]; + CriUint16 audio_header_size[CRIMV_MAX_AUDIO_NUM]; + + void *cuepoint_meta_ptr; + CriUint32 cuepoint_meta_size; + CriMvCuePointInfo cuepoint_info; + + CriMvInputBufferInfo ibuf_info; + CriFloat32 reload_sec_threshold; + + CriSint32 num_frames_for_prep; + + /* For Sofdec2 */ + CriHeap heap_playback; + CriMvMetaDataWorkMallocFunc cbfunc_meta_alloc; + CriMvMetaDataWorkFreeFunc cbfunc_meta_free; + void* usrobj_meta_data; + void* meta_data_work_allocated; /* ユーザアロケータで確保されたメタデータワーク */ + void* event_table_work_allocated; /* ユーザアロケータで確保されたイベントテーブル */ + CriMvStreamerInfo streamer_info; + + /* OUTER_FRAMEPOOL_WORK */ + CriMvFramepoolWorkMallocFunc cbfunc_framepool_alloc; + CriMvFramepoolWorkFreeFunc cbfunc_framepool_free; + void* usrobj_framepool; + void* framepool_work_allocated; /* ユーザアロケータで確保されたフレームプールワーク(解放必要) */ + void* framepool_work_set; /* 直接バッファ指定されたフレームプールワーク(解放不要) */ + + /* For Debug */ + volatile CriUint8 end_sequence_info; + CriUint64Adr header_ptr; + CriSint64 header_size; + CriUint64Adr body_ptr; + CriSint64 body_size; + + CriBool sync_flag; + + CriBool error_flag; + +#if defined(XPT_TGT_IOS) + CriChar8 vavfios_filepath[CRIMVPLY_VAVFIOS_MAX_FILEPATH]; +#endif + + /* For Tools */ + void *extended_mvinfo_config; + + /* ハンドル作成コンフィグ関連 */ + CriBool use_hn_config_flag; /* ハンドル作成コンフィグ指定があったかどうか */ + CriMvHandleConfig hn_config; + +} *CriMvPly, CriMvPlyObj; + +/*************************************************************************** + * Function Declaration + ***************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ライブラリ初期化 */ +/* + * \brief ライブラリの初期化 + * \param なし + * \return なし + * \par 説明: + * ライブラリの初期化を行います。
+ * 複数回連続で初期化した場合は、最初の1回のみ初期化処理を実行します。 + */ +/* + * \ingroup MODULE_INIT + * \brief Initialize library + * + * This function initializes the CRI Movie library, including internal audio, + * streaming and video subsystems. This function must be + * called before any other function in this library will work properly. + * This function initializes only the first time it is called; if it is + * called again, it simply increments an internal counter and returns; it + * does not re-initialize, nor does it create an error condition. + * + * Therefore, it is safe to call criMvPly_Initialize() and criMvPly_Finalize() + * at the beginning and end, respectively, within each of the independent + * modules in your program. If you match these functions call for call, + * only the first criMvPly_Initialize() function and the last criMvPly_Finalize() + * functions should have any effect. + * + * \sa criMvPly_Finalize() + */ +void CRIAPI criMvPly_Initialize(void); + +/* ライブラリ終了 */ +/* + * \brief ライブラリ終了 + * \param なし + * \return なし + * \par 説明: + * ライブラリの終了処理を行います。
+ * 複数回初期化をしていた場合は、同じ回数だけ終了処理を実行してください。 + */ +/* + * \ingroup MODULE_INIT + * \brief Finalize library + * + * This function deallocates any resources in use by the library. + * It should be called the same number of times that the criMvPly_Initialize() + * function is called. If the criMvPly_Initialize() function is called n + * times, on the nth time the criMvPly_Finalize() function is called, + * criMvPly_Finalize() releases any resources allocated by CRI Movie. + * + * Therefore, it is safe to call criMvPly_Initialize() and criMvPly_Finalize() + * at the beginning and end, respectively, within each of the independent + * modules in your program. If you match these functions call for call, + * only the first criMvPly_Initialize() function and the last criMvPly_Finalize() + * functions should have any effect. + * + * \sa criMvPly_Initialize() + */ +void CRIAPI criMvPly_Finalize(void); + +/* ハンドル作成 */ +/* + * \brief ハンドル作成 + * \param heap : メモリ確保に使用するHeapハンドル + * \return CriMvPlyハンドル + * \par 説明: + * CRI Movie ハンドルを作成します。
+ * 必要なハンドル管理領域はHeapハンドルを使って自動的に確保します。
+ * 作成直後のハンドル状態はSTOP状態です。 + */ +/* + * \ingroup MODULE_INIT + * \brief Create a handle + * \param heap A valid CriHeap handle + * \return A valid CriMvPly handle, or NULL if the handle cannot be allocated + * + * This function creates a CriMvPly handle in the CRIMVPLY_STATUS_STOP state. + * Memory for the handle is allocated from the CriHeap structure that you provide. + * Any memory allocation failure during this function results in a text error message to output, and the program hangs. + * Make sure to initialize and create your heap with criHeap_Initialize() and + * criHeap_Create() before calling this function. + * + * \sa CriMvPly, CriMvPlyStatus, criHeap_Initialize(), criHeap_Create() + */ +CriMvPly CRIAPI criMvPly_Create(CriHeap heap); + +/* コンフィグ指定のハンドル作成 */ +/* config がNULL指定の場合はコンフィグ指定無しと同様 */ +CriMvPly CRIAPI criMvPly_CreateWithConfig(CriHeap heap, CriMvHandleConfig *config); + +/* ハンドル破棄 */ +/* + * \brief ハンドル破棄 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * CRI Movie ハンドルの破棄を行います。
+ * ハンドル作成時に引数で指定したHeapハンドルを使って、ハンドル管理領域を解放します。
+ * ワークバッファを確保したままの場合は、ワークバッファ確保時に指定したHeapハンドルを使ってワークバッファも解放します。
+ * ハンドルの破棄は、ハンドル状態がSTOPかPLAYENDの時にしか実行できません。 + */ +/* + * \ingroup MODULE_INIT + * \brief Destroy a handle + * \param mvply A valid CriMvPly handle to be destroyed + * + * This function destroys the CriMvPly handle previously created + * with criMvPly_Create(). + * + * You can only destroy the handle if it is in either the CRIMVPLY_STATUS_STOP or the + * the CRIMVPLY_STATUS_PLAYEND states. Attempting to destroy the handle in + * any other state will produce an error message. You can check the status of + * the handle at any time with criMvPly_GetStatus(). + * + * Any work buffers allocated via criMvPly_AllocateWorkBuffer(), if they are + * still associated with the handle, are freed when criMvPly_Destroy() is called. + * + * \sa CriMvPly, CriMvPlyStatus, criMvPly_GetStatus(), criMvPly_AllocateWorkBuffer() + */ +void CRIAPI criMvPly_Destroy(CriMvPly mvply); + +/* ストリーミングパラメータの取得 */ +/* + * \brief ストリーミングパラメータの取得 + * \param mvply : CRI Movie ハンドル + * \param stmprm : ストリーミングパラメータ + * \return なし + * \par 説明: + * ヘッダ解析の結果をもとに、ムービ再生に必要なストリーミングパラメータを取得します。
+ * ハンドル状態がWAIT_PREPになると取得できるようになります。
+ * このパラメータをもとにcriMvPly_AllocateWorkBuffer関数を呼び出すことができます。
+ * 必要ならばこのパラメータの値を変更して、例えば音ありムービで音を再生しない、といったことも可能です。
+ */ +/* + * \ingroup MODULE_BUFFER + * \brief Get streaming parameters + * \param mvply A valid CriMvPly handle + * \param stmprm An empty CriMvStreamingParameters structure to be filled with data + * + * This function permits you to get detailed information about the stream and + * dynamically allocate resources just before the video and audio sequence + * begins playback. + * + * This function does nothing if the current state of the CriMvPly handle is + * CRIMVPLY_STATUS_DECHDR or CRIMVPLY_STATUS_STOP. The only useful state in + * which to call criMvPly_GetStreamingParameters() is the CRIMVPLY_WAIT_PREP + * status. When the CriMvPly handle is in the CRIMVPLY_WAIT_PREP status, + * calling this function will cause the CriMvStreamingParameters field to be + * filled with data. + * + * Some of the CriMvStreamingParameters, such as buffering time and the + * maximum number of files to read, are copied from the CriMvPly structure. + * However, maximum bitrate, video size, audio stream rate and channel + * info are calculated from the incoming stream. + * + * After calling criMvPly_GetStreamingParameters(), you can programmatically + * override any of the fields in the CriMvStreamingParameters struct yourself + * before calling criMvPly_AllocateWorkBuffer() with it. For example, you might + * need to read a stream containing both audio and video, but only output the + * video from the stream. In this case you could allocate trivial audio buffers + * for output by modifying the CriMvStreamingParameters struct accordingly after + * calling this function. + * + * \sa criMvPly_AllocateWorkBuffer(), CriMvPly, CriMvStreamingParameters + */ + void CRIAPI criMvPly_GetStreamingParameters(CriMvPly mvply, CriMvStreamingParameters *stmprm); + +/* ワークバッファの確保 */ +/* + * \brief ワークバッファの確保 + * \param mvply : CRI Movie ハンドル + * \param heap : + * \param stmprm : ストリーミングパラメータ + * \return なし + * \par 説明: + * 引数のHeapハンドルを使って、読み込みバッファやビデオ/オーディオのワークバッファを確保します。
+ * この関数を呼び出し可能なのは、STOP状態かWAIT_PREP状態の時のみです。
+ * 同じハンドルに対して2度呼び出すと、1度目のワークバッファを全て解放してから、改めてワークバッファを確保します。
+ * criMvPly_Start関数よりも先にワークバッファを確保しておくこともできます。 + */ +/* + * \ingroup MODULE_BUFFER + * \brief Allocate internal streaming work buffers + * \param mvply A CriMvPly handle + * \param heap A CriHeap handle + * \param stmprm An initialized CriMvStreamingParameters structure + * + * This function allocates internal streaming buffers for the CriMvPly movie + * player from the CriHeap. The amount of memory required is based + * on the maximum bitrate of the stream, the requested buffering time, the + * maximum chunk size, and the height and width of the incoming video frame. + * However, a small amount of memory is allocated for the + * video and audio decoders from the CriHeap as well. + * + * The CriHeap handle passed as a parameter to this function need not + * be the same CriHeap handle you passed to the criMvPly_Create() function. + * You may prefer to use either one or two heaps. + * + * This function can be called only if the CriMvPly handle is in the + * CRIMVPLY_STATUS_STOP or the CRIMVPLY_STATUS_WAIT_PREP status. Calling + * this function any other time will produce an error message. + * + * If this function is called twice without calling criMvPly_FreeWorkBuffer(), + * it releases the previously allocated buffers before allocating them again. + * + * This function must be called sometime before criMvPly_Start(). + * + * \if ps2 + * \par PS2 only: + * The PS2 implementation of this function additionally allocates buffers for + * internal DMA tags. If these allocations fail due to lack of memory, the + * library will hang. + * \endif + * + * \sa CriMvPly, CriHeap, CriMvPlyStatus, CriMvStreamingParameters, criMvPly_FreeWorkBuffer(), + * criMvPly_Start() + */ +CriBool CRIAPI criMvPly_AllocateWorkBuffer(CriMvPly mvply, CriHeap heap, CriMvStreamingParameters *stmprm); + +/* ワークバッファの解放 */ +/* + * \brief ワークバッファの解放 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * criMvPly_AllocateWorkBuffer関数で確保したワークバッファを全て解放します。
+ * この関数を呼び出し可能なのは、STOP/WAIT_PREP/PLAYEND状態の時のみです。
+ * CRI Movie Ver.0.60 では未実装です。 + */ +/* + * \ingroup MODULE_BUFFER + * \brief Release streaming work buffer + * \param mvply A valid CriMvPly handle + * + * This function releases streaming work buffers allocated from the CriHeap + * previously associated with criMvPly_AllocateWorkBuffer(). + * This function should only be called at CRIMVPLY_STATUS_STOP, + * CRIMVPLY_STATUS_WAIT_PREP or CRIMVPLY_STATUS_PLAYEND states. However, this + * function does not verify the current stream status before releasing + * all the buffers; it merely deallocates them. Expect interesting crashes + * if you call this function while playing a movie. + * + * You can verify the current CriMvPly handle status with criMvPly_GetStatus() if + * necessary. + * + */ +void CRIAPI criMvPly_FreeWorkBuffer(CriMvPly mvply); + +/* 再生するオーディオチャネルの設定 */ +/* + * \brief 再生するオーディオチャネルの設定 + * \param mvply : CRI Movie ハンドル + * \param ch : オーディオチャネル番号 + * \return なし + * \par 説明: + * CriMvStreamingParameters構造体のメンバ track_play_audioのデフォルト値を設定します。
+ * criMvPly_GetStreamingParameters関数でCriMvStreamingParameters構造体を取得したときにこの値が格納されます。
+ * 何も設定していない場合、buffering_timeには0が入います。 + * -1を指定するとオーディオを再生しない設定になります。 + */ +void CRIAPI criMvPly_SetAudioTrack(CriMvPly mvply, CriSint32 track); + +/* バッファリング時間(単位[sec])の設定 */ +/* + * \brief バッファリング時間(単位[sec])の設定 + * \param mvply : CRI Movie ハンドル + * \param time : バッファリング時間 + * \return なし + * \par 説明: + * CriMvStreamingParameters構造体のメンバbuffering_timeのデフォルト値を設定します。
+ * criMvPly_GetStreamingParameters関数で CriMvStreamingParameters構造体を取得したときにこの値が格納されます。
+ * 何も設定していない場合、buffering_timeには1.0秒が入っています。 + */ +/* + * \ingroup MODULE_BUFFER + * \brief Set default buffering time (unit[sec]) + * \param mvply A valid CriMvPly handle + * \param time Buffering time in seconds + * + * This function tells the CriMvPly handle how much time of the stream to buffer in + * memory. Buffering is necessary to cover seeks, error retries, latency and + * other various hiccups in most data sources. + * + * This value is stored in the buffering_time field of the CriMvStreamingParameters + * struct. It is set to a default of 1.0 seconds when the CriMvPly handle is created. + * This is typically safe for most DVD type file systems. + * + * \sa CriMvPly, CriMvStreamingParameters + */ +//void CRIAPI criMvPly_SetBufferingTime(CriMvPly mvply, CriFloat32 time); + +/* 同時読み込みファイル数の設定 */ +/* + * \brief 同時読み込みファイル数の設定 + * \param mvply : CRI Movie ハンドル + * \param max_stm : 同時読み込みファイル数 + * \return なし + * \par 説明: + * CriMvStreamingParameters構造体のメンバmax_simultaneous_read_filesのデフォルト値を設定します。
+ * criMvPly_GetStreamingParameters関数で CriMvStreamingParameters構造体を取得したときにこの値が格納されます。
+ * 何も設定していない場合、max_simultaneous_read_filesには1が入っています。 + */ +/* + * \ingroup MODULE_BUFFER + * \brief Set maximum number of simultaneous streams + * \param mvply A valid CriMvPly handle + * \param max_stm The maximum number of simultaneous streams + * + * This function sets the default value of the "max_simultaneous_read_files" field of + * the CriMvStreamingParameters struct. Currently, setting this value has no effect. + */ +//void CRIAPI criMvPly_SetMaxSimultaneousStreams(CriMvPly mvply, CriUint32 max_stm); + +/* サウンド出力バッファサンプル数の設定 */ +/* + * \brief GetWave16で要求する最大サンプル数の設定 + * \param mvply : CRI Movie ハンドル + * \param max_smpl : 最大サンプル数 + * \return なし + * \par 説明: + * CriMvAudioParameters構造体のメンバoutput_buffer_samplesのデフォルト値を設定します。
+ * criMvPly_GetStreamingParameters関数で CriMvStreamingParameters構造体を取得したときにこの値が格納されます。
+ * 何も設定していない場合、output_buffer_samplesには16*1024が入っています。 + */ +/* + * \ingroup MODULE_AUDIO + * \brief Set default sound output buffer samples + * \param mvply A valid CriMvPly handle + * \param smpls : sound output buffer samples + * + * This function sets the default value of the "output_buffer_samples" field in the + * CriMvAudioParameters struct. The default value is 16384, which is set when + * criMvPly_Create() is called. + * + * This function only has an effect if it is called before the + * criMvPly_AllocateWorkBuffer() function is called, since this is when the audio + * output buffer is allocated. + * + * \sa CriMvAudioParameters, criMvPly_Create(), criMvPly_AllocateWorkBuffer(), + * criMvPly_GetWave16() + */ +//void criMvPly_SetMaxSamplesOfGetWave16(CriMvPly mvply, CriUint32 max_smpl); +void CRIAPI criMvPly_SetSoundOutputBufferSamples(CriMvPly mvply, CriUint32 smpls); + +/* ハンドル状態の取得 */ +/* + * \brief ハンドル状態の取得 + * \param mvply : CRI Movie ハンドル + * \return ハンドル状態 + * \par 説明: + * ハンドル状態を取得します。 + */ +/* + * \ingroup MODULE_STATE + * \brief Get the handle status + * \param mvply A valid CriMvPly handle + * \return One of the CriMvPlyStatus enum values + * + * This function gets the current status of the CRI Movie handle. Check the + * following link for possible return values. + * + * \sa CriMvPlyStatus + */ +CriMvPlyStatus CRIAPI criMvPly_GetStatus(CriMvPly mvply); + +/* WAIT状態から次の状態への遷移通知 */ +/* + * \brief WAIT状態から次の状態への遷移通知 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * ハンドル状態をWAIT_**** 状態から次の状態に遷移させます。状態に応じて次のように使用します。
+ * ・WAIT_PREP 状態 : criMvPly_AllocateWorkBuffer関数でワークを確保しおわったら呼び出してください。
+ * ・WAIT_PLAYING 状態 : ビデオフレーム、オーディオデータを取得して表示・出力の準備ができたら、 + * 出力を開始して、本関数を呼び出してください。
+ * ・WAIT_PLAYEND 状態 : 最後のビデオフレームの表示、最後のオーディオデータの出力が終了したら呼び出してください。
+ * ・WAIT_STOP 状態 : ビデオやオーディオの出力が停止してもいい状態になったら、呼び出してください。
+ * 本関数を呼び出すと各状態は即座に次の状態に遷移します。
+ * 本関数を WAIT_**** 以外の状態で呼び出しても、状態は何も変わりません。 + */ +/* + * \ingroup MODULE_STATE + * \brief Notify transition from WAIT status + * \param mvply A valid CriMvPly handle + * + * This function notifies the CriMvPly handle that your application is ready to + * go from the current WAIT state to the next state. There are exactly four states + * in which it is appropriate to call this function: + * + * - CRIMVPLY_STATUS_WAIT_PREP After your application has allocated buffers with + * criMvPly_AllocateWorkBuffer() + * - CRIMVPLY_STATUS_WAIT_PLAYING After your application has prerolled stream data (if + * necessary) + * - CRIMVPLY_STATUS_WAIT_PLAYEND After your application has displayed the last frames of audio and + * video from the stream + * - CRIMVPLY_STATUS_WAIT_STOP After your application suspends playback from the stream + * + * You can check the current status of the CriMvPly handle by calling the criMvPly_GetStatus() + * function. This function has no effect if called in states other than those listed above. + * + * \sa CriMvPly, CriMvPlyStatus + */ +void CRIAPI criMvPly_IncrementState(CriMvPly mvply); + +/* 状態の更新 */ +/* + * \brief CriMvPlyモジュールのサーバ関数 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * 主にデマルチプレクサ内部のデータの更新を行います。
+ * 本関数はアプリケーションのメインスレッド側でで毎回呼び出すようにしてください。
+ */ +void CRIAPI criMvPly_Update(CriMvPly mvply); + +/* 再生開始 */ +/* + * \brief 再生開始 + * \param mvply : CRI Movie ハンドル + * \return 再生開始できた場合はCRI_TRUE, 失敗した場合はCRI_FALSE + * \par 説明: + * 再生のための処理を開始します。
+ * 本関数呼出し後、ハンドル状態はDECHDRに遷移します。
+ */ +/* + * \ingroup MODULE_STATE + * \brief Start of playback processing + * \param mvply A valid CriMvPly handle + * + * This function initiates playback processing. This function should be called + * after the CriMvPly handle is created and the data source has been opened, + * but before the work buffers are allocated with criMvPly_AllocateWorkBuffer(). + * This function sets the current status of the CriMvPly handle to + * CRIMVPLY_STATUS_DECHDR, which prepares it to decode the header information + * from the data source. + * + * \sa CriMvPly, CriMvPlyStatus, criMvPly_AllocateWorkBuffer() + */ +CriBool CRIAPI criMvPly_Start(CriMvPly mvply); + +/* 再生停止リクエスト(即時復帰) */ +/* + * \brief 再生停止リクエスト(即時復帰) + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * 再生停止のリクエストを発行して即時復帰します。
+ * 本関数呼出し後、ハンドル状態はSTOP_PROCESSING状態に遷移します。
+ * 停止のための処理が終わると、ハンドル状態がWAIT_STOPに遷移します。
+ * WAIT_STOP状態になったら、criMvPly_IncrementState関数でSTOP状態に遷移させて、 + * アプリケーションの停止処理を行ってください。 + */ +/* + * \ingroup MODULE_STATE + * \brief Non-blocking request to stop playback + * \param mvply A currently playing CriMvPly handle + * + * This function records a request to terminate playback. Termination of + * playback is not synchronous to this function; this function sets the current + * state of the CriMvPly handle to CRIMVPLY_STATUS_STOP_PROCESSING. After + * movie processing is halted, the state of the handle transitions to + * CRIMWPLY_STATUS_WAIT_STOP. + * + * This function is useful for prematurely terminating a movie, e.g. "press + * X to skip this movie". + * + * Video frames will keep being delivered until you detect a CRIMVPLY_STATUS_WAIT_STOP + * state in the CriMvPly handle, and then call criMvPly_IncrementState to transition + * back to the CRIMVPLY_STATUS_STOP state. + * + * \note Pausing is not accomplished through this function. The system clock, including + * whether or not to pause or advance frames, is controlled entirely through user + * code. So the effect of "pausing" a CriMvPly handle can be accomplished by simply + * not updating your system clock as long as your pause is in effect. + * + * \sa CriMvPly, CriMvPlyStatus + */ +void CRIAPI criMvPly_Stop(CriMvPly mvply); + +/* サーバ処理(ハンドル指定) */ +/* + * \brief サーバ処理(ハンドル指定) + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * CRI Movie ハンドルを指定してサーバ処理を実行します。
+ * 各WAIT_**** 状態への状態遷移はサーバ関数内で実行されます。 + */ +/* + * \ingroup MODULE_VIDEO + * \brief Execute heartbeat functions for a handle + * \param mvply A valid CriMvPly handle + * + * This function executes heartbeat functions for the specified CriMvPly handle only, + * including handoff and parsing of input buffers and audio decoding. Additionally, + * it checks for buffer situations in which the CriMvPly handle should transition to + * one of the four WAIT states of CriMvPlyStatus, and it makes these transitions if + * necessary. + * + * However, video decoding does NOT occur in criMvPly_Execute(). + * + * Expect that criMvPly_Execute() will take a relatively low CPU load. Typically, + * this function should be called on every vertical blank. However, it may be called + * more frequently in a CriMvPly wait state, in conjunction with criMvPly_IncrementState(), + * in order to "force" a transition into the next state without waiting for + * another vertical blank. This type of transition is not generically + * necessary. + * + * \sa CriMvPly, CriMvPlyStatus, criMvPly_ExecuteAll() + */ +void CRIAPI criMvPly_Execute(CriMvPly mvply); + +/* ファイル読み込みバッファの空きチャンク取得 */ +/* + * \brief ファイル読み込みバッファの空きチャンク取得 + * \param mvply : CRI Movie ハンドル + * \param ck : チャンク + * \return なし + * \par 説明: + * ファイル読み込みバッファの空き領域を取得します。
+ * 取得した空き領域(チャンクと呼びます)は、データ書き込みを通知するさいに + * そのまま使用しますので、アプリケーションで記憶してください。
+ * 1度に取得できるチャンクは1つのみです。
+ * チャンクが取得できたか否かは、チャンクのサイズで判定できます。
+ * データの書き込みが終わったら、criMvPly_PutInputChunk関数で書き込みサイズを通知してください。
+ */ +/* + * \ingroup MODULE_SUPPLY + * \brief Get a free chunk from file reading buffer + * \param mvply A valid CriMvPly handle + * \param ck A CriChunk structure to be filled with data by this function + * + * This function selects an empty internal buffer for your data source to read its data into. + * An area of this type is referred to as a "chunk." + * After calling this function, the ck->data and ck->size + * fields will provide a valid pointer and size, respectively, that your data + * source should copy its data into. + * If no buffers can internally be allocated, this function will return 0 as the + * ck->size field. If this occurs, your program should choke input until a free + * buffer can be allocated. + * Typical data sources are native file reading, sequential memory access, or + * playback from a network source. + * The ck->size field is dynamically calculated when criMvPly_AllocateWorkBuffer() + * is called; it is calculated based on expected data rate and video resolutions + * embedded in the stream file. + * + * After you receive a valid chunk from criMvPly_GetInputChunk(), + * you can fill the provided chunk up to the ck->size limit. After you + * fill the chunk with valid data, call the criMvPly_PutInputChunk() function + * to queue the data for processing. The functions criMvPly_GetInputChunk() and + * criMvPly_PutInputChunk() should be called in equal pairs; calling these + * functions out of order will produce odd results. No dynamic chunk reordering + * is permitted; serial calls with out-of-order chunks will be + * flagged at run-time as an error. + * + * This function will only return a valid chunk if the CriMvPly handle is in + * one of two playback states: CRIMVPLY_STATUS_PLAY or CRIMVPLY_STATUS_DECHDR. + * You can verify the current playback state with criMvPly_GetStatus(). + * + * \sa criMvPly_GetStatus(), criMvPly_PutInputChunk(), criMvPly_AllocateWorkBuffer(), + * CriChunk, CriMvPlyStatus + */ +void CRIAPI criMvPly_GetInputChunk(CriMvPly mvply, CriChunk *ck); + +/* ファイル読み込みバッファへのデータ書き込み通知 */ +/* + * \brief ファイル読み込みバッファへのデータ書き込み通知 + * \param mvply : CRI Movie ハンドル + * \param ck : + * \param inputsize : + * \return なし + * \par 説明: + * criMvPly_GetInputChunk関数で取得した空き領域(チャンクと呼びます)に + * データを書き込み終わったら、引数inputsizeにデータサイズを入れて本関数を呼び出してください。
+ * その際、チャンクは criMvPly_GetInputChunk関数で取得したものと同じチャンクを必ず指定してください。 + */ +/* + * \ingroup MODULE_SUPPLY + * \brief Put a data chunk into file read buffer + * \param mvply A valid CriMvPly handle + * \param ck A CriChunk structure containing source data + * \param inputsize The number of bytes actually supplied + * + * This function informs the CriMvPly handle that the CriChunk structure + * now contains valid data from the data source. Typically, you would call + * this function after your asynchronous file read reports that the buffer is + * full of data. + * + * The inputsize field should contain the number of bytes actually provided. + * This value can be less than or equal to ck->size. In an end-of-file condition, + * be sure to supply the actual number of bytes remaining in the file, and not + * merely the size of the input buffer, to criMvPly_PutInputChunk(). + * Do not modify the contents of the CriChunk after calling this function; + * instead, call criMvPly_GetInputChunk() to get a new chunk for further input. + * + * This function invalidates the CriChunk provided if the function is called + * while the CriMvPly handle is in the CRIMVPLY_STATUS_STOP, the + * CRIMVPLY_STATUS_WAIT_PREP, or the CRIMVPLY_STATUS_STOP_PROCESSING state. + * You can verify the current playback state with criMvPly_GetStatus(). + * + * After you receive a valid chunk from criMvPly_GetInputChunk(), + * you can fill the provided chunk up to the ck->size limit. After you call + * fill the chunk with valid data, call the criMvPly_PutInputChunk() function + * to queue the data for processing. The function criMvPly_GetInputChunk() and + * criMvPly_PutInputChunk() should be called in equal pairs; calling these + * functions out of order will produce odd results. No dynamic chunk reordering + * is permitted; serial calls with out-of-order chunks will be + * flagged at run-time as an error. + * + * After putting the final chunk of data in the stream, call + * criMvPly_TerminateSupply() to indicate that an end-of-file condition exists. + * + * \sa criMvPly_GetStatus(), criMvPly_GetInputChunk(), criMvPly_AllocateWorkBuffer(), + * criMvPly_TerminateSupply(), CriChunk, CriMvPlyStatus + */ +void CRIAPI criMvPly_PutInputChunk(CriMvPly mvply, CriChunk *ck, CriUint32 inputsize); + +/* ファイル読み込み終了の通知 */ +/* + * \brief ファイル読み込み終了の通知 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * 再生したい全てのデータを読み込んで、 criMvPly_PutInputChunk関数で通知し終わったら、 + * 本関数でファイル読み込み終了の通知を必ず行ってください。
+ * 終了を通知された時点で読み込みバッファに書き込まれた全てのデータをデコードし終わると、 + * ハンドル状態はWAIT_PLAYENDに遷移します。
+ * 本関数を呼び出さない限り、WAIT_PLAYEND状態になることはありません。 + */ +/* + * \ingroup MODULE_SUPPLY + * \brief Notify end of reading data + * \param mvply A valid CriMvPly structure + * + * After you put all the source data into the CriMvPly handle with + * criMvPly_PutInputChunk(), indicate the end of the movie file by calling + * criMvPly_TerminateSupply(). After calling this function, the CriMvPly + * handle's status is changed by the library to CRIMVPLY_STATUS_WAIT_PLAYEND + * and the library completes processing of whatever frames it has internally + * buffered. + * + * If you do not call this function, the CriMvPly handle will never transition + * to the CRIMVPLY_STATUS_WAIT_PLAYEND state, making teardown impossible. + * + * \sa criMvPly_PutInputChunk(), CriMvPly, CriMvPlyStatus + */ +void CRIAPI criMvPly_TerminateSupply(CriMvPly mvply); + +#if 0//defined(XPT_TGT_EE) +/* RGB32フォーマットのビデオフレームの取得 */ +/* + * \if ps2 + * \brief RGB32フォーマットのビデオフレームの取得 + * \param mvply : CRI Movie ハンドル + * \param imagebuf : ビデオフレームバッファ + * \param bufsize : バッファサイズ + * \param frameinfo : フレーム情報 + * \return 取得できた場合はTRUE, できなかった場合はFALSE + * \par 説明: + * 引数で指定したバッファに、PS2のマクロブロック並びRGBA32フォーマットでフレームを取得します。
+ * 引数CriMvFrameInfo構造体には、取得したフレームについての情報が格納されます。
+ * フレームが取得できるのは、ハンドル状態がWAIT_PLAYING/PLAYINGの時のみです。
+ * それ以外の状態で呼び出す、または入力データ不足の場合には、本関数はフレームの取得に失敗し、即座に復帰します。
+ * フレームが取得できなかった場合は、関数値でFALSEが返ります。
+ * 実際のビデオデコード処理も本関数内で動くため、フレーム取得できる場合には、処理の重い関数となります。 + * \endif + */ +/* + * \if ps2 + * \ingroup MODULE_VIDEO + * \brief Get a video frame in PS2 macroblock RGB32 format + * \param mvply A valid CriMvPly handle + * \param imagebuf a pointer to the video buffer in memory to receive the frame + * \param bufsize video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * The format of this buffer is specific to the PS2. This function will only return + * a valid frame if the CriMvPly handle is in the CRIMVPLY_STATUS_WAIT_PLAYING or the + * CRIMVPLY_STATUS_PLAYING state. + * + * This function is an EE-intensive activity, and the amount of time required + * is variable, depending on the complexity and size of the video frame being decoded. + * Therefore the preferred method of calling this function is in a low priority thread, + * separate from your I/O, buffer management, and criMvPly_Execute() routines. + * + * If this function returns true, the preferred display time of the video frame is calculated + * as: + * + * \code + * frameinfo.time / frameinfo.tunit + * \endcode + * + * Humans notice audio stuttering much more readily than a dropped video frame during + * a video decode process. If the frame reported by criMvPly_GetFrameRGBA32_PS2() + * arrives after your system clock says the frame should be displayed, you should + * simply drop the frame without bothering to DMA it to video memory. + * + * Here is an example showing how to drop frames in this case: + * + * \dontinclude crimvt01_simple_playback_ps2.c + * \skip Get video frame + * \until *tutor_update_video_frame_on_display_time* + * + * It is not preferred, but it is possible, to call this function in a single-threaded + * playback model. In this case, it is important to allocate more heap space + * and service the CriMvPly handle with criMvPly_Execute() or criMvPly_ExecuteAll() + * frequently, as well as criMvPly_GetWave16() frequently. This helps to cover + * for the case where other I/O needs to occur when a frame is currently being decoded by + * criMvPly_GetFrameRGBA32_PS2(). + * + * \image html crimvply_getframergba32_ps2.png The DMA reordering step on PS2 + * + * In order to get acceptable performance on the PS2, a macroblock reordering step + * must take place during the DMA transfer from EE RAM to video RAM. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameRGBA32_PS2(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 bufsize, CriMvFrameInfo *frameinfo); + +CriBool CRIAPI criMvPly_DecodeFrameRGBA32_PS2(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +#endif + +#if defined(XPT_TGT_PC) || defined(XPT_TGT_XBOX360) || defined(XPT_TGT_WII) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) +/* + * \if pc + * \ingroup MODULE_VIDEO + * \brief Get a video frame in YUV422 format + * \param mvply A valid CriMvPly handle + * \param imagebuf A pointer to the video buffer in memory to receive the frame + * \param pitch Number of bytes in one row of the video buffer + * \param bufsize Video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * + * This function is a CPU-intensive activity, and the amount of time required + * is variable, depending on the complexity and size of the video frame being decoded. + * Therefore the preferred method of calling this function is in a low priority thread, + * separate from your I/O, buffer management, and criMvPly_Execute() routines. + * + * If this function returns true, the preferred display time of the video frame is calculated + * as: + * + * \code + * frameinfo.time / frameinfo.tunit + * \endcode + * + * It is not preferred, but it is possible, to call this function in a single-threaded + * playback model. In this case, it is important to allocate more heap space + * and service the CriMvPly handle with criMvPly_Execute() or criMvPly_ExecuteAll() + * frequently, as well as criMvPly_GetWave16() frequently. + * + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameYUV422(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +#endif + +/* 16bit WAVEフォーマットのオーディオデータ取得 */ +/* + * \brief 16bit WAVEフォーマットのオーディオデータ取得 + * \param mvply : CRI Movie ハンドル + * \param nch : チャネル数 + * \param waveptr : オーディオデータバッファ + * \param wavesmpl : 要求サンプル数(<バッファサイズ) + * \param waveinfo : 16bit Waveform 情報 + * \return 取得できたサンプル数 + * \par 説明: + * 16bitのWAVEフォーマットでオーディオデータを取得します。引数waveptrには、nch分のバッファポインタを格納した + * 配列を指定してください。
+ * 引数CriMvWaveInfo構造体には、取得したオーディオデータについての情報が格納されます。
+ * 入力データ不足などで要求されたサンプル数のデコードができない場合もあります。
+ * (未実装機能) 本関数の処理が重くなってでも、なるべく要求された多くのオーディオデータを取得するモード。 + */ +/* + * \ingroup MODULE_AUDIO + * \brief Get 16bit wave audio data + * \param mvply A currently playing CriMvPly handle + * \param nch The number of audio channels to get in this call + * \param waveptr An array of audio data buffers to copy audio data into + * \param wavesmpl The number of requested wave data samples (must be less than buffer size) + * \param waveinfo A structure filled by this function with info about this wave + * \return The number of wave data samples actually copied into the buffer + * + * This function copies currently decoding audio data into your output buffer + * for you to send to the audio output. The output format is a sixteen-bit PCM + * format. The data provided is "current", e.g. you should try to minimize latency. + * while delivering the audio data to the output device. + * + * This function will return an empty audio buffer if the input to the CriMvPly + * handle is starving for data, or if criMvPly_Execute() or criMvPly_ExecuteAll() + * has not been called recently. + * + * Note that this function actually copies data. However, the expected bandwidth + * for moving audio data in memory is minimal -- about 176400 bytes per second for + * a stereo stream, which is typically a fraction of 1% of the bandwidth available + * on modern game systems. + * + * For debugging tips on stuttering, see \ref crim_section_stuttering . + */ +CriUint32 CRIAPI criMvPly_GetWave16(CriMvPly mvply, CriUint32 nch, CriSint16 *waveptr[], + CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); +CriUint32 CRIAPI criMvPly_GetWave32(CriMvPly mvply, CriUint32 nch, CriFloat32 *waveptr[], + CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); + + +#if defined(XPT_TGT_EE) +/* スクラッチパッドRAM使用設定 */ +/* スクラッチパッドRAMの使用設定(ハンドル作成前に呼び出すこと) */ +/* + * \brief スクラッチパッドRAM使用設定 + * \param sw : + * \return なし + * \par 説明: + * スクラッチパッドRAMの使用設定を行います。
+ * デフォルトはOFFです。 + */ +/* + * \if ps2 + * \ingroup MODULE_INIT + * \brief Enable or disable PS2 scratch pad (SPRAM) usage + * \param sw : ON to enable scratch pad use, OFF to disable + * + * This function determines whether the video decode step uses the PS2 + * SPRAM memory area for its work. The performance of this library is + * increased by around 30% when using SPRAM; however, this use might + * conflict with graphics engines that depend on exclusive access to SPRAM. + * However, on the PS2, the video decode step occurs synchronously to the + * criMvPly_GetFrameRGBA32_PS2() function, so you can take appropriate external + * locking measures to intelligently synchronize SPRAM utilization. + * The value set by criMvPly_SetUseScratchPadRAM_PS2() is internally checked + * exactly once, during the criMvPly_Create() step; calling this function + * after criMvPly_Create() has no effect. The default setting for this + * function is OFF. + * \endif + */ +void CRIAPI criMvPly_SetUseScratchPadRAM_PS2(CriBool sw); +#endif + + +/* メモリからの再生開始 */ +/* + * \brief メモリからの再生開始 + * \param mvply : CRI Movie ハンドル + * \param memptr : メモリ上のムービデータの先頭アドレス + * \param memsize : メモリ上のムービデータのサイズ + * \return なし + * \par 説明: + * メモリからのムービ再生を開始します。
+ * 本関数の呼び出し前に、あらかじめムービデータの全てをメモリ上に読み込んでおいてください。 + */ +/* + * \ingroup MODULE_STATE + * \brief Start playback from movie file on memory + * \param mvply A currently playing CriMvPly handle + * \param memptr A address of movie file + * \param memsize The size of movie file + * + * Start playback from memory.
+ * Please read movie file to memory before playback. + */ +void CRIAPI criMvPly_StartMemory(CriMvPly mvply, CriUint8* memptr, CriUint32 memsize); + + +/* + * YUV個別バッファへのフレーム取得 + */ +/* + * \if xbox360 + * \ingroup MODULE_VIDEO + * \brief Get a video frame to Y,U,V independently texture buffers + * \param mvply A valid CriMvPly handle + * \param yuvbuffers Information about Y,U,V independently texture buffers + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the Y,U,V texture buffers. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameYUVBuffers(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, CriMvFrameInfo *frameinfo); + + +/* + * ビデオのデコード + */ +/* + * \ingroup MODULE_VIDEO + * \param mvply The movie player handle + * \return returns the number of decoded frames + * + */ +CriUint32 CRIAPI criMvPly_DecodeVideo(CriMvPly mvply); + +/* + * ヘッダのデコード + */ +/* + * + * \ingroup MODULE_VIDEO + * \param mvply The movie player handle + * + */ +void CRIAPI criMvPly_DecodeHeader(CriMvPly mvply); + +/* + * デコードスキップ指示 + * \par 説明: + * この関数を実行した回数だけ、その後のデコード時に自動的に1枚Bピクチャをスキップする。
+ * スキップ指示を出した次のフレームからは、実際のスキップが実行されていなくても + * 表示時刻はスキップしたものとして補正される。 + */ +/* + * \ingroup MODULE_VIDEO + * \param mvply The movie player handle + * \return returns the number of decoded frames + * + * After calling SkipFrame function, Decoding function skip B-picture. + * To avoid that application judge continuous wrong skip, After calling + * SkipFrame function, next frame time will be adjusted. + */ +void CRIAPI criMvPly_SkipFrame(CriMvPly mvply); + + +#if 0 +/* + * YUVA8フォーマットのフレーム取得 + */ +/* + * \if ps3 + * \ingroup MODULE_VIDEO + * \brief Get a video frame in YUVA8 format. + * \param mvply A valid CriMvPly handle + * \param imagebuf A pointer to the video buffer in memory to receive the frame + * \param pitch Number of bytes in one row of the video buffer + * \param bufsize Video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameYUVA8_PS3(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +#endif + +/* + * ARGB8888フォーマットでフレーム取得 + */ +/* + * \if ps3 + * \ingroup MODULE_VIDEO + * \brief Get a video frame in ARGB8888 format. + * \param mvply A valid CriMvPly handle + * \param imagebuf A pointer to the video buffer in memory to receive the frame + * \param pitch Number of bytes in one row of the video buffer + * \param bufsize Video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameARGB8888(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +void CRIAPI criMvPly_InitializeFrameARGB8888(void); + + +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) +/* + * RGB565フォーマットでフレーム取得 + */ +/* + * \ingroup MODULE_VIDEO + * \brief Get a video frame in RGB565 format + */ +CriBool CRIAPI criMvPly_GetFrameRGB565(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +void CRIAPI criMvPly_InitializeFrameRGB565(void); +#endif + +/* + * 次のフレームの情報だけ取得する + */ +/* + * \ingroup MODULE_VIDEO + * \brief Get a information of next video frame (without actual video frame). + */ +CriUint8* CRIAPI criMvPly_GetNextFrameInfo(CriMvPly mvply, CriMvFrameInfo *frameinfo); + +/* + * 次のフレームを捨てる + */ +CriBool CRIAPI criMvPly_DiscardNextFrame(CriMvPly mvply, CriMvFrameInfo *frameinfo); + +/* + * 再生準備完了状態(PREPからWAIT_PLAYING)になるまでに貯金するフレーム数の指定 + * この関数を呼び出さなければ、貯金フレーム数 = フレームプール数 + */ +void CRIAPI criMvPly_SetNumberOfFramesForPrep(CriMvPly mvply, CriSint32 nframes); + +/* + * For Debug use. + */ +void CRIAPI criMvPly_SetSeekPosition(CriMvPly mvply, CriSint32 seek_frame_id, CriSint32 video_gop_top_id); +void CRIAPI criMvPly_SetSeekAlphaPosition(CriMvPly mvply, CriSint32 alpha_gop_top_id); +void CRIAPI criMvPly_CalcSeekPosition(CriMvPly mvply, void *seektbl_ptr, CriUint32 seektbl_size, Sint32 frame_id, Uint64 *offset, Sint32 *gop_top_id); + +/* for specific use */ +/* ボディアドレスの設定 */ +void CRIAPI criMvPly_SetBodyData(CriMvPly mvply, const CriUint64Adr body_ptr, CriSint64 body_size); + +/* 入力SJおよびバッファサイズの取得(バッファサイズ、リロードサイズはNULL指定で省略) */ +CriSj CRIAPI criMvPly_GetInputSj(CriMvPly mvply, CriUint32 *buffer_size, CriUint32 *reload_threshold); + +/* 名前&タイプ指定によるイベントポイント情報の取得 */ +//Bool criMvPly_SearchEventPointByName(CriMvPly mvply, Char8 *cue_name, Sint32 type, CriMvEventPoint *eventinfo); +/* イベントポイント情報からフレームIDへの変換 */ +//Sint32 criMvPly_CalcFrameIdFromCuePoint(CriMvPly mvply, CriMvEventPoint *eventinfo); + +CriBool CRIAPI criMvPly_AttachSubAudio(CriMvPly mvply, CriHeap heap, CriUint32 track); +CriUint32 CRIAPI criMvPly_GetSubAudioWave16(CriMvPly mvply, CriUint32 nch, CriSint16 *waveptr[], CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); +CriUint32 CRIAPI criMvPly_GetSubAudioWave32(CriMvPly mvply, CriUint32 nch, CriFloat32 *waveptr[], CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); +void CRIAPI criMvPly_DetachSubAudio(CriMvPly mvply); + +void CRIAPI criMvPly_GetSubtitle(CriMvPly mvply, CriUint8 *bufptr, CriUint32 bufsize, CriMvSubtitleInfo *info); +void CRIAPI criMvPly_GetNextSubtitleInfo(CriMvPly mvply, CriMvSubtitleInfo *info); + +/* 入力バッファのデータ量を見る[byte] */ +CriUint32 CRIAPI criMvPly_PeekInputBufferData(CriMvPly mvply); +/* メモリ上のムービを入力SJに追加する */ +void CRIAPI criMvPly_AddInputMemory(CriMvPly mvply, CriUint8* memptr, CriUint32 memsize); + + +/* 取得できるオーディオデータのサンプル数を調べる */ +CriUint32 CRIAPI criMvPly_GetDataSizeMainAudio(CriMvPly mvply, CriUint32 nch); +/* 取得できるオーディオデータのサンプル数を調べる */ +CriUint32 CRIAPI criMvPly_GetDataSizeSubAudio(CriMvPly mvply, CriUint32 nch); + +/* メインのオーディオの再生が終了しているかどうかを調べる */ +CriBool CRIAPI criMvPly_IsEndMainAudioPlayback(CriMvPly mvply); +/* サブのオーディオの再生が終了しているかどうかを調べる */ +CriBool CRIAPI criMvPly_IsEndSubAudioPlayback(CriMvPly mvply); + +/* メインオーディオが活動中かどうかを調べる (デコード中かつ出力バッファがある状態) */ +CriBool CRIAPI criMvPly_IsActiveMainAudioPlayback(CriMvPly mvply); + +/* ワーク確保前に設定変更すること */ +void CRIAPI criMvPly_SetPcmFormat(CriMvPly mvply, CriMvPcmFormat pcmfmt); + +#if defined(XPT_TGT_PC) +/* [PC] マルチプロセッサの指定 */ +void CRIAPI criMvPly_SetProcessorParameters_PC(CriMvPly mvply, Sint32 thread_num, Uint32 *affinity_masks, Sint32 *priorities); +#endif + +#if defined(XPT_TGT_WIIU) +/* */ +void criMvPly_SetMultiCoreDecode_WIIU(CriBool sw); +#endif + +#if defined(XPT_TGT_XBOX360) +/* [Xbox360] マルチプロセッサの指定 */ +void CRIAPI criMvPly_SetProcessorParameters_XBOX360(CriMvPly mvply, Sint32 thread_num, CriUint32 processor_mask, CriSint32 *priorities); +#endif + +#if defined(XPT_TGT_PS3PPU) +/* [PS3] SPURSの指定 */ +void CRIAPI criMvPly_SetupSpursParameters_PS3(CriMvProcessorParameters_PS3 *processor_param); + /* [PS3] SPUスレッドによるマルチプロセッサの指定 */ +void CRIAPI criMvPly_SetupSpuThreadParameters_PS3(CriMvSpuThreadParameters_PS3 *spu_thread_param); +#endif + +#if defined(XPT_TGT_PS3PPU) +void CRIAPI criMvPly_SetGraphicEnv(CriMvGraphicEnv env); +CriMvGraphicEnv CRIAPI criMvPly_GetGraphicEnv(void); +#endif + +/* フレームプール情報の取得 */ +void CRIAPI criMvPly_GetFramePoolInfo(CriMvPly mvply, CriSint32 *num_input, CriUint32* num_data, CriUint32* num_ref, CriUint32* num_hold, CriUint32* num_free); + +/* 再生中でも字幕チャネルを切り替える */ +void CRIAPI criMvPly_SetSubtitleChannel(CriMvPly mvply, CriSint32 chno); + +/* ポインタだけ取得してフレームプール内のバッファをロックする */ +CriBool CRIAPI criMvPly_LockFrameBuffer(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, CriMvFrameInfo *frameinfo); +/* ロックしていたフレームプールを解放する */ +CriBool CRIAPI criMvPly_UnlockFrameBuffer(CriMvPly mvply, CriMvFrameInfo *frameinfo); + +/* + * For Sofdec2 + */ +CriMvPly CRIAPI criMvPly_CreateWithWork(void *work, CriSint32 size, CriMvHandleConfig *config); +CriSint32 CRIAPI criMvPly_CalcHandleWorkSize(CriMvHandleConfig *config); +CriSint32 CRIAPI criMvPly_CalcPlaybackWorkSize(CriMvPly mvply, CriMvStreamingParameters *stmprm); +CriBool CRIAPI criMvPly_AllocateWorkBufferWithWork(CriMvPly mvply, void *work ,Sint32 work_size, CriMvStreamingParameters *stmprm); +void CRIAPI criMvPly_SetMetaDataWorkAllocator(CriMvPly mvply, CriMvMetaDataWorkMallocFunc allocfunc, CriMvMetaDataWorkFreeFunc freefunc, void *usrobj, CriMvMetaFlag meta_flag); +CriSint32 criMvPly_CalcSubAudioWorkSize(CriMvPly mvply, const CriMvAudioParameters *aprm); +CriBool criMvPly_CopyFrameYUVBuffers(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, + const CriMvFrameInfo *frameinfo,const CriMvAlphaFrameInfo *alpha_frameinfo); +CriBool criMvPly_CopyFrameARGB8888Buffer(CriMvPly mvply, CriUint8 *dst_buf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *src_bufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf); +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) || defined(XPT_TGT_TRGP6K) +CriBool criMvPly_CopyFrameRGB565Buffer(CriMvPly mvply, CriUint8 *dst_buf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *src_bufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf); +#endif +CriBool criMvPly_LockAlphaFrameBuffer(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, CriMvAlphaFrameInfo *alpha_frameinfo); +CriBool criMvPly_UnlockAlphaFrameBuffer(CriMvPly mvply, CriMvAlphaFrameInfo *alpha_frameinfo); +CriSint32 criMvPly_GetNumPictureData(CriMvPly mvply); +const CriMvPlyHeaderInfo* criMvPly_GetCurrentStreamInfo(CriMvPly mvply); +/* for debug */ +CriBool CRIAPI criMvPly_GetAlphaFrame(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriMvAlphaFrameInfo *alpha_frameinfo); + +/* OUTER_FRAMEPOOL_WORK */ +/* フレームプール用ワーク計算。ハンドルはNULL指定OK。 */ +CriSint32 criMvPly_CalcFramepoolWorkSize(CriMvPly mvply, const CriMvStreamingParameters *stmprm); +/* フレームプール用ワーク設定 */ +void criMvPly_SetFramepoolWork(CriMvPly mvply, void *work, CriSint32 work_size); +/* フレームプール用ワークアロケータ設定 */ +void criMvPly_SetFramepoolWorkAllocator(CriMvPly mvply, CriMvFramepoolWorkMallocFunc allocfunc, CriMvFramepoolWorkFreeFunc freefunc, void *usrobj); + +/* シークブロック情報の取得 */ +/* <入力> + * - seektbl_ptr : UTFアドレス + * - seektbl_size : UTFサイズ + * - num_seekblock : 出力配列の要素数 + * <出力> + * - blockinfo : シークブロック情報配列へのポインタ(num_seekblock分の領域を確保して渡すこと) + */ +void criMvPly_GetSeekBlockInfo(CriMvPly mvply, void *seektbl_ptr, CriUint32 seektbl_size, CriSint32 num_seekblock, CriMvSeekBlockInfo *blockinfo); + +/* フレームレートの強制指定 */ +void criMvPly_SetVideoFramerate(CriMvPly mvply, CriUint32 framerate_n, CriUint32 framerate_d); + +/* 同期有無の設定 */ +void criMvPly_SetSyncFlag(CriMvPly mvply, CriBool sync_flag); + +/* 再生可能かの問い合わせ */ +CriBool criMvPly_IsPlayable(CriMvPly mvply, const CriMvStreamingParameters *stmprm); + +#ifdef __cplusplus +} +#endif + +#endif /* CRI_MOVIE_CORE_H_INCLUDED */ diff --git a/3rdParty/cri/Durango/include/cri_sj.h b/3rdParty/cri/Durango/include/cri_sj.h new file mode 100644 index 00000000..28b29424 --- /dev/null +++ b/3rdParty/cri/Durango/include/cri_sj.h @@ -0,0 +1,189 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2006-2010 CRI Middleware Co., Ltd. + * + ****************************************************************************/ + +#ifndef _CRI_SJ_H_INCLUDED +#define _CRI_SJ_H_INCLUDED +/**************************************************************************** + * * + * CRI Stream Joint "CriSj" Library * + * * + * 2005-06-21 written by M.Oshimi * + * * + ****************************************************************************/ + +/**************************************************************************** + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" +#include "cri_heap.h" + +/**************************************************************************** + * MACRO CONSTANT * + ****************************************************************************/ + +/* Version number of CriSj */ +#define CRISJ_NAME_STRINGS "CRI Stream Joint" +#define CRISJ_VERSION_STRINGS "1.01.00" + +#define CRISJUNI_MAX_LINE (4) +#define CRICHUNK_MAX_SIZE (0xffffffff) + +/*********************************************************************** + * Process MACRO + ***********************************************************************/ + +/**************************************************************************** + * Data type declaration * + ****************************************************************************/ + +/* ストリームライン */ +typedef enum { + CRISJ_LINE_FREE = (0), + CRISJ_LINE_DATA = (1), + CRISJ_LINE_HOLD = (2), + CRISJ_LINE_EXTRA = (3), + /* enum be 4bytes */ + CRISJ_LINE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriSjLine; + +/* チャンク */ +#ifndef TYPEDEF_CRICHUNK +#define TYPEDEF_CRICHUNK +typedef struct { + CriUint8 *data; /* データ */ + CriUint32 size; /* バイト数 */ +} CriChunk; +#endif + +/* CriSjハンドル */ +/* CriSj handle */ +typedef struct { + struct _crisj_function_table *vtbl; + const CriChar8 *name; +} CriSjObj, *CriSj; + +typedef struct _crisj_function_table { + /* ハンドルの消去 */ + void (*Destroy)(CriSj sj); + /* リセット */ + void (*Reset)(CriSj sj); + /* チャンクの取得 (FIFOの先頭から取得) */ + void (*GetChunk)(CriSj sj, CriSjLine id, CriUint32 nbyte, CriChunk *ck); + /* チャンクを戻す (FIFOの先頭に挿入) */ + void (*UngetChunk)(CriSj sj, CriSjLine id, CriChunk *ck); + /* チャンクを挿入 (FIFOの最後に挿入) */ + void (*PutChunk)(CriSj sj, CriSjLine id, CriChunk *ck); + /* ラインから取得できる総バイト数の取得 */ + CriUint32 (*GetTotalSize)(CriSj sj, CriSjLine id); +} CriSjVirtualFunctionTable; + +typedef enum { + CRISJ_UNIMODE_SEPARATE = (0), + CRISJ_UNIMODE_JOIN = (1), + /* enum be 4bytes */ + CRISJ_UNIMODE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriSjUniversalMode; + + +typedef struct CriSjRbfConfig { + CriBool use_cs; + CriUint32 buffer_size; + CriUint32 extra_size; + CriUint32 alignment; + const CriChar8 *buffer_name; +} CriSjRbfConfig; + +typedef struct CriSjMemConfig { + CriBool use_cs; + CriUint8 *data; + CriUint32 data_size; +} CriSjMemConfig; + +typedef struct CriSjUniConfig { + CriBool use_cs; + CriSjUniversalMode mode; + CriUint32 num_chunks; +} CriSjUniConfig; + +/**************************************************************************** + * Function Declaration * + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* リングバッファ型SJの作成 */ +CriSint32 CRIAPI criSjRbf_CalculateWorkSize(const CriSjRbfConfig* config); +CriSj CRIAPI criSjRbf_Create(const CriSjRbfConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjRbf_CreateByHeap(const CriSjRbfConfig *config, CriHeap heap, CriHeapType heap_type); + +/* 常駐メモリ型SJの作成 */ +CriSint32 CRIAPI criSjMem_CalculateWorkSize(const CriSjMemConfig* config); +CriSj CRIAPI criSjMem_Create(const CriSjMemConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjMem_CreateByHeap(const CriSjMemConfig *config, CriHeap heap, CriHeapType heap_type); + +/* ユニバーサルSJの作成 */ +CriSint32 CRIAPI criSjUni_CalculateWorkSize(const CriSjUniConfig* config); +CriSj CRIAPI criSjUni_Create(const CriSjUniConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjUni_CreateByHeap(const CriSjUniConfig *config, CriHeap heap, CriHeapType heap_type); +/* チェインプール数の取得 */ +CriSint32 CRIAPI criSjUni_GetNumChainPool(CriSj sj); + +void CRIAPI criSj_Destroy(CriSj sj); +void CRIAPI criSj_Reset(CriSj sj); +void CRIAPI criSj_GetChunk(CriSj sj, CriSjLine line, CriUint32 nbyte, CriChunk *ck); +void CRIAPI criSj_UngetChunk(CriSj sj, CriSjLine line, CriChunk *ck); +void CRIAPI criSj_PutChunk(CriSj sj, CriSjLine line, CriChunk *ck); +CriUint32 CRIAPI criSj_GetTotalSize(CriSj sj, CriSjLine line); +void CRIAPI criSj_SplitChunk(CriChunk *ck, CriUint32 nbyte, CriChunk *ck1, CriChunk *ck2); + +/*** +* New APIs +***/ + +CriUint32 CRIAPI criSj_GetInputFreeSize(CriSj sj); +void CRIAPI criSj_GetInputChunk(CriSj sj, CriChunk *ck); +void CRIAPI criSj_PutInputChunk(CriSj sj, CriChunk *ck, CriUint32 input_size); +CriUint32 CRIAPI criSj_GetOutputDataSize(CriSj sj); +void CRIAPI criSj_GetOutputChunk(CriSj sj, CriChunk *ck); +void CRIAPI criSj_PutOutputChunk(CriSj sj, CriChunk *ck, CriUint32 output_size); + +CriUint32 CRIAPI criSj_PutOutputChunk2(CriSj sj, CriChunk *ck1, CriChunk *ck2, CriUint32 output_size); + + +/*** +* Old Interface (for compatibility) +***/ +typedef struct _CriSjConfig { + CriBool use_cs; + CriHeapType heap_type; +} CriSjConfig; + +CriSj CRIAPI criSj_CreateRingBuffer(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align); +CriSj CRIAPI criSj_CreateNamedRingBuffer(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriChar8 *bname); +CriSj CRIAPI criSj_CreateRingBufferWithConfig(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriSjConfig *config); +CriSj CRIAPI criSj_CreateNamedRingBufferWithConfig(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriChar8 *bname, const CriSjConfig *config); +CriSint32 CRIAPI criSjRbf_GetRequiredMemorySizeWithConfig(CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriSjConfig *config); + +CriSj CRIAPI criSj_CreateMemory(CriHeap heap, CriUint8 *data, CriUint32 dtsize, CriUint32 align); +CriSj CRIAPI criSj_CreateMemoryWithConfig(CriHeap heap, CriUint8 *data, CriUint32 dtsize, CriUint32 align, const CriSjConfig *config); +CriSint32 CRIAPI criSjMem_GetRequiredMemorySizeWithConfig(CriUint32 align, const CriSjConfig *config); + +CriSj CRIAPI criSj_CreateUniversal(CriHeap heap, CriSjUniversalMode mode, CriUint32 nchunk); +CriSj CRIAPI criSj_CreateUniversalWithConfig(CriHeap heap, CriSjUniversalMode mode, CriUint32 nchunk, const CriSjConfig *config); +CriSint32 CRIAPI criSjUni_GetRequiredMemorySizeWithConfig(CriSjUniversalMode mode, CriUint32 nchunk, const CriSjConfig *config); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif + +/* end of file */ diff --git a/3rdParty/cri/Durango/include/cri_xpt.h b/3rdParty/cri/Durango/include/cri_xpt.h new file mode 100644 index 00000000..56d5759b --- /dev/null +++ b/3rdParty/cri/Durango/include/cri_xpt.h @@ -0,0 +1,26 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2004-2009 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header for XboxOne + * File : cri_xpt.h + * Date : 2013-03-04 + * Version : 1.16 + * + ****************************************************************************/ +#ifndef CRI_INCL_CRI_XPT_H +#define CRI_INCL_CRI_XPT_H + +#define XPT_TGT_XBOXONE +#define XPT_CCS_LEND +#define XPT_SUPPORT_MULTICHANNEL +#define CRI_TARGET_STR "XboxOne" + +#include "cri_xpts_durango.h" +#include "cri_xpt_post.h" + +#endif /* CRI_INCL_CRI_XPT_H */ +/* End Of File */ diff --git a/3rdParty/cri/Durango/include/cri_xpt_post.h b/3rdParty/cri/Durango/include/cri_xpt_post.h new file mode 100644 index 00000000..de333b7b --- /dev/null +++ b/3rdParty/cri/Durango/include/cri_xpt_post.h @@ -0,0 +1,256 @@ +/***************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 1998-2012 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header / Post-Process + * File : cri_xpt_post.h + * Date : 2012-05-15 + * Version : 2.07 + * + *****************************************************************************/ +#ifndef CRI_INCL_CRI_XPT_POST_H +#define CRI_INCL_CRI_XPT_POST_H + + +/***************************************************************************** + * }N` + * Macro definition + *****************************************************************************/ + +/* RpC̐ÓIAT[g + * C++ BoostSTATIC_ASSERTƓ̋@\CŎB + * ^ł邱Ƃ؂BȔꍇ̓RpCG[NāAR + * pC~B + * Static Asart when compiling + * This function is equal to STATIC_ASSERT of C++ Boost, and is imprementated + * by C language. If the condition is false, a compiler error is caused and + * it stop compiling. + */ +#define XPT_STATIC_ASSERT(cond) extern int xpt_static_assert_array[(cond)?1:-1] + + +/***************************************************************************** + * RpCIvV̌ + * Compiler option test + *****************************************************************************/ + +/* enum^̌ + * @enum^int^ɐ邱Ƃ؂B + * @K؂ȃG[bZ[W\̂ŁA”\ȂRpCIvVɂ + * @`FbNsBs”\ȏꍇAėpIȐÓIAT[gɂ`FbNB + * Enum type test + * It is verified that the enum type adjusts to the int type. + * To display an appropriate error message, it checks the compiler option + * if possible. General static asart test works if it is impossible. + */ +#if defined(__MWERKS__) /* CodeWarrior */ + //#if !__option(enumsalwaysint) + // #error ERROR cri_xpt_post.h : Compiler option 'Enums Always Int' should be ON. + //#endif +#elif defined(__GNUC__) + //#if Compiler option -fshort-enums is used + // #error ERROR cri_xpt_post.h : Compiler option '-fshort-enums' should not be used. + //#endif +#endif +//typedef enum {XPT_TEST_ENUM_0, XPT_TEST_ENUM_1, XPT_TEST_ENUM_2} XptTestEnum; +//XPT_STATIC_ASSERT(sizeof(XptTestEnum) == sizeof(Uint32)); /* enum should be 4byte. */ + +/***************************************************************************** + * 萔}N + * Macros of constant value + *****************************************************************************/ + +/* NULL |C^^ */ +#if !defined(CRI_NULL) +#ifdef __cplusplus +#define CRI_NULL (0) +#else +#define CRI_NULL ((void *)0) +#endif +#endif + +/* _萔PiUA^j */ +#if !defined(CRI_FALSE) +#define CRI_FALSE (0) +#endif +#if !defined(CRI_TRUE) +#define CRI_TRUE (1) +#endif + +/* _萔QiXCb`j */ +#if !defined(CRI_OFF) +#define CRI_OFF (0) +#endif +#if !defined(CRI_ON) +#define CRI_ON (1) +#endif + +/* ʔ̒萔iAsj */ +#if !defined(CRI_OK) +#define CRI_OK (0) /* */ +#endif +#if !defined(CRI_NG) +#define CRI_NG (-1) /* s */ +#endif + +/***************************************************************************** + * |C^܂64rbgAhXi[ł鐮^ + * l: |C^32bitROMAhX64bit̊‹ŁA҂𓧉ߓIɈB + * The integer type which can hold an pointer or an address up to 64 bits. + * NOTE: In the environment of pointer 32bit and ROM address space 64bit, + * this type can treat both transparently. + *****************************************************************************/ + +#if !defined(_TYPEDEF_CriUint64Adr) +#define _TYPEDEF_CriUint64Adr +typedef CriUint64 CriUint64Adr; /* |C^܂64rbgAhXi[ł鐮^ */ +#endif + +#if !defined(CRI_PTR_TO_UINT64ADR) +#define CRI_PTR_TO_UINT64ADR(ptr) ((CriUint64Adr)(ptr)) /* Convert pointer to CriUint64Adr */ +#endif + +#if !defined(CRI_UINT64ADR_TO_PTR) +#define CRI_UINT64ADR_TO_PTR(uint64adr) ((void *)(CriUintPtr)(uint64adr)) /* Convert CriUint64Adr to pointer */ +#endif + +#if !defined(CRI_XPT_DISABLE_UNPREFIXED_TYPE) + +/***************************************************************************** + * ݊ێ̂߂̒萔}N + * Macros for compatibility with old version + *****************************************************************************/ + +/* NULL |C^^ */ +#if !defined(NULL) +#define NULL (CRI_NULL) +#endif + +/* _萔PiUA^j */ +#if !defined(FALSE) +#define FALSE (CRI_FALSE) +#endif +#if !defined(TRUE) +#define TRUE (CRI_TRUE) +#endif + +/* _萔QiXCb`j */ +#if !defined(OFF) +#define OFF (CRI_OFF) +#endif +#if !defined(ON) +#define ON (CRI_ON) +#endif + +/* ʔ̒萔iAsj */ +#if !defined(OK) +#define OK (CRI_OK) +#endif +#if !defined(NG) +#define NG (CRI_NG) +#endif + +/***************************************************************************** + * ݊ێ̂߂̃f[^^錾 + * Types for compatibility with old version + *****************************************************************************/ + +#if !defined(_TYPEDEF_Uint8) +#define _TYPEDEF_Uint8 +typedef CriUint8 Uint8; /* ȂPoCg */ +#endif + +#if !defined(_TYPEDEF_Sint8) +#define _TYPEDEF_Sint8 +typedef CriSint8 Sint8; /* ‚PoCg */ +#endif + +#if !defined(_TYPEDEF_Uint16) +#define _TYPEDEF_Uint16 +typedef CriUint16 Uint16; /* ȂQoCg */ +#endif + +#if !defined(_TYPEDEF_Sint16) +#define _TYPEDEF_Sint16 +typedef CriSint16 Sint16; /* ‚QoCg */ +#endif + +#if !defined(_TYPEDEF_Uint32) +#define _TYPEDEF_Uint32 +typedef CriUint32 Uint32; /* ȂSoCg */ +#endif + +#if !defined(_TYPEDEF_Sint32) +#define _TYPEDEF_Sint32 +typedef CriSint32 Sint32; /* ‚SoCg */ +#endif + +#if !defined(_TYPEDEF_Uint64) +#define _TYPEDEF_Uint64 +typedef CriUint64 Uint64; /* ȂWoCg */ +#endif + +#if !defined(_TYPEDEF_Sint64) +#define _TYPEDEF_Sint64 +typedef CriSint64 Sint64; /* ‚WoCg */ +#endif + +#if !defined(_TYPEDEF_Uint128) +#define _TYPEDEF_Uint128 +typedef CriUint128 Uint128; /* Ȃ16oCg */ +#endif + +#if !defined(_TYPEDEF_Sint128) +#define _TYPEDEF_Sint128 +typedef CriSint128 Sint128; /* ‚16oCg */ +#endif + +#if !defined(_TYPEDEF_Float16) +#define _TYPEDEF_Float16 +typedef CriFloat16 Float16; /* QoCg */ +#endif + +#if !defined(_TYPEDEF_Float32) +#define _TYPEDEF_Float32 +typedef CriFloat32 Float32; /* SoCg */ +#endif + +#if !defined(_TYPEDEF_Float64) +#define _TYPEDEF_Float64 +typedef CriFloat64 Float64; /* WoCg */ +#endif + +#if !defined(_TYPEDEF_Fixed32) +#define _TYPEDEF_Fixed32 +typedef CriFixed32 Fixed32; /* Œ菬_32rbg */ +#endif + +/* X11 APIixtrapproto.hjƂ̋p */ +#if !defined(_TYPEDEF_Bool) && !defined(Bool) +#define _TYPEDEF_Bool +typedef CriBool Bool; /* _^i_萔lɂƂj */ +#endif + +#if !defined(_TYPEDEF_Char8) +#define _TYPEDEF_Char8 +typedef CriChar8 Char8; /* ^ */ +#endif + +#if !defined(_TYPEDEF_SintPtr) +#define _TYPEDEF_SintPtr +typedef CriSintPtr SintPtr; +#endif + +#if !defined(_TYPEDEF_UintPtr) +#define _TYPEDEF_UintPtr +typedef CriUintPtr UintPtr; +#endif + +#endif /* CRI_XPT_DISABLE_UNPREFIXED_TYPE */ + +#endif /* CRI_INCL_CRI_XPT_POST_H */ + +/* end of file */ diff --git a/3rdParty/cri/Durango/include/cri_xpts_durango.h b/3rdParty/cri/Durango/include/cri_xpts_durango.h new file mode 100644 index 00000000..f2e676ab --- /dev/null +++ b/3rdParty/cri/Durango/include/cri_xpts_durango.h @@ -0,0 +1,132 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 1998-2011 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header for XboxOne + * File : cri_xpts_xboxone.h + * Date : 2013-03-04 + * Version : 2.05 + * + ****************************************************************************/ + +#ifndef CRI_INCL_CRI_XPTS_H +#define CRI_INCL_CRI_XPTS_H + +/***************************************************************************** + * 基本データ型宣言 + *****************************************************************************/ + +#if !defined(_TYPEDEF_CriUint8) +#define _TYPEDEF_CriUint8 +typedef unsigned __int8 CriUint8; /* 符号なし1バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriSint8) +#define _TYPEDEF_CriSint8 +typedef signed __int8 CriSint8; /* 符号つき1バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriUint16) +#define _TYPEDEF_CriUint16 +typedef unsigned __int16 CriUint16; /* 符号なし2バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriSint16) +#define _TYPEDEF_CriSint16 +typedef signed __int16 CriSint16; /* 符号つき2バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriUint32) +#define _TYPEDEF_CriUint32 +typedef unsigned __int32 CriUint32; /* 符号なし4バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriSint32) +#define _TYPEDEF_CriSint32 +typedef signed __int32 CriSint32; /* 符号つき4バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriUint64) +#define _TYPEDEF_CriUint64 +typedef unsigned __int64 CriUint64; /* 符号なし8バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriSint64) +#define _TYPEDEF_CriSint64 +typedef signed __int64 CriSint64; /* 符号つき8バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriUint128) +#define _TYPEDEF_CriUint128 +typedef struct { /* 符号なし16バイト整数 */ + CriUint64 h; /* 上位64ビット */ + CriUint64 l; /* 下位64ビット */ +} CriUint128; +#endif + +#if !defined(_TYPEDEF_CriSint128) +#define _TYPEDEF_CriSint128 +typedef struct { /* 符号つき16バイト整数 */ + CriSint64 h; /* 上位64ビット */ + CriUint64 l; /* 下位64ビット */ +} CriSint128; +#endif + +#if !defined(_TYPEDEF_CriFloat16) +#define _TYPEDEF_CriFloat16 +typedef signed __int16 CriFloat16; /* 2バイト実数 */ +#endif + +#if !defined(_TYPEDEF_CriFloat32) +#define _TYPEDEF_CriFloat32 +typedef float CriFloat32; /* 4バイト実数 */ +#endif + +#if !defined(_TYPEDEF_CriFloat64) +#define _TYPEDEF_CriFloat64 +typedef double CriFloat64; /* 8バイト実数 */ +#endif + +#if !defined(_TYPEDEF_CriFixed32) +#define _TYPEDEF_CriFixed32 +typedef signed __int32 CriFixed32; /* 固定小数点32ビット */ +#endif + +#if !defined(_TYPEDEF_CriBool) +#define _TYPEDEF_CriBool +typedef CriSint32 CriBool; /* 論理型(論理定数を値にとる) */ +#endif + +#if !defined(_TYPEDEF_CriChar8) +#define _TYPEDEF_CriChar8 +typedef char CriChar8; /* 文字型 */ +#endif + +/***************************************************************************** + * ポインタを格納可能な整数型 + *****************************************************************************/ + +#if !defined(_TYPEDEF_CriSintPtr) +#define _TYPEDEF_CriSintPtr +typedef signed __int64 CriSintPtr; +#endif + +#if !defined(_TYPEDEF_CriUintPtr) +#define _TYPEDEF_CriUintPtr +typedef unsigned __int64 CriUintPtr; +#endif + +/***************************************************************************** + * 呼び出し規約 + *****************************************************************************/ + +#if !defined(CRIAPI) +#define CRIAPI __cdecl +#endif + +#endif /* CRI_INCL_CRI_XPTS_H */ + +/* end of file */ diff --git a/3rdParty/cri/PS4/include/cri_allocator.h b/3rdParty/cri/PS4/include/cri_allocator.h new file mode 100644 index 00000000..e3c18997 --- /dev/null +++ b/3rdParty/cri/PS4/include/cri_allocator.h @@ -0,0 +1,63 @@ +#ifndef _CRI_ALLOCATOR_H_INCLUDED +#define _CRI_ALLOCATOR_H_INCLUDED +/**************************************************************************** + * * + * CRI Allocator * + * * + * 2006-01-05 written by M.Oshimi * + * * + ****************************************************************************/ + +/**************************************************************************** + * Include file + ****************************************************************************/ +#include +#include "cri_xpt.h" +#include "cri_heap.h" + +/**************************************************************************** + * Macro Constants + ****************************************************************************/ +#if defined(XPT_UNSUPPORT_CPLUSPLUS_THROW) +#define CRI_ALLOCATOR_CPLUSPLUS_THROW +#else +#define CRI_ALLOCATOR_CPLUSPLUS_THROW throw() +#endif + +/**************************************************************************** + * Class Declaration + ****************************************************************************/ +#ifdef __cplusplus + +class CriAllocator +{ +public: + static const CriSint32 DEFAULT_ALIGNMENT = CRIHEAP_DEFAULT_MEM_ALIGN; + + + static void* CRIAPI operator new(size_t size, CriHeap heap) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, CriHeapType heap_type) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, const CriChar8 *name, CriUint32 align=DEFAULT_ALIGNMENT) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, CriHeapType heap_type, const CriChar8 *name, CriUint32 align=DEFAULT_ALIGNMENT) CRI_ALLOCATOR_CPLUSPLUS_THROW; + + static void CRIAPI operator delete(void *p, size_t size); + + static void* CRIAPI operator new(size_t size, void *work, CriSint32 wksize) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, void *work, CriSint32 wksize) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, void *work, CriSint32 wksize, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, void *work, CriSint32 wksize, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + +#if !defined(XPT_TGT_BCB) + static void CRIAPI operator delete(void *p, CriHeap heap) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, CriHeapType heap_type) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, const CriChar8 *name, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, CriHeapType heap_type, const CriChar8 *name, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; +#endif + + static CriSint32 GetWorstExtraSize(CriUint32 align); +}; +#endif // _CRI_ALLOCATOR_H_INCLUDED + +#endif /* end of __cplusplus */ + +/* --- end of file --- */ diff --git a/3rdParty/cri/PS4/include/cri_error.h b/3rdParty/cri/PS4/include/cri_error.h new file mode 100644 index 00000000..6fdd5f43 --- /dev/null +++ b/3rdParty/cri/PS4/include/cri_error.h @@ -0,0 +1,368 @@ +#ifndef _CRI_ERROR_H_INCLUDED +#define _CRI_ERROR_H_INCLUDED +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2006-2009 CRI Middleware Co., Ltd. + * + * Library : CRI Error + * Module : + * File : cri_error.h + * + ****************************************************************************/ +/*! + * \file cri_error.h + */ +/*JP + * \addtogroup CRI_ERROR エラーハンドリング用関数群 + * @{ + */ +/*EN + * \addtogroup CRI_ERROR Functions for error handling + * @{ + */ + +/**************************************************************************** + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" + +/**************************************************************************** + * MACRO CONSTANT * + ****************************************************************************/ + +/* バージョン番号 */ +/* Version number */ +#define CRIERROR_VER_NAME "CRI Error" +#define CRIERROR_VER_NUM "1.04.00" +#define CRIERROR_VER_OPTION + +/*JP + * \brief エラーコード + */ +/*EN + * \brief Error codes + */ +typedef enum { + CRIERR_OK = 0, /*JP< 正常終了 */ + /*EN< Succeeded */ + CRIERR_NG = -1, /*JP< エラーが発生 */ + /*EN< Error occurred */ + CRIERR_INVALID_PARAMETER = -2, /*JP< 引数が不正 */ + /*EN< Invalid argument */ + CRIERR_FAILED_TO_ALLOCATE_MEMORY = -3, /*JP< メモリの確保に失敗 */ + /*EN< Failed to allocate memory */ + CRIERR_UNSAFE_FUNCTION_CALL = -4, /*JP< 非スレッドセーフ関数の並列実行 */ + /*EN< Parallel execution of thread-unsafe function */ + CRIERR_FUNCTION_NOT_IMPLEMENTED = -5, /*JP< 未実装関数の実行 */ + /*EN< Function not implemented */ + CRIERR_LIBRARY_NOT_INITIALIZED = -6, /*JP< ライブラリが未初期化 */ + /*EN< Library not initialized */ + /* enum be 4bytes */ + CRIERR_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriError; + +/*JP + * \brief エラー通知レベル + */ +/*EN + * \brief Error notification level + */ +typedef enum { + CRIERR_NOTIFY_ALL = 0, /*JP< 全てのエラーを通知 */ + /*EN< Notify all errors */ + CRIERR_NOTIFY_FATAL = 1, /*JP< エラーのみ通知(警告は無視) */ + /*EN< Notify error (Disregards warning) */ + /* enum be 4bytes */ + CRIERR_NOTIFY_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriErrorNotificationLevel; + +/* エラーレベル */ +/* Error level */ +typedef enum { + CRIERR_LEVEL_ERROR = 0, + CRIERR_LEVEL_WARNING = 1, + /* enum be 4bytes */ + CRIERR_LEVEL_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriErrorLevel; + +/**************************************************************************** + * PROCESS MACRO * + ****************************************************************************/ + +#if defined(CRIERROR_SIMPLIFY) + /* エラーの通知 */ + /* Notification of Error */ + #define criErr_NotifyError(id, msg) criErr_NotifyErrorSimple() + #define criErr_NotifyError1(id, msg, p1) criErr_NotifyErrorSimple() + #define criErr_NotifyError2(id, msg, p1, p2) criErr_NotifyErrorSimple() + #define criErr_NotifyErrorPrmArray(id, msg, p1, p2, pa) criErr_NotifyErrorSimple() + #define criErr_NotifyErrorGeneric(_error_id, _error_no) criErr_NotifyErrorSimple() + /* 警告の通知 */ + /* Notification of Warning */ + #define criErr_NotifyWarning(id, msg) criErr_NotifyWarningSimple() + #define criErr_NotifyWarning1(id, msg, p1) criErr_NotifyWarningSimple() + #define criErr_NotifyWarning2(id, msg, p1, p2) criErr_NotifyWarningSimple() + #define criErr_NotifyWarningPrmArray(id, msg, p1, p2, pa) criErr_NotifyWarningSimple() + #define criErr_NotifyWarningGeneric(_error_id, _error_no) criErr_NotifyWarningSimple() +#else + /* エラーの通知 */ + /* Notification of Error */ + #define criErr_NotifyError(id, msg) criErr_Notify(CRIERR_LEVEL_ERROR, id ":" msg) + #define criErr_NotifyError1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1)) + #define criErr_NotifyError2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) + #define criErr_NotifyErrorPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr *)(pa)) + #define criErr_NotifyErrorGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, _error_id, _error_no) + /* 警告の通知 */ + /* Notification of Warning */ + #define criErr_NotifyWarning(id, msg) criErr_Notify(CRIERR_LEVEL_WARNING, id ":" msg) + #define criErr_NotifyWarning1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1)) + #define criErr_NotifyWarning2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) + #define criErr_NotifyWarningPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr *)(pa)) + #define criErr_NotifyWarningGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_WARNING, _error_id, _error_no) +#endif + +/**************************************************************************** + * Data type declaration * + ****************************************************************************/ + +/* Error Callback Function type */ +typedef void (CRIAPI *CriErrCbFunc)(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + +/**************************************************************************** + * 変数の宣言 * + * Variable Declaration * + ****************************************************************************/ +/* エラー出力省略用変数 */ +/* default argument of CriError */ +#ifdef __cplusplus +namespace criErr { + extern CriError ErrorContainer; +} +#endif /* __cplusplus */ + +/**************************************************************************** + * 関数の宣言 * + * Function Declaration * + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*JP + * \brief エラーID文字列からエラーメッセージへ変換 + * \ingroup CRI_ERROR + * \param[in] errid エラーID文字列 + * \return エラーメッセージ + * \par 説明: + * エラーID文字列から詳細なエラーメッセージへ変換します。
+ * \attention + * この関数は旧仕様の関数です。
+ * 代わりに ::criErr_ConvertIdToMessage 関数を使用してください。 + * \sa criErr_ConvertIdToMessage + */ +/*EN + * \brief Convert error ID to error message + * \ingroup CRI_ERROR + * \param[in] errid error ID + * \return error message + * \par Explanation: + * This function converts error ID to detailed error message.
+ * \attention + * This function is an obsolete one.
+ * Please use the ::criErr_ConvertIdToMessage function instead. + * \sa criErr_ConvertIdToMessage + */ +const CriChar8* CRIAPI criErr_ConvertIdToMsg(const CriChar8 *errid); + +/*JP + * \brief エラーID文字列からエラーメッセージへ変換 + * \ingroup CRI_ERROR + * \param[in] errid エラーID文字列 + * \param[in] p1 補足情報1 + * \param[in] p2 補足情報2 + * \return エラーメッセージ + * \par 説明: + * エラーID文字列から詳細なエラーメッセージへ変換します。
+ * \par 用例: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * \endcode + */ +/*EN + * \brief Convert error ID to error message + * \ingroup CRI_ERROR + * \param[in] errid error ID + * \param[in] p1 supplementary information 1 + * \param[in] p2 supplementary information 2 + * \return error message + * \par Explanation: + * This function converts error ID to detailed error message.
+ * \par Example: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * \endcode + */ +const CriChar8* CRIAPI criErr_ConvertIdToMessage(const CriChar8 *errid, CriUint32 p1, CriUint32 p2); + +/*JP + * \brief エラーコールバック関数の登録 + * \ingroup CRI_ERROR + * \param[in] cbf エラーコールバック関数 + * \return なし + * \par 説明: + * エラーコールバック関数を登録します。
+ * 登録された関数は、CRIミドルウエアライブラリ内でエラーが発生したときに呼び出されます。
+ * 同時に登録できるエラーコールバック関数は1つです。
+ * 登録後に再度本関数を呼び出した場合は現在の登録を上書きします。 + * \par 用例: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * + * void main(int ac, char *av[]) + * { + * : + * // エラーコールバックの登録 + * criErr_SetCallback(user_error_callback_func); + * : + * } + * \endcode + */ +/*EN + * \brief Register error callback function + * \ingroup CRI_ERROR + * \param[in] cbf error callback function + * \return NONE + * \par Explanation: + * This function registers an error callback function.
+ * The registered function is called if an error occurs within the CRI middleware library. + * \par Example: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * + * void main(int ac, char *av[]) + * { + * : + * // Registers the error callback function + * criErr_SetCallback(user_error_callback_func); + * : + * } + * \endcode + */ +void CRIAPI criErr_SetCallback(CriErrCbFunc cbf); + +/*JP + * \brief エラー通知レベルの変更 + * \ingroup CRI_ERROR + * \param[in] level エラー通知レベル + * \return なし + * \par 説明: + * エラーコールバックに通知するエラーのレベルを変更します。 + */ +/*EN + * \brief Change error notification level + * \ingroup CRI_ERROR + * \param[in] level error notification level + * \return NONE + * \par Explanation: + * This function changes the level of error information that is notified to the error callback. + */ +void CRIAPI criErr_SetErrorNotificationLevel(CriErrorNotificationLevel level); + +/*JP + * \brief エラー発生回数の取得 + * \ingroup CRI_ERROR + * \param[in] level エラーレベル + * \return エラー発生回数 + * \par 説明: + * エラー発生回数を取得します。 + */ +/*EN + * \brief Retrieve error count + * \ingroup CRI_ERROR + * \param[in] level error level + * \return number of errors occured + * \par Explanation: + * This function retrieves the number of errors occured. + */ +CriUint32 CRIAPI criErr_GetErrorCount(CriErrorLevel level); + +/*JP + * \brief エラー発生回数のリセット + * \ingroup CRI_ERROR + * \param[in] level エラーレベル + * \return なし + * \par 説明: + * エラー発生回数のカウンタを0に戻します。 + */ +/*EN + * \brief Resets error count + * \ingroup CRI_ERROR + * \param[in] level error level + * \return NONE + * \par Explanation: + * This function resets the counter for number of errors occured. + */ +void CRIAPI criErr_ResetErrorCount(CriErrorLevel level); + +/* エラーコールバックを発生させる (内部関数) */ +/* Error notification (Internal functions) */ +void CRIAPI criErr_Notify(CriErrorLevel level, const CriChar8 *errid); +void CRIAPI criErr_Notify1(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1); +void CRIAPI criErr_Notify2(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1, CriUintPtr p2); +void CRIAPI criErr_NotifyPrmArray(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1, CriUintPtr p2, CriUintPtr *pa); +void CRIAPI criErr_NotifyGeneric(CriErrorLevel level, const CriChar8 *error_id, CriError error_no); +void CRIAPI criErr_NotifyErrorSimple(void); +void CRIAPI criErr_NotifyWarningSimple(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/*************************************************************************** + * 旧バージョンとの互換用 + * For compatibility with old versions + ***************************************************************************/ +#define criErr_Invoke(errid) criErr_Notify(CRIERR_LEVEL_ERROR, errid) +#define criErr_Invoke1(errid, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, errid, p1) +#define criErr_Invoke2(errid, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, errid, p1, p2) +#define criErr_InvokePrmArray(errid, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, errid, p1, p2, pa) +#define criErr_InvokeGeneric(error_id, error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, error_id, error_no) +#define criErr_Occur(id, msg) criErr_Notify(CRIERR_LEVEL_ERROR, id ":" msg) +#define criErr_Occur1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1)) +#define criErr_Occur2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) +#define criErr_OccurPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr*)(pa)) +#define criErr_OccurGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, _error_id, _error_no) + +/*EN + * @} + */ +/*JP + * @} + */ + +#endif // _CRI_ERROR_H_INCLUDED + +/* --- end of file --- */ diff --git a/3rdParty/cri/PS4/include/cri_heap.h b/3rdParty/cri/PS4/include/cri_heap.h new file mode 100644 index 00000000..49e85012 --- /dev/null +++ b/3rdParty/cri/PS4/include/cri_heap.h @@ -0,0 +1,640 @@ +#ifndef _CRI_HEAP_H_INCLUDED +#define _CRI_HEAP_H_INCLUDED +/**************************************************************************** + * * + * CRI Heap Manager "CriHeap" Library * + * * + * 2005-03-17 written by satouo * + * * + ****************************************************************************/ +/*! + * \file cri_heap.h + */ + +/**************************************************************************** + * インクルードファイル * + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" + +#ifdef XPT_TGT_PC +#pragma pack(push) +#pragma pack(1) //The boundary value of structure is adjusted to 1 byte. +#endif + +/**************************************************************************** + * 定数マクロ * + * MACRO CONSTANT * + ****************************************************************************/ +/* Version number of CRIHEAP */ +#define CRIHEAP_NAME_STRINGS "CRI Heap" +#define CRIHEAP_VERSION_STRINGS "1.21.02" + +/* Default memory alignment */ +#define CRIHEAP_DEFAULT_MEM_ALIGN (8) + +/**************************************************************************** + * 列挙定数マクロ * + * ENUM CONSTANT * + ****************************************************************************/ +/*JP + * \brief メモリのタイプ + */ +/*EN + * \brief Types of heap + */ +typedef enum { + CRIHEAP_TYPE_FIX = (1), + CRIHEAP_TYPE_TEMPORARY = (2), + CRIHEAP_TYPE_DYNAMIC = (3), // unuse + CRIHEAP_TYPE_NONE = (0), + /* enum be 4bytes */ + CRIHEAP_TYPE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriHeapType; + +/**************************************************************************** + * データ型 * + * Data type declaration * + ****************************************************************************/ +/* CriHeapハンドル */ +/* CriHeap handle */ +#ifndef CRIHEAP_DEFINED +#define CRIHEAP_DEFINED + +/* internal */ +typedef struct CriHeapBlockTag { + struct CriHeapBlockTag *prevblock; + struct CriHeapBlockTag *nextblock; + CriSint32 memsize; + CriUint8 used; + CriUint8 type; + CriUint16 alignspc; + CriUint16 gap; + CriChar8 *nameadr; +} CriHeapBlock, *CriHeapBlockPtr; + +/*JP + * \brief CRI Heapハンドル + * \struct CriHeap + * \ingroup CRIHEAP_BASIC + * CRI Heapを用いてメモリアロケートを行うために必要なハンドルです。
+ * このハンドルに対して、メモリアロケートやメモリフリーを行います。 + * \sa criHeap_Create(), criHeap_Destroy() + */ +/*EN + * \brief CRI Heap handle + * \struct CriHeap + * \ingroup CRIHEAP_BASIC + * \par Description: + * The heap handle. This data structure needs to exist through the life cycle of + * the heap. It allows the library to allocate and deallocate memory + * internally within the heap. Typically this handle gets allocated at the + * beginning of the heap memory that you've provided for the heap, but don't + * depend on this behavior. The heap itself is opaque. You can of course + * allocate multiple non-contiguous heaps, but these will be separate heap + * structures and a single allocation won't choose between them. + * + * \sa criHeap_Create(), criHeap_Destroy() + */ +typedef struct _criheap_struct { + struct _criheap_vfunctiontable *vtbl; + CriSint32 totalsize; + CriSint32 peaksize; + CriSint32 currentsize; + CriHeapBlock *topblock; + CriHeapBlock *taleblock; +} CriHeapObj, *CriHeap; + +/*JP + * \brief CRI Heap仮想関数テーブル + * \struct criHeapVirtualFunctionTable + * \ingroup CRIHEAP_BASIC + * 独自のメモリアロケート関数を実装する際に使用する仮想関数テーブル構造体です。
+ * 各関数はマルチスレッドセーフである必要があります。
+ * \par 備考: + * 3番目のアロケート関数は現在未使用です。 + */ +/*EN + * \brief CRI Heap Virtual Function Table + * \struct criHeapVirtualFunctionTable + * \ingroup CRIHEAP_BASIC + * \par Description: + * The virtual functions table for original allocation functions.
+ * The third allocation function is not in use currently. + */ +typedef struct _criheap_vfunctiontable { + /*JP + * \brief メモリのアロケート(メモリ領域の先端から) + * \par 説明: + * criHeap_AllocFix関数呼び出し時に呼ばれます。 + * \sa criHeap_AllocFix() + */ + /*EN + * \brief Memory allocation (allocating from the top of the memory area) + * \par Description: + * Called from criHeap_AllocFix(). + * \sa criHeap_AllocFix() + */ + void *(*AllocFix)(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + /*JP + * \brief メモリのアロケート(メモリ領域の終端から) + * \par 説明: + * criHeap_AllocFix関数呼び出し時に呼ばれます。 + * \sa criHeap_AllocTemporary() + */ + /*EN + * \brief Memory allocation (allocating from the tail of the memory area) + * \par Description: + * Called from criHeap_AllocTemporary(). + * \sa criHeap_AllocTemporary() + */ + void *(*AllocTemporary)(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + /*JP + * \brief 未使用関数 + */ + /*EN + * \brief Unused + */ + void *(*AllocDynamic)(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); // unused + + /*JP + * \brief メモリのフリー + * \par 説明: + * criHeap_Free関数呼び出し時に呼ばれます。 + * \sa criHeap_Free() + */ + /*EN + * \brief Memory deallocation + * \par Description: + * Called from criHeap_Free(). + * \sa criHeap_Free() + */ + CriSint32 (*Free)(CriHeap heap, void *ptr); +} criHeapVirtualFunctionTable; + +#endif + + +/**************************************************************************** + * 関数の宣言 + * Function Declaration + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*==========================================================================* + * ライブラリの初期化と終了処理 + * Initialize and Finalize of Library + *==========================================================================*/ +/*JP + * \brief CRI Heapライブラリの初期化 + * \ingroup CRIHEAP_BASIC + * \par 説明: + * CRI Heapライブラリを使用するために必要な初期化関数です。
+ * CRI Heapを使用する際はあらかじめ本関数をコールする必要があります。 + * \sa criHeap_Finalize() + */ +/*EN + * \brief Initialize the heap manager. + * \ingroup CRIHEAP_BASIC + * \par Description: + * This function initializes the heap manager and prepares it to manage heaps. + * This function only has an effect the first time it is called in your program. + * Subsequent calls only increment an internal counter. This allows your + * program to call criHeap_Initialize() in pairs with criHeap_Finalize() + * throughout your program modules, and only the initial call to criHeap_Initialize() + * and the final call to criHeap_Finalize() will have any effect. + * \if ps2 + * \par PS2 only: + * This function does a sanity check to make sure that the size of the CriHeapObj + * data structure is a factor of 16. If it is not a factor of 16, this function + * hangs. + * \endif + * \sa criHeap_Finalize() + */ +void CRIAPI criHeap_Initialize(void); + +/*JP + * \brief CRI Heapライブラリの終了 + * \ingroup CRIHEAP_BASIC + * \par 説明: + * CRI Heapライブラリを終了するために必要な終了関数です。
+ * CRI Heapの使用を終了する際は本関数をコールしてください。 + * \sa criHeap_Initialize() + */ +/*EN + * \brief Finalize the heap manager. + * \ingroup CRIHEAP_BASIC + * \par Description: + * This function finalizes the heap manager. If the criHeap_Initialize() function + * is called n times, then the nth time that criHeap_Finalize() + * is called, this function invalidates any heaps currently in use. Calling + * any heap function after the nth call to criHeap_Finalize() will + * have unpredictable results. + * \sa criHeap_Initialize() + */ +void CRIAPI criHeap_Finalize(void); + +/*==========================================================================* + * ハンドルの生成・解放 + *==========================================================================*/ +/*JP + * \brief CRI Heapハンドルの生成 + * \ingroup CRIHEAP_BASIC + * \param ptr メモリ領域のポインタ。 + * \param size メモリ領域のサイズ。 + * \return CRI Heapハンドル。
生成に失敗した場合は、NULLが返ります。 + * \par 説明: + * CRI Heapハンドルを生成します。
+ * 本関数で与えるメモリ領域は、CRI Heap自身のハンドル領域やアロケート時に + * 確保されるメモリ領域となります。
+ * 管理領域を含むため、メモリ領域すべてがアロケート出来ない点に注意してください。 + * 管理領域の目安は「1ハンドルあたりsizeof(CriHeapObj)」+「1アロケートあたり + * sizeof(CriHeapBlock)+各メモリアライメントに必要なサイズ」となります。 + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * \endcode + * \sa criHeap_Destroy() + */ +/*EN + * \brief Create a contiguous heap in memory. + * \ingroup CRIHEAP_BASIC + * \param ptr A pointer to the start of the memory region to use as a heap. + * \param size The size of the region to be used as a heap. + * \return A valid CriHeap handle if successful, or NULL if unsuccessful. + * \par Description: + * This function allows you to set aside a region of memory for this library's + * use as a "heap". Heap allocation is required before active playback + * can begin. + * This function will fail and return NULL if the size of the memory region + * is smaller than the CriHeapObj structure. + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * \endcode + * \sa criHeap_Destroy() + */ +CriHeap CRIAPI criHeap_Create(void *ptr, CriSint32 size); + +/*JP + * \brief 非スレッドセーフなCRI Heapハンドルの生成 + * \ingroup CRIHEAP_BASIC + * \param ptr メモリ領域のポインタ。 + * \param size メモリ領域のサイズ。 + * \return CRI Heapハンドル。
生成に失敗した場合は、NULLが返ります。 + * \par 説明: + * CRI Heapハンドルを生成します。
+ * 本関数を使用して作成されたヒープは、排他制御が行なわれません。
+ * 複数スレッドから同時に参照されるヒープの作成には、criHeap_Create関数をご利用ください。 + * \sa criHeap_Create(), criHeap_Destroy() + */ +/*EN + * \brief Create a contiguous heap in memory. + * \ingroup CRIHEAP_BASIC + * \param ptr A pointer to the start of the memory region to use as a heap. + * \param size The size of the region to be used as a heap. + * \return A valid CriHeap handle if successful, or NULL if unsuccessful. + * \par Description: + * This function creates a heap to use the static memory as dynamically allocatable memory. + * The heap created by using this function is not threadsafe. + * If heap will be accessed by multiple threads, you must create the heap by using the criHeap_Create function. + * \sa criHeap_Create(), criHeap_Destroy() + */ +CriHeap CRIAPI criHeap_CreateNoSerialize(void *ptr, CriSint32 size); + +/*JP + * \brief CRI Heapハンドルの解放 + * \ingroup CRIHEAP_BASIC + * \param heap CRI Heapハンドル。 + * \par 説明: + * CRI Heapハンドルを解放します。
criHeap_Create() で指定されたメモリ領域が + * 解放され、CRI Heapハンドルは無効となります。 + * \sa criHeap_Create() + */ +/*EN + * \brief Destroy a previously created heap. + * \ingroup CRIHEAP_BASIC + * \param heap A CriHeap handle previously created with criHeap_Create(). + * \par Description: + * This function frees all internal allocations previously performed on + * the heap and frees the memory. Internally, this function does in + * fact walk through the heap, finding and freeing all allocations, e.g. + * it is not stubbed. So calling this function on a trashed heap + * will have unpredictable results. + * \sa criHeap_Create() + */ +void CRIAPI criHeap_Destroy(CriHeap heap); + +/*==========================================================================* + * Allocation + *==========================================================================*/ +/*JP + * \brief メモリのアロケート(メモリ領域の先端から) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heapハンドル。 + * \param size アロケートするメモリのサイズ。 + * \param name アロケートするメモリの名前。名前はデバッグ時に使用されます。 + * \param align アロケートするメモリのアライメント。 + * \return アロケートしたメモリへのポインタ。
アロケートに失敗した場合はNULLが返ります。 + * \par 説明: + * メモリ領域の先端側から確保するメモリアロケーション関数です。ヒープ領域内に\ref block_fix "Fixブロック"を作成します。
+ * メモリの断片化を防ぐため、同じサイズ/アライメントの解放済み\ref block_fix "Fixブロック"を先端側から探して、再利用するように試みます。それが見つからない場合は、未使用の空き領域(\ref block_free "Freeブロック")を分割してメモリを取得します。 + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * \endcode + * \sa criHeap_AllocTemporary(), criHeap_Free() + */ +/*EN + * \brief Memory allocation (allocating from the top of the memory area) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heap handle + * \param size Memory block size to be allocated + * \param name Memory block name, which is used on debugging + * \param align Memory block alignment + * \return A pointer to the allocated memory block.
Returns NULL if unsuccessful. + * \par Description: + * This function allocates a memory block from the top of the memory area and creates a \ref block_fix "Fix block" in the heap area.
+ * To prevent memory fragmentation, a released \ref block_fix "Fix block" with the same size and alignment is searched for in the heap area from the top to the bottom and tries to reused the block. And if not found, an unused free block (\ref block_free "Free block") is divided and a new block is allocated. + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * \endcode + * \sa criHeap_AllocTemporary(), criHeap_Free() + */ +void * CRIAPI criHeap_AllocFix(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + +/*JP + * \brief メモリのアロケート(メモリ領域の終端から) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heapハンドル。 + * \param size アロケートするメモリのサイズ。 + * \param name アロケートするメモリの名前。名前はデバッグ時に使用されます。 + * \param align アロケートするメモリのアライメント。 + * \return アロケートしたメモリへのポインタ。
アロケートに失敗した場合はNULLが返ります。 + * \par 説明: + * メモリ領域の終端側から確保するメモリアロケーション関数です。ヒープ領域内に\ref block_temporary "Temporaryブロック"を作成します。
+ * 要求したサイズ/アライメントをアロケート可能な解放済み\ref block_temporary "Temporaryブロック"を終端側から探して、分割または再利用するように試みます。それが見つからない場合は、未使用の空き領域(\ref block_free "Freeブロック")を分割してメモリを取得します。
+ * ヒープ領域の終端側からメモリをアロケートするため、先端側での断片化を防ぐことが出来ます。
+ * 主に、一時的に利用するメモリに使用します。 + * \sa criHeap_AllocFix(), criHeap_Free() + */ +/*EN + * \brief Memory allocation (allocating from the tail of the memory area) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heap handle + * \param size Memory block size to be allocated + * \param name Memory block name, which is used on debugging + * \param align Memory block alignment + * \return A pointer to the allocated memory block.
Returns NULL if unsuccessful. + * \par Description: + * This function allocates a memory block from the bottom of the memory area and creates a \ref block_temporary "Temporary block" in the heap area.
+ * A released \ref block_temporary "Temporary block" available with the requested size and alignment is searched for in the heap area from the bottom and tries to divide and to reuse the block. And if not found, an unused free block (\ref block_free "Free block") is divided and a new block is allocated.
+ * Allocating from the bottom of the heap area will prevent fragmentation in the top of the heap area.
+ * Temporary block is mainly used for the memory area that is temporarily used. + * \sa criHeap_AllocFix(), criHeap_Free() + */ +void * CRIAPI criHeap_AllocTemporary(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + +/* DYNAMIC (unuse) */ +//void * CRIAPI criHeap_AllocDynamic(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + +void * CRIAPI criHeap_Alloc(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align, CriSint32 type); + +/*==========================================================================* + * Free + *==========================================================================*/ +/*JP + * \brief メモリのフリー + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heapハンドル。 + * \param ptr アロケートしたメモリのポインタ。 + * \return フリーされたメモリサイズ。 + * \par 説明: + * アロケートされたメモリをフリーします。
+ * \code + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * criHeap_Free(heap, memptr); + * \endcode + * \sa criHeap_AllocFix(), criHeap_AllocTemporary() + */ +/*EN + * \brief Memory deallocation + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heap handle + * \param ptr The pointer to the allocated memory block + * \return Deallocated memory block size + * \par Description: + * This function deallocates the allocated memory block.
+ * \code + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * criHeap_Free(heap, memptr); + * \endcode + * \sa criHeap_AllocFix(), criHeap_AllocTemporary() + */ +CriSint32 CRIAPI criHeap_Free(CriHeap heap, void *ptr); + +/*==========================================================================* + * 排他制御用関数 + *==========================================================================*/ +CriSint32 CRIAPI criHeap_EnterCriticalSection(void); +CriSint32 CRIAPI criHeap_LeaveCriticalSection(void); + +/*==========================================================================* + * その他の関数 + *==========================================================================*/ +/* For only internal use */ +CriSint32 CRIAPI criHeap_SwitchAllocFunctions(CriHeap heap); + +/*==========================================================================* + * デバッグ関連 + *==========================================================================*/ +/*JP + * \brief ピークメモリサイズの取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \return 使用されたメモリの最大値。 + * \par 説明: + * 過去、使用されたメモリ量の最大値を返します。
+ * 最大値はcriHeap_DebugResetPeakMemorySize() でリセットすることが出来ます。 + * \sa criHeap_DebugResetPeakMemorySize() + */ +/*EN + * \brief Returns peak memory usage of the heap. + * \ingroup CRIHEAP_DEBUG + * \param heap The heap previously allocated by criHeap_Create(). + * \return The maximum number of bytes used by the heap. + * \par Description: + * The amount of memory used by these libraries is variable and depends + * on the number of simultaneous streams being read, the seek and error + * frequency within the stream being read, video resolution and other + * factors. This function allows you to tune the allocation of the heap + * to achieve a required performance level while allocating minimal + * heap space for this library. To get accurate readings, this function + * should typically be called just before criHeap_Destroy(), and after + * exercising all the video and audio functions in your program. + */ +CriSint32 CRIAPI criHeap_DebugGetPeakMemorySize(CriHeap heap); + +/*JP + * \brief ピークメモリサイズのリセット + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \par 説明: + * ピークメモリサイズをリセットします。 + * \sa criHeap_DebugGetPeakMemorySize() + */ +/*EN + * \brief Reset peak memory size + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap handle + * \par Description: + * The peak memory size is reset. + * \sa criHeap_DebugGetPeakMemorySize() + */ +void CRIAPI criHeap_DebugResetPeakMemorySize(CriHeap heap); + +/*JP + * \brief メモリブロック数の取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \return メモリブロック数。 + * \par 説明: + * アロケートされたメモリのブロック数を返します。
+ * CRI Heapハンドル生成直後は未使用のメモリブロックが1つ存在する状態 + * となります。また、フリーされた断片化されたメモリブロックもこの数に + * 含みます。 + * \sa criHeap_DebugGetUsedBlocks() + */ +/*EN + * \brief Get number of allocated memory blocks + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap handle + * \return Number of allocated memory blocks + * \par Description: + * The number of allocated memory blocks is returned.
+ * One unused memory block exists right after CRI Heap handle creation. + * The number of released fragmented memory blocks is also included. + * \sa criHeap_DebugGetUsedBlocks() + */ + CriSint32 CRIAPI criHeap_DebugGetNumBlocks(CriHeap heap); + +/*JP + * \brief 使用メモリブロック数の取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \return 使用メモリブロック数。 + * \par 説明: + * アロケートされているメモリブロックの数を返します。 + * \sa criHeap_DebugGetNumBlocks() + */ +/*EN + * \brief Get number of used memory blocks + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \return Number of used memory blocks + * \par Description: + * The number of used memory blocks is returned.
+ * \sa criHeap_DebugGetNumBlocks() + */ +CriSint32 CRIAPI criHeap_DebugGetUsedBlocks(CriHeap heap); + +/*JP + * \brief メモリブロック名の取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \param ptr アロケートしたメモリのポインタ。 + * \return メモリブロック名。 + * \par 説明: + * アロケート時に設定したメモリブロック名へのポインタを返します。
+ */ +/*EN + * \brief Get memory block name + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \param ptr A pointer to the allocated memory block + * \return Memory block name + * \par Description: + * The pointer to the memory block name specified on allocation is returned.
+ */ +CriChar8 * CRIAPI criHeap_DebugGetBlockName(CriHeap heap, void *ptr); + +/* メモリブロック番号の取得 */ +//CriSint32 CRIAPI criHeap_DebugGetBlockNumberFromPointer(CriHeap heap, void *ptr); + +/* メモリブロック情報の取得 */ +//void CRIAPI criHeap_DebugGetBlockInformation(CriHeap heap, +// CriSint32 blocknumber, CriHeapBlock *heapblock); + +/* メモリブロック情報の表示 */ +//void CRIAPI criHeap_DebugPrintBlockInformation(CriHeap heap, +// CriSint32 blocknumber, CriHeapBlock *heapblock); + +/*JP + * \brief メモリブロック情報の表示 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \par 説明: + * 現在のメモリブロック情報を表示します。
+ * printf関数などの標準出力に表示を行います。 + */ +/*EN + * \brief Print memory block information + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \par Description: + * The current memory block information is displayed.
+ * It is displayed on the standard output for the printf function. + */ + void CRIAPI criHeap_DebugPrintBlockInformationAll(CriHeap heap); + +/*JP + * \brief メモリアロケートサイズの取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \par 説明: + * 現在のメモリアロケートサイズの合計値を返します。 + */ +/*EN + * \brief Get total allocation size + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \par Description: + * The total size of allocated memory blocks is returned. + */ +CriSint32 CRIAPI criHeap_DebugGetTotalAllocSize(CriHeap heap); + +/* フリーサイズの取得 */ +//CriSint32 CRIAPI criHeap_DebugGetTotalFreeSize(CriHeap heap); + +/* メモリアロケートサイズの取得(タイプ別) */ +CriSint32 CRIAPI criHeap_DebugGetAllocSize(CriHeap heap, CriSint32 type); + +/* ヒープヘッダサイズの取得 */ +CriSint64 CRIAPI criHeap_DebugGetHandleHeaderSize(CriHeap heap); + +/* メモリブロックヘッダサイズの取得 ptr: Allocated Pointer */ +CriSint64 CRIAPI criHeap_DebugGetMemBlockHeaderSize(void *ptr); + +/* 追加で必要となるサイズの最大値 */ +CriSint32 CRIAPI criHeap_DebugGetWorstExtraSize(CriSint32 alignment); + +/* criHeap_AllocFixでアロケート可能なサイズ */ +CriSint32 CRIAPI criHeap_DebugGetFixAllocatableSize(CriHeap heap, CriSint32 alignment); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#ifdef XPT_TGT_PC +#pragma pack(pop) +#endif + +#endif // _CRI_HEAP_H_INCLUDED + +/* end of file */ diff --git a/3rdParty/cri/PS4/include/cri_movie.h b/3rdParty/cri/PS4/include/cri_movie.h new file mode 100644 index 00000000..7259993f --- /dev/null +++ b/3rdParty/cri/PS4/include/cri_movie.h @@ -0,0 +1,4402 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2006-2013 CRI Middleware Co., Ltd. + * + * Library : CRI Movie + * Module : Library User's Header + * File : cri_movie.h + * Date : 2013-11-27 + * Version : (see CRIMOVIE_VER) + * + ****************************************************************************/ +/*! + * \file cri_movie.h + */ +#ifndef CRI_MOVIE_H_INCLUDED /* Re-definition prevention */ +#define CRI_MOVIE_H_INCLUDED + +/* Version No. */ +#define CRIMOVIE_VER "3.50" +#define CRIMOVIE_NAME "CRI Movie" + +/*************************************************************************** + * Include file + ***************************************************************************/ +#include +#include +#include +#include +#include +#include + +/*************************************************************************** + * MACRO CONSTANT + ***************************************************************************/ +/*EN + * \brief Maximum length of a filename that can be opened by EasyPlayer + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetFile() + */ +/*JP + * \brief EasyPlayerに指定可能なファイル名の最大長さ + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetFile() + */ +#define CRIMV_MAX_FILE_NAME (256) + +/*EN + * \brief Default audio track setting used by AttachSubAudioInterface(), ReplaceCenterVoice() + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::ReplaceCenterVoice(), CriMvEasyPlayer::AttachSubAudioInterface() + */ +/*JP + * \brief サブオーディオ(またはセンターボイス)のデフォルト値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::ReplaceCenterVoice(), CriMvEasyPlayer::AttachSubAudioInterface() + */ +#define CRIMV_CENTER_VOICE_OFF (-1) + + +/*************************************************************************** + * Variable Declaration + ***************************************************************************/ +namespace CriMv { + extern CriError ErrorContainer; +} + +/*************************************************************************** + * Prototype Functions + ***************************************************************************/ +/*EN + * \brief CRI Movie Namespace + * \ingroup MDL_MV_BASIC + * \par + * Namespace for all CRI Movie methods, constants, and declarations + */ +/*JP + * \brief CRI Movie Namespace + * \ingroup MDL_MV_BASIC + * \par + * Namespace for all CRI Movie methods, constants, and declarations + */ +namespace CriMv { + + /*EN + * \brief Returns the version number and build information of CRI Movie + * \param none + * \return A string constant + * + * Returns the version number and build information of CRI Movie as a constant + * string, in the form + * + * "CRI Movie/{PLATFORM} {VERSION} Build:{BUILD DATE}" + */ + /*JP + * \brief CRI Movieのバージョン番号やビルド情報を返します。 + * \return ライブラリ情報文字列 + * + */ + const CriChar8* CRIAPI GetLibraryVersionString(void); + + /*EN + * \brief Initialize the CRI Movie library + * \param err Optional error code + * + * Does one-time initialization of the CRI Movie library.
+ * This function must be successfully called before calling CriMvEasyPlayer::Create().
+ *
+ * In general, all CRI Movie APIs are available after calling CriMv::Initialize(), + * until CriMv::Finalize() is called. However, there are some methods that set options + * for the library as a whole which must be called before CriMv::Initialize():
+ *
+ * It is safe to call CriMv::Initialize() more than once, as long as your application calls + * CriMv::Finalize() once for each call to CriMv::Initialize(). Multiple calls will not + * have an effect on the library, other than to increment or decrement an internal counter. + * + * \sa CriMv::Finalize() + */ + /*JP + * \brief CRI Movieライブラリの初期化 + * \param err エラー情報(省略可) + * + * CRI Movie ライブラリを初期化します。
+ * CriMvEasyPlayer::Create 関数よりも先に呼び出してください。
+ *
+ * 原則として全ての CRI Movie ライブラリ関数は初期化後、終了関数呼び出しまでの間にのみ使用します。
+ * ただし、いくつかの設定関数は初期化関数よりも先に呼び出す必要があるものがあります。 + * 詳細は各設定関数の説明を参照してください。 + *
+ * 初期化関数を複数回呼び出した場合、2回目以降の呼び出しでは呼び出し回数を記録するだけで再初期化は行いません。
+ * この場合、正しく終了処理を行うには同じ回数だけ終了関数を呼び出す必要があります。 + * 初期化関数と終了関数は必ず対で呼び出すように実装してください。
+ * + * \sa CriMv::Finalize() + */ + void CRIAPI Initialize(CriError &err = CriMv::ErrorContainer); + + /* MEMO: + * If an application calls this function instead of CriMv::Initialize(), + * an application need to call CriMv::SetupMovieHandleWork() before CriMv::InitializeMana(). + */ + void CRIAPI InitializeMana(CriError &err = CriMv::ErrorContainer); + + /*EN + * \brief Initialize 32bit ARGB frame conversion + * + * This function initializes 32bit ARGB frame conversion.
+ * When an application uses CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB(), + * please call this function after CriMv::Initialize().
+ * + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB() + */ + /*JP + * \brief 32bitARGB用フレーム変換の初期化 + * + * 32bitARGB用フレーム変換処理を初期化します。
+ * CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB() を使用する場合は CRI Movie ライブラリの + * 初期化後に必ず呼び出してください。
+ * + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB() + */ + void CRIAPI InitializeFrame32bitARGB(void); + +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_PC) || defined(XPT_TGT_TRGP6K) + void CRIAPI InitializeFrameRGB565(void); +#endif + + /*EN + * \brief De-initializes the CRI Movie library + * \param err Optional error code + * + * This function finalize whole CRI Movie library.
+ * An application needs to destroy all CriMvEasyPlayer handles and decoding threads before callign CriMv::Finalize().
+ *
+ * In principle, all CRI Movie library APIs are enabled after CriMv::Initialize() until CriMv::Finalize().
+ * But there are some APIs for parameter setting, which need to be called after CriMv::Finalize(). + * For details, refer to each explanations of setting APIs. + *
+ * \remarks + * CriMv::Finalize() must be called once for each call to CriMv::Initialize(). When the + * internal initialization count reaches 0, the library will be finalized. + * + * \sa CriMv::Initialize() + */ + /*JP + * \brief CRI Movieライブラリの終了 + * \param err エラー情報(省略可) + * + * CRI Movie ライブラリを終了します。
+ * この関数を呼び出す前に、全ての CriMvEasyPlayer ハンドルおよびデコードスレッドを破棄してください。
+ *
+ * 原則として全ての CRI Movie ライブラリ関数は初期化後、終了関数呼び出しまでの間にのみ使用します。
+ * ただし、いくつかの設定関数は終了関数よりも後に呼び出す必要があるものがあります。 + * 詳細は各設定関数の説明を参照してください。 + *
+ * 初期化関数を複数回呼び出した場合、正しく終了処理を行うには同じ回数だけ終了関数を呼び出す必要があります。 + * 初期化関数と終了関数は必ず対で呼び出すように実装してください。
+ * + * \sa CriMv::Initialize() + */ + void CRIAPI Finalize(CriError &err = CriMv::ErrorContainer); + +#if !defined(XPT_TGT_EE) + /*EN + * \brief Calculates the work buffer size needed for the given number of movie handles + * \param max_num Maximum number of movie handles desired + * \param err Optional error code + * \return The necessary work buffer size, in bytes + * + * Each active movie handle requires an internal work buffer. If your application + * needs to have multiple movies open at one time, it should determine how many handles + * it needs, allocate a buffer of the size returned by this function, and pass it to + * CriMv::SetupMovieHandleWork().
+ * + * Each CriMvEasy object uses a movie handle. Alpha movie playback uses two handles. + * If you need to play aplha movies, be sure to double the number of handles requested. + * + * \remarks + * The number of movie handles must be set before calling CriMv::Initialize(). + * + * \sa CriMv::SetupMovieHandleWork() + */ + /*JP + * \brief マルチハンドル用ワークバッファサイズの計算 + * \param max_num 最大ハンドル数(不透明ムービの再生時) + * \param err エラー情報(省略可) + * \return ワークサイズ + * + * 同時に使用する CriMvEasyPlayer ハンドルの最大数を増加させる場合に必要なワークバッファ + * サイズを計算します。 + * + * アルファムービを再生するとハンドル資源を2つ消費します。 + * もし複数のアルファムービ再生を行いたい場合は、最大ハンドル数は倍にして指定してください。 + * + * \sa CriMv::SetupMovieHandleWork() + */ + CriUint32 CRIAPI CalcMovieHandleWork(CriUint32 max_num, CriError &err = CriMv::ErrorContainer); + + /*EN + * \brief Increases the default number of available movie handles + * \param max_num Maximium number of movie handles + * \param workbuf Work buffer + * \param worksize Size of work buffer + * \param err Optional error code + * + * Call this function if your application needs to increase the maximum number of open movies + * beyond the default. Note that playing an alpha movie requires a second handle.
+ * + * The default number of movie handles depends on the platform.
+ * + * The work buffer must be allocated based on the size returned by CriMv::CalcMovieHandleWork().
+ * + * \remarks + * This function must be called before calling CriMv::Initialize(). + * + * \sa CriMv::CalcMovieHandleWork() + */ + /*JP + * \brief マルチハンドル用ワークバッファの設定 + * \param max_num 最大ハンドル数(不透明ムービの再生時) + * \param workbuf ワークバッファアドレス + * \param worksize ワークバッファサイズ + * \param err エラー情報(省略可) + * + * 同時に使用する CriMvEasyPlayer ハンドルの最大数を増加させるためのワークバッファを設定します。 + * なお、ワークバッファを指定しない場合のハンドル数上限は機種によって異なります。 + * + * ワークバッファの設定は、 CriMv::Initialize() の呼び出しに実行してください。 + * + * \sa CriMv::CalcMovieHandleWork() + */ + void CRIAPI SetupMovieHandleWork(CriUint32 max_num, void *workbuf, CriUint32 worksize, CriError &err = CriMv::ErrorContainer); + + /*EN + * \brief Get max number of movie handles + * \param err Optional error code + * \return Max number of movie handles you set by CriMv::SetupMovieHandleWork(). + * + * Returns the maximum number of movie handles that are available to CRI Movie.
+ * + * Note that this is not necessarily equal to the number of movies that can be + * opened at a time. In general, each movie will use one handle; however, + * alpha channel movies uses two handles. + * + * \sa CriMv::SetupMovieHandleWork(), CriMv::CalcMovieHandleWork() + */ + /*JP + * \brief 最大ハンドル数の取得 + * \param err エラー情報(省略可) + * \return CriMv::SetupMovieHandleWork() で設定した最大ハンドル数 + * + * CriMv::CalcMovieHandleWork() で最大ハンドル数を増加させた場合に、 + * 設定した最大ハンドル数を取得します。 + * + * \sa CriMv::SetupMovieHandleWork(), CriMv::CalcMovieHandleWork() + */ + CriUint32 CRIAPI GetMaxNumberOfHandles(CriError &err = CriMv::ErrorContainer); +#endif + + /* For Sofdec2 */ + CriSint32 CRIAPI CalcHandleWorkSize(CriMvHandleConfig *config, CriError &err = CriMv::ErrorContainer); + void CRIAPI SetDelayDestroySubmodules(CriBool sw); +} + +/*************************************************************************** + * CLASS + ***************************************************************************/ +/*EN + * \brief File Reading Interface Class for EasyPlayer + * \ingroup MDL_IF_READER + * \par + * You can implement your own streaming filesystem for movie playback by deriving + * from this class.
+ * + * Pass an instance of this subclass to CriMvEasyPlayer::Create().
+ * + * This class is designed for asynchronous operation. All functions are pure virtual. + * + * \sa CriMvEasyPlayer::Create() + */ +/*JP + * \brief ファイル読み込みインタフェース for EasyPlayer + * \ingroup MDL_IF_READER + * + * このクラスを定義することで、自前のファイルシステムを使ってEasyPlayerの + * ストリーミング再生が可能になります。
+ * 全ての関数は純粋仮想関数として定義されているので、全ての関数を必ず実装してください。 + * + * \sa CriMvEasyPlayer::Create() + */ +class CriMvFileReaderInterface +{ +public: + /*EN Status of an asynchronous operation */ + /*JP 非同期処理ステータス */ + enum AsyncStatus { + ASYNC_STATUS_STOP, /*EN< No action */ + /*JP< 何もしていない状態。*/ + ASYNC_STATUS_BUSY, /*EN< Currently processing */ + /*JP< 処理中 */ + ASYNC_STATUS_COMPLETE, /*EN< Processing completed */ + /*JP< 処理終了 */ + ASYNC_STATUS_ERROR, /*EN< An error occured */ + /*JP< エラー */ + + /* Keep enum 4bytes */ + ASYNC_STATUS_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + /*EN Offset values for Seek() */ + /*JP シーク開始位置 */ + enum SeekOrigin { + SEEK_FROM_BEGIN, /*EN< Start of file */ + /*JP< ファイル先頭 */ + SEEK_FROM_CURRENT, /*EN< Current position in file */ + /*JP< ファイルの現在位置 */ + SEEK_FROM_END, /*EN< End of file */ + /*JP< ファイル終端 */ + + /* Keep enum 4bytes */ + SEEK_FROM_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + /*EN + * \brief Opens a file asynchronously + * \param fname Name of file to open + * + * Initiates a file open request, and returns immediately. + * + * To determine success or failure, call CriMvFileReaderInterface::GetOpenStatus().
+ * + * \remarks + * CRI Movie may call CriMvFileReaderInterface::Read() and CriMvFileReaderInterface::Close() + * before CriMvFileReaderInterface::GetOpenStatus() returns ASYNC_STATUS_COMPLETE. + * + * \sa CriMvFileReaderInterface::GetOpenStatus() + */ + /*JP + * \brief ファイル名によるファイルオープン(即時復帰) + * \param fname ファイル名の文字列 + * + * ファイル名指定でファイルのオープン要求を出します。
+ * この関数は即時復帰の関数として呼び出されます。
+ * オープン処理が終わったかどうかは CriMvFileReaderInterface::GetOpenStatus関数 + * でチェックできるようにしてください。
+ * CRI Movie ライブラリはオープン処理が終わる(= CriMvFileReaderInterface::GetOpenStatus関数が + * ASYNC_STATUS_COMPLETEを返す)前に、リード、クローズの要求を呼び出す可能性があります。 + * + * \sa CriMvFileReaderInterface::GetOpenStatus() + */ + /* pure */ virtual void Open(CriChar8 *fname)=0; + + /*EN + * \brief Closes a file asynchronously + * + * Initiates a file close request, and returns immediately.
+ * + * To determine success or failure, call CriMvFileReaderInterface::GetCloseStatus().
+ * + * \sa CriMvFileReaderInterface::GetCloseStatus() + */ + /*JP + * \brief ファイルのクローズ(即時復帰) + * + * オープン済みのファイルのクローズ要求を出します。
+ * この関数は即時復帰の関数として呼び出されます。
+ * クローズ処理が終わったかどうかは CriMvFileReaderInterface::GetCloseStatus() + * でチェックできるようにしてください。 + * + * \sa CriMvFileReaderInterface::GetCloseStatus() + */ + /* pure */ virtual void Close(void)=0; + + /*EN + * \brief Reads from a file + * \param buffer Buffer to read into + * \param req_size Size of the buffer + * + * Initiates a file read request, and returns immediately.
+ * + * The buffer must be available and writable until the read request completes.
+ * + * To determine success or failure, call CriMvFileReaderInterface::GetReadStatus().
+ * + * To determine the number of bytes actually read, call CriMvFileReaderInterface::GetReadSize() + * after CriMvFileReaderInterface::GetReadStatus() has returned ASYNC_STATUS_COMPLETE. + * + * \remarks + * CRI Movie may call CriMvFileReaderInterface::Close() before + * CriMvFileReaderInterface::GetReadStatus() returns ASYNC_STATUS_COMPLETE. + * + * \sa CriMvFileReaderInterface::GetReadStatus(), CriMvFileReaderInterface::GetReadSize() + */ + /*JP + * \brief 読み込み要求(即時復帰) + * \param buffer 書き出しバッファのポインタ。読み込み要求サイズを満たすだけのバッファを確保しておく必要があります。 + * \param req_size 読み込み要求サイズ。単位はバイト単位です。 + * + * ファイルの読み込み要求を出します。
+ * この関数は即時復帰の関数として呼び出されます。
+ * リード処理が終わったかどうかは CriMvFileReaderInterface::GetReadStatus() + * でチェックできるようにしてください。
+ * CRI Movie ライブラリはリード処理が終わる(= CriMvFileReaderInterface::GetReadStatus()が + * ASYNC_STATUS_COMPLETEを返す)前に、クローズ要求を呼び出す可能性があります。
+ * この関数は読み込んだサイズを返しません。
+ * 読み込み済みサイズは、 CriMvFileReaderInterface::GetReadStatus()が ASYNC_STATUS_COMPLETEを + * 返したあとに CriMvFileReaderInterface::GetReadSize()で返すように実装してください。 + * + * \sa CriMvFileReaderInterface::GetReadStatus(), CriMvFileReaderInterface::GetReadSize() + */ + /* pure */ virtual void Read(CriUint8 *buffer, CriSint64 req_size)=0; + + /*EN + * \brief Gets asynchronous status of a call to CriMvFileReaderInterface::Open() + * + * \return Status of the call + * + * While the Open() call is in process, this will return ASYNC_STATUS_BUSY.
+ * If the call fails, this will return ASYNC_STATUS_ERROR.
+ * On success, this will return ASYNC_STATUS_COMPLETE.
+ * + * \sa CriMvFileReaderInterface::Open() + */ + /*JP + * \brief オープンコマンドの状態取得 + * \return オープンコマンドの処理状態。 + * + * CriMvFileReaderInterface::Open関数の処理状態を取得します。 + * + * \sa CriMvFileReaderInterface::Open() + */ + /* pure */ virtual CriMvFileReaderInterface::AsyncStatus GetOpenStatus(void)=0; + + /*EN + * \brief Gets asynchronous status of a call to CriMvFileReaderInterface::Close() + * + * \return Status of the call + * + * While the Close() call is in process, this will return ASYNC_STATUS_BUSY.
+ * If the call fails, this will return ASYNC_STATUS_ERROR.
+ * On success, this will return ASYNC_STATUS_COMPLETE.
+ * + * \sa CriMvFileReaderInterface::Close() + */ + /*JP + * \brief クローズコマンドの状態取得 + * \return クローズコマンドの処理状態。 + * + * CriMvFileReaderInterface::Close関数の処理状態を取得します。 + * + * \sa CriMvFileReaderInterface::Close() + */ + /* pure */ virtual CriMvFileReaderInterface::AsyncStatus GetCloseStatus(void)=0; + + /*EN + * \brief Gets asynchronous status of a call to CriMvFileReaderInterface::Read() + * + * \return Status of the call + * + * While the Read() call is in process, this will return ASYNC_STATUS_BUSY.
+ * If the call fails, this will return ASYNC_STATUS_ERROR.
+ * On success, this will return ASYNC_STATUS_COMPLETE.
+ * + * \sa CriMvFileReaderInterface::Read() + */ + /*JP + * \brief リードコマンドの状態取得 + * \return リードコマンドの処理状態。 + * + * CriMvFileReaderInterface::Read関数の処理状態を取得します。 + * + * \sa CriMvFileReaderInterface::Read() + */ + /* pure */ virtual CriMvFileReaderInterface::AsyncStatus GetReadStatus(void)=0; + + /*EN + * \brief Gets the number of bytes read by a successful call to CriMvFileReaderInterface::Read() + * + * \return Number of bytes read + * + * Once CriMvFileReaderInterface::GetReadStatus() returns ASYNC_STATUS_COMPLETE, this + * function can be called to determine the number of bytes read by + * CriMvFileReaderInterface::Read().
+ * + * If no call to Read() has been made, this function will return 0.
+ * + * If called multiple times after completing the read, the same value will be returned each time. + * + * \sa CriMvFileReaderInterface::Read(), CriMvFileReaderInterface::GetReadStatus() + */ + /*JP + * \brief 前回読み込み要求に対する読み込み完了サイズ + * \return 読み込み完了サイズ。単位はByte。 + * + * 前回の読み込み要求に対して読み込み完了したサイズを返します。 + * まだ読み込みが1度も要求されていない場合は0を返します。 + * 読み込み完了後に繰り返しこの関数が呼び出された場合は、すべて同じ値を返します。 + * + * \sa CriMvFileReaderInterface::Read(), CriMvFileReaderInterface::GetReadStatus() + */ + /* pure */ virtual CriSint64 GetReadSize(void)=0; + + /*EN + * \brief Seeks to a new position in the file + * + * \param size Number of bytes to seek relative to \a offset + * \param offset Starting position of seek + * \return The offset, in bytes, from the previous file position. + * + * If \a offset is SEEK_FROM_BEGIN, seeking will start from the beginning of the file.
+ * If \a offset is SEEK_FROM_CURRENT, seeking will start from the current file position.
+ * If \a offset is SEEK_FROM_END, seeking will start from the end of the file.
+ * + * \sa CriMvFileReaderInterface::SeekOrigin + */ + /*JP + * \brief シーク + * \param size シークサイズ + * \param offset シークの開始位置 + * \return 実際にシークした距離。Byte単位。 + * + * \sa CriMvFileReaderInterface::SeekOrigin + * + */ + /* pure */ virtual CriSint64 Seek(CriSint64 size, CriMvFileReaderInterface::SeekOrigin offset)=0; + + /*EN + * \brief Gets the file size + * + * \return File size, in bytes + * + * This function can safely be called once CriMvFileReaderInterface::Open() has completed + * successfully. + * + * \sa CriMvFileReaderInterface::Open(), CriMvFileReaderInterface::GetOpenStatus() + */ + /*JP + * \brief ファイルサイズの取得 + * \return ファイルサイズ[byte]. + * + * この関数はファイルオープンの終了後に呼び出されます。 + * + * \sa CriMvFileReaderInterface::Open(), CriMvFileReaderInterface::GetOpenStatus() + */ + /* pure */ virtual CriSint64 GetFileSize(void)=0; + +protected: + virtual ~CriMvFileReaderInterface(void) {} +}; + +/*EN + * \brief Sound Interface Class for EasyPlayer + * \ingroup MDL_IF_SOUND + * + * \par + * A class derived from CriMvSoundInterface is required in order to play sound in CRI Movie. + * Pass an instance of this subclass to CriMvEasyPlayer::Create().
+ * + * If you do not need audio output, you can pass NULL instead. However, if you do, + * you can not use a movie timer of type MVEASY_TIMER_AUDIO. See CriMvEasyPlayer::SetMasterTimer() + * for more details.
+ * + * Sound data must be provided in either 32 or 16 bit PCM format. + * + * All functions are pure virtual. + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::SetMasterTimer(), CriMvEasyPlayer::TimerType + */ +/*JP + * \brief サウンド出力インタフェース + * \ingroup MDL_IF_SOUND + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::SetMasterTimer(), CriMvEasyPlayer::TimerType + */ +class CriMvSoundInterface +{ +public: + /*EN + * \brief The status of the Sound Module + * + * This is the return value of CriMvSoundInterface::GetStatus().
+ * + * After CriMvSoundInterface::Start() is called, the state transitions to MVEASY_SOUND_STATUS_EXEC.
+ * While the state is MVEASY_SOUND_STATUS_EXEC, the sound module calls the callback function + * to retrieve sound data as needed.
+ * When the EasyPlayer is stopped, or transits to MVEASY_STATUS_PLAYEND, + * CRI Movie will call CriMvSoundInterface::Stop(). Then, CRI Movie waits for + * CriMvSoundInterface::GetStatus() to return MVEASY_SOUND_STATUS_STOP, + * and calls CriMvSoundInterface::DestroyOutput(). + * + * \sa CriMvSoundInterface::GetStatus(), CriMvSoundInterface::Start(), + * CriMvSoundInterface::Stop(), CriMvSoundInterface::DestroyOutput() + */ + /*JP + * \brief サウンドモジュールの状態 + * + * サウンドモジュールの状態を表す列挙型です。
+ * CriMvEasyPlayer::GetStatus() の関数値です。
+ * CriMvSoundInterface::Start() が呼び出されるとMVEASY_SOUND_STATUS_EXEC状態になります。
+ * MVEASY_SOUND_STATUS_EXEC状態の間は、サウンド出力モジュールはコールバック関数を呼び出します。
+ * CRI Movie ライブラリは再生終了または再生停止指示を受けた場合、まず CriMvSoundInterface::Stop()を呼び出します。
+ * その後、STOP状態になるのを待ってから CriMvSoundInterface::DestroyOutput()を呼び出します。 + * + * \sa CriMvSoundInterface::GetStatus(), CriMvSoundInterface::Start(), + * CriMvSoundInterface::Stop(), CriMvSoundInterface::DestroyOutput() + */ + enum Status { + MVEASY_SOUND_STATUS_STOP, /*EN< No sound processing is happening. */ + /*JP< CRI Movie のサウンド出力をしていない状態 */ + MVEASY_SOUND_STATUS_EXEC, /*EN< Sound data is being retrieved and processed. */ + /*JP< CRI Movie のサウンド出力中 */ + MVEASY_SOUND_STATUS_ERROR, /*EN< An error has occurred. */ + /*JP< エラー状態 */ + + /* Keep enum 4bytes */ + MVEASY_SOUND_STATUS_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /*EN + * \brief PCM audio data format + * + * CRI Movie only operates on PCM encoded data. Two formats are supported: 32 bit floating + * point values, and 16 bit integer values. + * + * Return one of these values from CriMvSoundInterface::GetPcmFormat(). + * According to the returned format, CRI Movie calls a SetCallback for the specified PCM format. + * + * \sa CriMvSoundInterface::GetPcmFormat(), CriMvSoundInterface::SetCallbackGetFloat32PcmData(), + * CriMvSoundInterface::SetCallbackGetSint16PcmData() + */ + /*JP + * \brief PCMデータフォーマット + * + * PCMの出力フォーマットはPcmFormat型で定義されたいずれかでなければいけません。
+ * EasyPlayerは CriMvSoundInterface::GetPcmFormat()で取得できるデータ型のみ使用します。
+ * アプリケーションはこのクラスの全ての関数を実装しなければいけないので、使わないフォーマット + * のコールバック登録関数はカラ関数として実装してください。 + * + * \sa CriMvSoundInterface::GetPcmFormat(), CriMvSoundInterface::SetCallbackGetFloat32PcmData(), + * CriMvSoundInterface::SetCallbackGetSint16PcmData() + */ + enum PcmFormat { + MVEASY_PCM_FLOAT32, /*EN< PCM data is in 32 bit floating point format. */ + /*JP< 32bit 浮動小数型のPCMフォーマット */ + MVEASY_PCM_SINT16, /*EN< PCM data is in 16 bit integer format. */ + /*JP< 16bit 整数型のPCMフォーマット */ + + /* Keep enum 4bytes */ + MVEASY_PCM_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /*EN + * \brief Creates a sound output module + * \param heap Handle to a CriHeap object + * \param channel Number of sound channels (1 = monaural, 2 = stereo, 6 = 5.1ch) + * \param samplerate Sample rate of audio data (ex. 48000 = 48k) + * \return TRUE if the sound module was created successfully + * \return FALSE if there was an error + * + * Creates a CRI Movie sound output module and prepares it for use. Memory for the module + * is taken from the provided CriHeap object.
+ * + * CRI Movie calls this method once it has determined that a movie has an active audio track + * and has analyzed the number of channels (mono, stereo, 5.1ch, etc.) and the sample rate. + * + */ + /*JP + * \brief サウンド出力の作成 + * \param heap メモリハンドル + * \param channel 出力するサウンドのチャネル数 (1=monaural, 2=stereo, 6=5.1ch) + * \param samplerate サンプリングレート (ex. 48k = 48000) + * \return 作成結果。成功の場合はTRUE、失敗の場合はFALSEが返ります。 + * + * サウンド出力を作成します。
+ * この関数は CRI Movie が再生するサウンドが決定したあとに、そのサウンドのチャネル数や + * サンプリングレートを引数として実行されます。 + * + */ + /* pure */ virtual CriBool CreateOutput(CriHeap heap, CriUint32 channel, CriUint32 samplerate)=0; + + /*EN + * \brief Destroys the sound output module + * + * Deletes the sound output module that was created by + * CriMvSoundInterface::CreateOutput().
+ * + * CRI Movie calls this method once CriMvSoundInterface::GetStatus() returns MVEASY_SOUND_STATUS_STOP. + * + */ + /*JP + * \brief サウンド出力の破棄 + * + * サウンド出力を破棄します。
+ * この関数はサウンド出力が MVEASY_SOUND_STATUS_STOP 状態になった後に呼び出されます。 + * + */ + /* pure */ virtual void DestroyOutput(void)=0; + + /*EN + * \brief Gets the PCM format of audio data + * \return The type of PCM format supported by this CriMvSoundInterface instance + * + * CRI Movie supports audio data in one of two PCM formats: 32 bit floating point (MVEASY_PCM_FLOAT32) + * or 16 bit integer (MVEASY_PCM_SINT16). EasyPlayer uses the return value from this method to + * determine which format is being used, and will call the appropriate callback function to retrieve + * data samples. + * + * \sa CriMvSoundInterface::PcmFormat + */ + /*JP + * \brief PCMデータフォーマットの取得 + * \return CriMvSoundInterface が使用するPCMフォーマットを返します。 + * + * EasyPlayerはこの関数によって、出力するPCMフォーマットを判断します。 + * + * \sa CriMvSoundInterface::PcmFormat + */ + /* pure */ virtual PcmFormat GetPcmFormat(void)=0; + + /*EN + * \brief Sets the callback function for retrieving 32 bit floating point PCM sound samples + * \param func Function that is called when CriMvSoundInterface gets PCM data (32bit float) + * \param obj Pointer to user-specifed data, passed as the first argument to the callback + * + * Sets a function that CriMvSoundInterface will call when it needs audio data in 32 bit floating point + * PCM format. This callback function takes 4 arguments:
+ * + * - \a obj: The user-specified \a obj parameter passed to SetCallbackGetFloat32PcmData().
+ * - \a nch: The number of audio channels. Mono is 1, stereo is 2, 5.1 channel is 6.
+ * - \a pcmbuf: An array of buffers to hold the returned PCM data. There must be one element of + * this array for each channel.
+ * - \a req_nsmpl: The number of samples requested. Each buffer must be large enough to hold this + * many samples (i.e. \a nch * \a req_nsmpl). + * + * \remarks + * The maximum number of channels is CRIMV_PCM_BUFFER_MAX + * + * \sa CriMvSoundInterface::SetCallbackGetSint16PcmData() + */ + /*JP + * \brief 32bit形式でPCMデータを取得するコールバック関数の登録 + * \param func CriMvSoundInterface がPCMデータを要求する際に呼びだすコールバック関数 + * \param obj コールバック関数を実行する際に第一引数に指定するオブジェクト変数 + * + * CriMvSoundInterface がEasyPlayerにPCMデータを要求する際に呼び出すコールバック関数を登録します。 + * コールバック関数は4つの引数を持っています。
+ * - "obj" はコールバック関数内で使用するオブジェクトです。 + * コールバック関数を呼び出す際は、関数登録時に指定されたobjを必ずこの引数に入れてください。
+ * - "nch" は CriMvSoundInterface が要求するオーディオのチャネル数です。モノラルなら1。ステレオなら2。5.1chなら6となります。
+ * - "pcmbuf" はPCMデータを格納するためのバッファポインタ配列です。
+ * バッファの実体は CriMvSoundInterface で準備してください。バッファの数は"nch"と同じでなければいけません。
+ * - "req_nsmpl" は CriMvSoundInterface が要求するPCMデータの最大サンプル数です。
+ * "pcmbuf"で指定した各バッファ実体には、このサンプル数が書き込まれても大丈夫なだけの領域を必ず準備してください。
+ * + * 登録されたコールバック関数を呼び出すタイミングは CriMvSoundInterface の任意となります。 + * + * \sa CriMvSoundInterface::SetCallbackGetSint16PcmData() + */ + /* pure */ virtual void SetCallbackGetFloat32PcmData(CriUint32 (*func)(void *obj, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl), void *obj)=0; + + /*EN + * \brief Sets the callback function for retrieving 16 bit integer PCM sound samples + * \param func Function that will be called when 16 bit integer PCM data is needed + * \param obj Pointer to user-specifed data, passed as the first argument to the callback + * + * Sets a function that CriMvSoundInterface will call when it needs audio data in 16 bit integer + * PCM format. This callback function takes 4 arguments:
+ * + * - \a obj: The user-specified \a obj parameter passed to SetCallbackGetSint16PcmData().
+ * - \a nch: The number of audio channels. Mono is 1, stereo is 2, 5.1 channel is 6.
+ * - \a pcmbuf: An array of buffers to hold the returned PCM data. There must be one element of + * this array for each channel.
+ * - \a req_nsmpl: The number of samples requested. Each buffer must be large enough to hold this + * many samples (i.e. \a nch * \a req_nsmpl). + * + * \remarks + * The maximum number of channels is CRIMV_PCM_BUFFER_MAX (currently 8) + * + * \sa CriMvSoundInterface::SetCallbackGetFloat32PcmData() + */ + /*JP + * \brief 16bit形式でPCMデータを取得するコールバック関数の登録 + * \param func CriMvSoundInterface がPCMデータを要求する際に呼びだすコールバック関数 + * \param obj コールバック関数を実行する際に第一引数に指定するオブジェクト変数 + * + * PCMフォーマットが違う以外は、 CriMvSoundInterface::SetCallbackGetFloat32PcmData() と同じです。 + * + * \sa CriMvSoundInterface::SetCallbackGetFloat32PcmData() + */ + /* pure */ virtual void SetCallbackGetSint16PcmData(CriUint32 (*func)(void *obj, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl), void *obj)=0; + + /*EN + * \brief Starts sound output + * + * CRI Movie will call this method when it needs to start playing sound. The PCM data callback function + * has to be called after this function until movie playback is finished.
+ * + * Your sound module should begin incrementing its playback time when this method is called. + * + * \remarks + * On success, this should set the status to CriMvSoundInterface::MVEASY_SOUND_STATUS_EXEC. + */ + /*JP + * \brief サウンド出力の開始 + * + * サウンド出力を開始します。PCMデータ取得用コールバック関数は、本関数の呼出し後から実行してください。 + */ + /* pure */ virtual void Start(void)=0; + + /*EN + * \brief Stops sound output + * + * CRI Movie will call this when the movie playback stops, or the status changes to MVEASY_STATUS_PLAYEND.
+ * + * When EasyPlayer wants to pause and restart playback, it will call CriMvSoundInterface::Pause() + * instead of this method.
+ * + * Your sound module should set its playback time to 0 when this method is called. + * + * \remarks + * This should set the status to CriMvSoundInterface::MVEASY_SOUND_STATUS_STOP. + * + * \sa CriMvSoundInterface::Pause(), CriMvSoundInterface::Start() + */ + /*JP + * \brief サウンド出力の停止 + * + * サウンド出力を停止します。再開できるようにする必要はありません。
+ * EasyPlayerが再開処理を行いたい場合は、本関数ではなく、 CriMvSoundInterface::Pause()を呼び出します。
+ * CriMvSoundInterface::Stop() 呼出し後は、コルーバック関数を呼ばないように実装してください。 + * + * \sa CriMvSoundInterface::Pause(), CriMvSoundInterface::Stop() + */ + /* pure */ virtual void Stop(void)=0; + + /*EN + * \brief Gets status of sound module + * \return The module status + * + * This must return one of the enumerated values in CriMvSoundInterface::Status.
+ * + * While this method returns CriMvSoundInterface::MVEASY_SOUND_STATUS_EXEC, EasyPlayer will call the + * PCM data callback.
+ * When a movie has finished playing and this method returns CriMvSoundInterface::MVEASY_SOUND_STATUS_STOP, + * EasyPlayer will call CriMvSoundInterface::DestroyOutput(). + * + * \sa CriMvSoundInterface::Status + */ + /*JP + * \brief サウンドモジュールの状態取得 + * + * サウンドモジュールの状態を取得します。 + * + * \sa CriMvSoundInterface::Status + */ + /* pure */ virtual Status GetStatus(void)=0; + + /*EN + * \brief Pauses or resumes sound output + * \param sw Pause or resume playback. + * + * If \a sw is 1 (ON), output will be paused.
+ * If \a sw is 0 (OFF), output will be resumed.
+ * + * Temporarily pauses or resumes sound output.
+ * + * When you pause sound output, you must pause your playback timer as well. + */ + /*JP + * \brief サウンド出力の一時停止または再開 + * \param sw ポーズスイッチ。ポーズONの場合は1、ポーズOFF(レジューム)の場合は0を指定します。 + * + * 本関数の動作は引数に依存します。
+ * 引数 sw がON(1)なら、一時停止。引数 sw がOFF(0)ならサウンド出力再開です。 + */ + /* pure */ virtual void Pause(CriBool sw)=0; + + /*EN + * \brief Gets the time, in seconds, that sound has been playing + * \param count Playback time counter + * \param unit Counter increment per second + * + * CRI Movie calls this method periodically for some damn reason.
+ *
+ * The time, in seconds, is specified by \a count / \a unit.
+ * + * For example, if \a count was 500 and \a unit was 1000, that would be 0.5 seconds.
+ * + * \remarks + * Before Start() is called, and after Stop() is called, \a count should be 0. + */ + /*JP + * \brief 再生時刻の取得 + * \param count タイマカウント + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * + * タイマ時刻を取得します。時刻はcountとunitの二つの変数で表現します。
+ * count ÷ unit で秒単位の時刻となるような値を返します。
+ * 再生開始前( CriMvSoundInterface::Start()呼び出し前)および + * 再生停止後( CriMvSoundInterface::Stop()呼び出し後)は、時刻0(タイマカウントが0)を返します。 + */ + /* pure */ virtual void GetTime(CriUint64 &count, CriUint64 &unit)=0; // sec = count / unit. + +protected: + virtual ~CriMvSoundInterface(void) {} +}; + +/*EN + * \brief System Timer Interface Class for EasyPlayer + * \ingroup MDL_IF_TIMER + * + * If you want to synchronize video frames with something other than the audio track, or if you + * need to play a movie that does not have an audio track, you will need to pass an instance of + * a class derived from CriMvSystemTimerInterface to CriMvEasyPlayer::Create().
+ * + * If you do not need any special timer facilities, you can pass NULL to CriMvEasyPlayer::Create() instead.
+ * + * All functions are pure virtual. + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::SyncMasterTimer() + */ +/*JP + * \brief システムタイマーインタフェース for EasyPlayer + * \ingroup MDL_IF_TIMER + * + * システムタイマーは音無しムービ再生時に、ビデオフレームの送出タイミングを調整するために使用されます。
+ * このクラスを定義することで、自前のタイマシステムを使ってEasyPlayerのストリーミング再生が可能になります。
+ * 全ての関数は純粋仮想関数として定義されているので、全ての関数を必ず実装してください。 + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::SyncMasterTimer() + */ +class CriMvSystemTimerInterface +{ +public: + /*EN + * \brief Starts timer and resets it to 0 + * + * When this method is called, your internal counter should initialize itself to 0 and start + * normal operation. + */ + /*JP + * \brief タイマ開始 + * + * タイマのカウントを開始します。この関数が呼ばれた時が時刻0となります。 + */ + /* pure */ virtual void Start(void)=0; + + /*EN + * \brief Stops the timer and resets it to 0 + * + * When this method is called, your internal counter should stop incrementing, and re-initialize + * itself to 0. After this method has been called, CriMvSystemTimerInterface::GetTime() must + * return a time of 0 seconds. + */ + /*JP + * \brief タイマ停止 + * + * タイマのカウントを停止します。この関数が呼ばれたあとに、そのタイマを再開することはありません。 + */ + /* pure */ virtual void Stop(void)=0; + + /*EN + * \brief Pauses or resumes the timer + * + * \param sw Pause or resume timer operation. + * + * If \a sw is 1 (ON), the timer will be paused.
+ * If \a sw is 0 (OFF), the timer will be resumed.
+ * + * Temporarily pauses or resumes the timer.
+ * + * When you pause the timer, you must maintain the previous value of the counter. + */ + /*JP + * \brief タイマの一時停止または再開 + * \param sw ポーズスイッチ。ON(1)なら一時停止、OFF(0)なら再開。 + * + * 本関数の動作は引数に依存します。
+ * 引数 sw がON(1)なら、一時停止。引数 sw がOFF(0)ならタイマカウント再開です。 + */ + /* pure */ virtual void Pause(CriBool sw)=0; + + /*EN + * \brief Gets the time, in seconds, that the timer has been running + * + * \param count Timer counter + * \param unit Counter increment per second + * + * CRI Movie calls this method periodically to synchronize video playback with the + * movie's internal framerate.
+ *
+ * The time, in seconds, is specified by \a count / \a unit.
+ * + * For example, if \a count was 500 and \a unit was 1000, that would be 0.5 seconds.
+ * + * \remarks + * Before Start() is called, and after Stop() is called, \a count should be 0. + */ + /*JP + * \brief 経過時刻の取得 + * \param count タイマカウント + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * + * タイマ時刻を取得します。時刻はcountとunitの二つの変数で表現します。
+ * count ÷ unit で秒単位の時刻となるような値を返します。
+ * 再生開始前( CriMvSystemTimerInterface::Start()呼び出し前)および + * 再生停止後( CriMvSystemTimerInterface::Stop()呼び出し後)は、時刻0(タイマカウントが0)を返します。 + */ + /* pure */ virtual void GetTime(CriUint64 &count, CriUint64 &unit)=0; + +protected: + virtual ~CriMvSystemTimerInterface(void) {} +}; + + +/*EN + * \brief EasyPlayer Interface class for CRI Movie + * \ingroup MDL_EASY_PLAYER + */ +/*JP + * \brief EasyPlayerインタフェース + * \ingroup MDL_EASY_PLAYER + */ +class CriMvEasyPlayer : public CriAllocator +{ +public: + /*EN + * \brief The possible states an EasyPlayer handle can be in. + * + * An EasyPlayer handle takes on various states, depending on where it is in the decoding process. + * You can check the status of a valid EasyPlayer handle at any time by calling CriMvEasyPlayer::GetStatus(). + * + * An EasyPlayer handle is created in the MVEASY_STATUS_STOP state. During movie playback, the status + * transitions through various states from MVEASY_STATUS_STOP to MVEASY_STATUS_PLAYEND. + * + * An application does not need to check all states. At a minimum, it only needs to check for + * MVEASY_STATUS_STOP, MVEASY_STATUS_PLAYING, MVEASY_STATUS_PLAYEND, + * and MVEASY_STATUS_ERROR. + * + * If an application calls CriMvEasyPlayer::DecodeHeader(), the status of the EasyPlayer handle will change to + * MVEASY_STATUS_WAIT_PREP when CRI Movie has finished analyzing the movie information. The EasyPlayer + * handle will remain in this state until the application calls CriMvEasyPlayer::Prepare() or + * CriMvEasyPlayer::Start(). Once the state has changed to MVEASY_STATUS_WAIT_PREP, information + * about the movie can be retrieved by calling CriMvEasyPlayer::GetMovieInfo(). + * + * If an application calls CriMvEasyPlayer::Prepare(), the EasyPlayer handle status will change to + * MVEASY_STATUS_READY once CRI Movie has finished buffering enough input and decoded output for playback. + * The handle will remain in this state until CriMvEasyPlayer::Start() is called. This allows the application + * to better control playback timing, since a movie can immediately start playing. + * + * Once CriMvEasyPlayer::Start() is called and the movie is actively playing, the status will alternate + * between MVEASY_STATUS_PLAYING and MVEASY_STATUS_PREP, as CRI Movie plays back frames and decodes + * new ones. + * + * When the movie has finished playing normally, the status of the EasyPlayer handle will automatically change + * to MVEASY_STATUS_PLAYEND. If the movie is in looping mode, however, once the movie reaches the + * end, it will start playing from the beginning and the status will not change to MVEASY_STATUS_PLAYEND. + * + * When CriMvEasyPlayer::Stop() is called, the status of the handle will change to MVEASY_STATUS_STOP + * once it has finished any decoding and playback that is in progress. This does not happen immediately, + * but will take a few cycles. + * + * If there are any problems during playback, for instance insufficient memory or invalid input data, the + * status will change to MVEASY_STATUS_ERROR. When the handle is in state MVEASY_STATUS_ERROR, + * the application must call CriMvEasyPlayer::Stop() and wait until the state changes to MVEASY_STATUS_STOP + * before doing anything else with the handle. + * + * Once the state is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, the handle can be deleted by + * calling CriMvEasyPlayer::Destroy(). + * + * \attention + * As of CRI Movie version 2.00, the handling of the MVEASY_STATUS_ERROR state has changed. Previously, + * a handle could be destroyed when it was in the MVEASY_STATUS_ERROR state. Now, an application + * must call CriMvEasyPlayer::Stop() and wait for the MVEASY_STATUS_STOP state before destroying + * the handle. + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::Start(), CriMvEasyPlayer::DecodeHeader(), + * CriMvEasyPlayer::Prepare(), CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::Stop(), + * CriMvEasyPlayer::Destroy() + */ + /*JP + * \brief EasyPlayerハンドル状態 + * + * EasyPlayer のハンドル状態です。 + * ハンドル状態は CriMvEasyPlayer::GetStatus() でいつでも取得することが出来ます。
+ * ハンドル作成直後は MVEASY_STATUS_STOP 状態です。 + * + * ハンドル状態は MVEASY_STATUS_STOP から MVEASY_STATUS_PLAYEND まで順に遷移していきます。
+ * アプリケーションがムービを再生するにあたって、必ずしもこの全ての状態をチェックする必要はありません。
+ * 最低限、MVEASY_STATUS_STOP, MVEASY_STATUS_PLAYING, MVEASY_STATUS_PLAYEND, MVEASY_STATUS_ERROR さえ + * チェックすれば、ムービの再生を行うことができます。 + * + * EasyPlayer ハンドル作成後、ムービの解像度などが既に確定している場合は、アプリケーションは + * CriMvEasyPlayer::Start() を直接呼び出すことができます。この場合、ハンドル状態は自動的に + * MVEASY_STATUS_PLAYEND まで遷移していきます。 + * + * 最初に CriMvEasyPlayer::DecodeHeader() を呼び出した場合は、ヘッダ解析が終了するとハンドル状態は + * MVEASY_STATUS_WAIT_PREP となり、アプリケーションから CriMvEasyPlayer::Prepare() または + * CriMvEasyPlayer::Start() が呼ばれるまで待機します。 + * + * MVEASY_STATUS_WAIT_PREP状態以降、 CriMvEasyPlayer::GetMovieInfo() でムービ情報を取得することができます。
+ * CriMvEasyPlayer::Prepare() を呼び出した場合は、ヘッダ解析およびデータのバッファリングが終わると、 + * ハンドル状態は MVEASY_STATUS_READY となり、アプリケーションから CriMvEasyPlayer::Start() が + * 呼ばれるまで待機します。これによって再生開始のタイミングを調整することができます。 + * + * 再生が終了すると自動的に MVEASY_STATUS_PLAYEND になります。 + * + * CriMvEasyPlayer::Stop() を呼び出した場合は、デコーダの停止処理が終わったあとに MVEASY_STATUS_STOP + * 状態になります。 CriMvEasyPlayer::Stop() 終了直後に停止状態になるとは限りません。 + * + * メモリ不足やデータエラーなど何らかの問題が発生した場合は MVEASY_STATUS_ERROR 状態となります。
+ * MVEASY_STATUS_ERROR 状態になった場合は CriMvEasyPlayer::Stop() を呼び出してハンドル状態が + * MVEASY_STATUS_STOP 状態に遷移させてください。
+ * + * CriMvEasyPlayer::Destroy() は MVEASY_STATUS_STOP, MVEASY_STATUS_PLAYEND の + * いずれかの状態の時のみ呼び出すことができます。 + * + * \attention + * CRI Movie Ver.2.00 で MVEASY_STATUS_ERROR 状態についての仕様が変更になりました。
+ * MVEASY_STATUS_ERROR 状態でハンドル破棄が出来なくなり、 CriMvEasyPlay::Stop() を呼び出す必要があります。 + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::Start(), CriMvEasyPlayer::DecodeHeader(), + * CriMvEasyPlayer::Prepare(), CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::Stop(), + * CriMvEasyPlayer::Destroy() + */ + enum Status { + MVEASY_STATUS_STOP, /*EN< Standstill. No processing is happening. + * EasyPlayer handles are created in this state. */ + /*JP< 停止中 */ + MVEASY_STATUS_DECHDR, /*EN< The EasyPlayer handle is now parsing the movie header, + * including information about the width and height of the video stream. */ + /*JP< ヘッダ解析中 */ + MVEASY_STATUS_WAIT_PREP, /*EN< The EasyPlayer handle is a waiting for the work buffer to be allocated. */ + /*JP< バッファリング開始待機中 */ + MVEASY_STATUS_PREP, /*EN< The EasyPlayer handle is now buffering video and audio data. */ + /*JP< 再生準備中 */ + MVEASY_STATUS_READY, /*EN< Ready to start playback. */ + /*JP< 再生待機 */ + MVEASY_STATUS_PLAYING, /*EN< The decoders are currently decoding and playing output. */ + /*JP< 再生中 */ + MVEASY_STATUS_PLAYEND, /*EN< The end of the movie has been reached. */ + /*JP< 再生終了 */ + MVEASY_STATUS_ERROR, /*EN< An error has occurred. */ + /*JP< エラー */ + + /* Keep enum 4bytes */ + MVEASY_STATUS_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /*EN + * \brief Supported timer types; used to synchronize video frames. + */ + /*JP + * \brief タイマ種別 + */ + enum TimerType { + MVEASY_TIMER_NONE, /*EN< No synchronization. The output is available as soon as + * each frame is decoded. */ + /*JP< ビデオフレームは時刻同期をしません。デコードが終わったフレーム + * はすぐに取得することができます。 */ + MVEASY_TIMER_SYSTEM, /*EN< Video frames synchronize to the system timer.
+ * You must provide an instance of CriMvSystemTimerInterface to + * CriMvEasyPlayer::Create(). */ + /*JP< ビデオフレームはシステム時刻に同期します。システム時刻はアプリケーション + * が CriMvSystemTimerInterface としてCriMvEasyハンドルに設定する必要があります。 */ + MVEASY_TIMER_AUDIO, /*EN< Video frames synchronize with the movie's audio data.
+ * You must provide an instance of CriMvSoundInterface to CriMvEasyPlayer::Create().
+ * If the movie does not have audio, video frames will synchronize with the system timer. */ + /*JP< ビデオフレームはムービのオーディオ時刻に同期します。 + * アプリケーションは GetTime関数を含む CriMvSoundInterface をCriMvEasy + * ハンドルに設定する必要があります。もしもムービデータにオーディオが含まれて + * いない場合は、ビデオはシステム時刻に同期します。 */ + + /* Keep enum 4bytes */ + MVEASY_TIMER_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /*EN + * \ingroup MODULE_INIT + * + * \brief Creates an EasyPlayer handle + * + * \param heap Handle to a CriHeap object + * \param freader File input interface + * \param stimer System timer interface + * \param sound Sound module interface + * \param err Optional error code + * + * \return A valid CriMvEasyPlayer handle, or NULL if the handle cannot be allocated + * + * Creates and initialize a new EasyPlayer handle. Its status is initially MVEASY_STATUS_STOP. + * Memory for the handle is allocated from the provided CriHeap object. + * + * If memory allocation fails, this function will return NULL. Be sure to initialize and create + * your heap with criHeap_Initialize() and criHeap_Create() before calling this function. + * + * \remarks + * CriMv::Initialize() must be called before calling this function. + * + */ + /*JP + * \ingroup MODULE_INIT + * \brief EasyPlayerハンドルの作成 + * \param heap CriHeapハンドル + * \param freader ファイル読み込みインタフェース + * \param stimer システムタイマインタフェース + * \param sound サウンドインタフェース + * \param err エラー情報 + * \return CriMvEasyハンドルを返します。エラーが発生した場合は、NULLを返します。 + * + * 本関数は CriMv::Initialize() 呼び出しよりもに実行してください。
+ * ハンドル作成後はハンドル状態はMVEASY_STATUS_STOPとなります。
+ * ハンドル確保に必要なメモリは全て、引数で渡された CriHeap を使って確保されます。
+ * メモリ不足などでエラーが発生した場合は、本関数はNULLを返します。 + * + */ + static CriMvEasyPlayer* CRIAPI Create(CriHeap heap, + CriMvFileReaderInterface *freader, + CriMvSystemTimerInterface *stimer, + CriMvSoundInterface *sound, + CriError &err=CriMv::ErrorContainer); + /*EN + * \ingroup MODULE_INIT + * \brief Destroy a handle + * \param err Optional error code + * + * \ingroup MODULE_INIT + * + * \brief Destroys an EasyPlayer handle + * \param err Optional error code + * + * Destroys an EasyPlayer handle previously created with CriMvEasyPlayer::Create(), and frees its resources. + * + * An EasyPlayer handle can only be destroyed when it is in the MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND state. + * Attempting to destroy a handle when it is in any other state will cause an error. + * + * Any work buffers allocated via CriHeap, if still associated with the handle, are freed by this call. + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::Status, CriMvEasyPlayer::GetStatus() + */ + /*JP + * \ingroup MODULE_INIT + * \brief EasyPlayerハンドルの破棄 + * \param err エラー情報(省略可) + * + * CriMvEasyPlayer::Create()で作成したEasyPlayerハンドルを破棄します。 + * + * ハンドル状態が MVEASY_STATUS_STOP 、 MVEASY_STATUS_PLAYEND の時にのみハンドルを破棄することができます。
+ * それ以外の状態で呼び出した場合は、エラーになります。
+ * + * ハンドル状態が MVEASY_STATUS_ERROR だった場合は、CriMvEasyPlayer::Stop() を呼び出して + * MVEASY_STATUS_STOP 状態になってからハンドル破棄してください。
+ * ハンドル状態は CriMvEasyPlayer::GetStatus() で確認することができます。 + * + * ハンドル作成時に指定したCriHeapによって確保されたメモリで未解放の全ては、 + * この関数の呼び出しによって解放されます。 + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::Status, CriMvEasyPlayer::GetStatus() + */ + void Destroy(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_BASIC + * + * \brief Returns status of an EasyPlayer handle. + * \param err Optional error code + * \return Handle status + * + * Returns the current status of an EasyPlayer handle. The status will be one of the values + * defined by CriMvEasyPlayer::Status. + * + * \sa CriMvEasyPlayer::Status + */ + /*JP + * \ingroup MODULE_BASIC + * \brief ハンドル状態の取得 + * \param err エラー情報(省略可) + * \return ハンドル状態 CriMvEasyPlayer::Status + * + * ハンドル状態を取得します。 + * + * \sa CriMvEasyPlayer::Status + */ + Status GetStatus(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_BASIC + * + * \brief Executes heatbeat functions for an EasyPlayer handle + * \param err Optional error code + * + * Performs regular processing for an EasyPlayer handle, including handoff and parsing of input + * buffers, and audio decoding. Additionally, it checks for situations where the handle state + * should change to one of the values defined by CriMvEasyPlayer::Status, and changes state as + * necessary. + * + * This function and CriMvEasyPlayer::ExecuteDecode() should be called periodically during movie + * playback or when waiting for CriMvEasyPlayer::DecodeHeader() to complete. It takes a relatively + * low CPU load, and should typically be called on every vertical blank. + * + * \remarks + * Note that this function does not perform any video decoding. Decoding is done in + * CriMvEasyPlayer::ExecuteDecode(). + * + * \sa CriMvEasyPlayer::Status, CriMvEasyPlayer::ExecuteDecode(), CriMvEasyPlayer::DecodeHeader() + */ + /*JP + * \ingroup MODULE_BASIC + * \brief EasyPlayerサーバ関数 + * \param err エラー情報(省略可) + * + * ムービのヘッダ解析や入力バッファ制御、オーディオデコード等を行います。
+ * EasyPlayer ハンドルの状態遷移もこの関数で行います。
+ * この関数はビデオのデコードは行いません。そのためCPU負荷はあまり高くなりません。
+ * 本関数はアプリケーションのメインループで毎回呼び出すようにしてください。 + * + * \sa CriMvEasyPlayer::Status + */ + void Update(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_BASIC + * + * \brief Synchronizes the master timer of an EasyPlayer handle. + * \param err Optional error code + * + * Synchronizes the timing of video frames to the master timer used by this EasyPlayer handle. + * If the master timer is of type MVEASY_TIMER_AUDIO and the movie does not have audio, + * EasyPlayer will use the system timer that was set when the handle was created. + * + * \sa CriMvEasyPlayer::TimerType, CriMvEasyPlayer::SetMasterTimer(), CriMvSystemTimerInterface + */ + /*JP + * \ingroup MODULE_BASIC + * \brief マスタタイマへの同期 + * \param err エラー情報(省略可) + * + * ムービ再生時刻をマスタタイマに同期させます。
+ * マスタタイマは CriMvEasyPlayer::SetMasterTimer() によって指定されたタイマを使います。
+ * タイマ種別として MVEASY_TIMER_AUDIO が指定されていて、再生するムービにオーディオが + * 含まれていない場合は、ハンドル作成時のシステムタイマを使用します。 + * + * この関数は、ハンドル作成時に指定したシステムタイマインタフェースの + * CriMvSystemTimerInterface::GetTime() を呼び出します。 + * + * \sa CriMvEasyPlayer::TimerType, CriMvEasyPlayer::SetMasterTimer(), CriMvSystemTimerInterface + */ + void SyncMasterTimer(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_BASIC + * + * \brief Decodes a video frame + * \param err Optional error code + * \return \a TRUE If the movie is currently in a playback state + * \return \a FALSE If the movie is not playing + * + * Performs the actual video decoding. Each call to this function decodes a single frame. + * It does not return until the frame has been decoded. + * + * Video decoding can impose a very heavy CPU load, so calling this function from an application's + * main thread may cause your application to miss the vertical blank interval. To avoid this situation, + * ExecuteDecode() can be called from a separate, lower-priority thread. See the Mutithreaded Decoding + * tutorial for a full explanation. + * + * The return value describes the movie playback state. If TRUE, the movie is currently playing + * (or decoding the movie header) or ready to play. If FALSE, playback has not yet been started, + * or playback has finished. + * + * If a decoding thread is used, an application must wait until this function returns FALSE before destroying + * the thread. Otherwise, the handle state will not transition to MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, + * and the EasyPlayer handle cannot be destroyed. + * + * \attention + * ExecuteDecode() is the only CRI Movie function that is safe to call from a separate thread. + * No other CRI Movie functions should be considered to be thead-safe. + * + */ + /*JP + * \ingroup MODULE_BASIC + * \brief ビデオデコード + * \param err エラー情報(省略可) + * \return ムービ再生中はTRUE 、再生終了また停止後はFALSEを返します。 + * + * ビデオデータのデコードを行います。
+ * 本関数は1ピクチャ分のデコードを終わるまで終了しません。
+ * ピクチャデコードは負荷の高い処理なので、アプリケーションのメインスレッドから呼び出すと処理落ちが発生する可能性があります。
+ * その場合は、メインスレッドよりも優先度の低い別スレッドから呼び出すようにしてください。 + * + * 本関数の返り値は、ムービ再生の実行中かどうかを表しています。
+ * デコード用スレッドを終了する場合は、返り値がFALSEになるのを待たなければいけません。
+ * 返り値がTRUEの間にデコードスレッドを終了してしまうと、ハンドルの状態が MVEASY_STATUS_STOP や + * MVEASY_STATUS_PLAYEND に遷移できず、ハンドル破棄が出来なくなります。
+ * + */ + CriBool ExecuteDecode(CriError &err=CriMv::ErrorContainer); + + /* 再生制御 */ + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Sets the name of the movie file to play + * \param fname Name of the movie file + * \param err Optional error code + * + * Sets the name of the movie file to play, but does not open the file. The length of the filename + * (including path) is limited to CRIMV_MAX_FILE_NAME characters. EasyPlayer copies this + * string to internal memory, so a temporary variable can be used. + * + * If an application plays the same movie repeatedly, it only needs to call this function once. + * + * Multiple calls to this function will overwrite previous values. Calling CriMvEasyPlayer::SetData() + * will clear any filename set by this function. + * + * \remarks + * This function can only be called when the handle status is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, + * or from the file request callback. See CriMvEasyPlayer::SetFileRequestCallback() for details. + * + * \remarks + * Calling this function does not open the file. The file is opened by a call to CriMvEasyPlayer::Update(). + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetData() + */ + /*JP + * \ingroup MODULE_CONTROL + * + * \brief 再生ファイルの指定 + * \param fname ムービファイルパス + * \param err エラー情報(省略可) + * + * 再生するムービのファイルパスを設定します。ファイルパスの最大長は CRIMV_MAX_FILE_NAME バイトです。
+ * EasyPlayerは内部でこのファイルパスをコピーするので、引数で渡した文字列は破棄してもかまいません。 + * + * 同じファイルを繰り返し再生する場合は、この関数を再度呼び出す必要はありません。 + * + * この関数を呼び出した直後にもう一度この関数を呼び出すと、前回のファイル情報は新しいファイル情報に上書きされます。 + * CriMvEasyPlayer::SetData()関数を呼び出した場合は、事前に設定したファイル情報がクリアされます。 + * + * \para 備考1: + * この関数はハンドル状態が MVEASY_STATUS_STOP もしくは MVEASY_STATUS_PLAYEND時のみ呼び出し可能です。 + * またはファイル要求コールバック関数内でもこの関数を呼び出すことができます。詳細は CriMvEasyPlayer::SetFileRequestCallback()関数を + * 参照してください。 + * + * \para 備考2: + * この関数の内部ではファイルのオープン要求はしません。ファイルのオープン処理は CriMvEasyPlayer::Update() 関数の中で行われます。 + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetData(), CriMvEasyPlayer::SetFileRange() + */ + void SetFile(CriChar8 *fname, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Sets in-memory movie data + * \param dataptr Pointer to movie data + * \param datasize Size of data, in bytes + * \param err Optional error code + * + * Sets the in-memory data buffer for this EasyPlayer handle to point to the provided buffer, + * but does not attempt to read that buffer. After this call, the memory pointed to by \a dataptr + * belongs to CRI Movie and must remain valid until playback is complete. + * + * If an application plays the same movie data repeatedly, it only needs to call this function once. + * + * Multiple calls to this function will overwrite previous values. Calling CriMvEasyPlayer::SetFile() + * will clear any pointer set by this function. + * + * \remarks + * This function can only be called when the handle status is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, + * or from the file request callback. See CriMvEasyPlayer::SetFileRequestCallback() for details. + * + * \remarks + * Calling this function does not attempt to reference the memory. The memory read is initiated by a call + * to CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start(). + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetFile(), CriMvEasyPlayer::SetFileRange() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief メモリ上データの指定 + * \param dataptr データポインタ + * \param datasize データサイズ + * \param err エラー情報(省略可) + * + * この関数はEasyPlayerのハンドル状態がMVEASY_STATUS_STOPかMVEASY_STATUS_PLAYENDの時に呼び出してください。
+ * または、ファイル要求コールバックの内部で呼び出すことができます。
+ * + * 本関数を繰り返し呼び出した場合は、メモリ情報は上書きされます。
+ * CriMvEasyPlayer::SetFile()を呼び出した場合は、本関数で指定したメモリ情報はハンドル内から消去されます。 + * + * 同じハンドルで同じムービデータを繰り返し再生する場合は、本関数の呼び出しは省略することができます。 + * + * 指定されたメモリ領域に実際にアクセスするのは、 CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Prepare(), + * CriMvEasyPlayer::Start() のいずれかが呼び出された時以降です。
+ * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetFile(), CriMvEasyPlayer::SetFileRange() + */ + void SetData(CriUint8 *dataptr, CriUint32 datasize, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * \brief Set a pack file and pass offset and range of movie file to an EasyPlayer handle + * \param fname File name string pointer of the pack file + * \param offset offset in byte to movie data in the packing file [in bytes] + * \param range size of movie data from the offset in the packing file [in bytes] + * \param err Optional error code + * + * Sets the name of the pack file that contains the movie file to play. + * EasyPlayer tries to read data from 'offset' through 'range' in the pack file as the movie data. + * Passing a negative value as range, EasyPlayer reads data until the end of the pack file. + * + * The length of file name is limited until CRIMV_MAX_FILE_NAME. + * EasyPlayer handle copies the file name string into the handle. + * You can use a temporary variable as the file name string. + * + * If an application plays the same movie repeatedly, it only needs to call this function once. + * + * Multiple calls to this function will overwrite previous values. Calling CriMvEasyPlayer::SetData() + * will clear any filename set by this function. + * + * \remarks + * This function can only be called when the handle status is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, + * or from the file request callback. See CriMvEasyPlayer::SetFileRequestCallback() for details. + * + * \remarks + * Calling this function does not open the file. The file is opened by a call to CriMvEasyPlayer::Update(). + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetData(), CriMvEasyPlayer::SetFile() + */ + /*JP + * \ingroup MODULE_CONTROL + * + * \brief 再生したいムービファイルを含むパックファイルの指定 + * \param fname パックファイル名 (パスを含む) + * \param offset パックファイル内のムービデータまでのオフセット (単位: バイト) + * \param range パックファイル内のムービデータのサイズ (単位:バイト) + * \param err エラー情報(省略可) + * + * 再生するムービを含むパックファイルを指定します。引数で指定した offset 位置から range サイズ分までをパックファイル内に含まれるムービデータみなします。 + * rangeに負値を入力するとパックファイルの終端までをムービとして読み込みます。 + * + * パックファイルのファイルパスの最大長は CRIMV_MAX_FILE_NAME バイトです。 + * EasyPlayerは内部でこのファイルパスをコピーするので、引数で渡した文字列は破棄してもかまいません。 + * + * 同じファイルを繰り返し再生する場合は、この関数を再度呼び出す必要はありません。 + * + * この関数を呼び出した直後に、もう一度この関数を呼び出すと、前回のファイル情報は新しいファイル情報に上書きされます。 + * CriMvEasyPlayer::SetData()関数を呼び出した場合は、事前に設定したファイル情報がクリアされます。 + * + * \para 備考1: + * この関数はハンドル状態が MVEASY_STATUS_STOP もしくは MVEASY_STATUS_PLAYEND時のみ呼び出し可能です。 + * またはファイル要求コールバック関数内でもこの関数を呼び出すことができます。詳細は CriMvEasyPlayer::SetFileRequestCallback()関数を + * 参照してください。 + * + * \para 備考2: + * この関数の内部ではファイルのオープン要求はしません。ファイルのオープン処理は CriMvEasyPlayer::Update() 関数の中で行われます。 + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetData(), CriMvEasyPlayer::SetFile() + */ + void SetFileRange(CriChar8 *fname, CriUint64 offset, CriSint64 range, CriError &err=CriMv::ErrorContainer); + + /* 前回のムービデータをもう一度登録する(ファイル要求コールバック関数でのみ呼ぶこと) */ + void SetPreviousDataAgain(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Reads movie header and analyzes movie information + * \param err Optional error code + * + * This function opens the movie file, reads the header, and starts to analyze the movie data. + * It does not start movie playback. + * + * When this function is called, the handle status changes to MVEASY_STATUS_DECHDR. Once EasyPlayer + * has finished reading the header and analyzing the movie, the status changes to MVEASY_STATUS_WAIT_PREP. + * When the status is MVEASY_STATUS_WAIT_PREP, CriMvEasyPlayer::GetMovieInfo() can be successfully called. + * + * To continue playback, call CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start() when the handle status + * is MVEASY_STATUS_WAIT_PREP. + * + * \remarks + * This function can only be called when the handle status is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND. + * + * \remarks + * You must either call CriMvEasyPlayer::SetFile() or CriMvEasyPlayer::SetData(), or provide a file request + * callback with CriMvEasyPlayer::SetFileRequestCallback(), before calling this function. + * + * \remarks + * Once this function has been called, CriMvEasyPlayer::ExecuteDecode() and CriMvEasyPlayer::Update() must be + * called periodically in order for this function to have any effect. Otherwise, the handle status will + * never change. + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::Prepare(), CriMvEasyPlayer::Start(), + * CriMvEasyPlayer::SetFileRequestCallback(), + * CriMvEasyPlayer::ExecuteDecode(), CriMvEasyPlayer::Update() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief ムービヘッダ解析 + * \param err エラー情報(省略可) + * + * ムービの再生は開始せず、ヘッダ解析のみ行って待機するための関数です。
+ * この関数を使用してヘッダ解析を事前に済ませることにより、再生開始前にムービの解像度やオーディオの情報を + * 得ることができます。
+ * 本関数を呼び出すと、EasyPlayerのハンドル状態はMVEASY_STATUS_STOP → MVEASY_STATUS_DECHDR と遷移していき、 + * ヘッダ解析が完了するとMVEASY_STATUS_WAIT_PREPとなります。
+ * ムービ情報を取得するには、ハンドル状態がMVEASY_STATUS_WAIT_PREPになったあとに CriMvEasyPlayer::GetMovieInfo() + * を実行してください。
+ * + * ハンドル状態がMVEASY_STATUS_WAIT_PREPの時に、 CriMvEasyPlayer::Prepare() か CriMvEasyPlayer::Start() を + * 呼ぶことで再生処理を続けることができます。
+ * + * 本関数は EasyPlayerのハンドル状態がMVEASY_STATUS_STOPかMVEASY_STATUS_PLAYENDの時に呼び出してください。 + * + * 本関数を呼び出す前に CriMvEasyPlayer::SetFile() か CriMvEasyPlayer::SetData() でムービデータを指定してください。
+ * ただし、ファイル要求コールバック関数を登録している場合は事前のムービデータ設定は省略することだきます。 + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::Prepare(), CriMvEasyPlayer::Start(), CriMvEasyPlayer::SetFileRequestCallback() + */ + void DecodeHeader(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Reads movie header, analyzes movie information, and buffers data. + * \param err Optional error code + * + * This function opens the movie file and gets it ready for immediate playback, by reading and analyzing + * the header and decoding and buffering video data. It allows a movie to start playing immediately when + * CriMvEasyPlayer::Start() is called, without an initial delay. + * + * When this function is called, the handle status changes to MVEASY_STATUS_DECHDR. Once EasyPlayer + * has finished reading and analyzing the movie data, the status changes to MVEASY_STATUS_PREP and EasyPlayer + * begins decoding video data. When the initial video data has been decoded and buffered, the status changes to + * MVEASY_STATUS_READY. + * + * The amount of data that is buffered, in seconds, is based on the value set by CriMvEasyPlayer::SetBufferingTime(). + * By default, this is 1 second. + * + * When the status is MVEASY_STATUS_READY, movie playback will start imediately when CriMvEasyPlayer::Start() + * is called. + * + * \remarks + * Unless you CriMvEasyPlayer::DecodeHeader() first, this function can only be called when the handle status + * is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND. + * + * \remarks + * You must either call CriMvEasyPlayer::SetFile() or CriMvEasyPlayer::SetData(), or provide a file request + * callback with CriMvEasyPlayer::SetFileRequestCallback(), before calling this function. + * + * \remarks + * Once this function has been called, CriMvEasyPlayer::ExecuteDecode() and CriMvEasyPlayer::Update() must be + * called periodically in order for this function to have any effect. Otherwise, the handle status will + * never change. + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Start(), + * CriMvEasyPlayer::SetBufferingTime(), CriMvInputBufferInfo + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief 再生準備(ヘッダ解析とバッファリング) + * \param err エラー情報(省略可) + * + * ムービの再生は開始せず、ヘッダ解析と再生準備のみを行って待機するための関数です。
+ * この関数を使用して再生準備を事前に済ませることにより、ムービ再生開始のタイミングを細かく制御することができます。
+ * (再生準備無しで再生開始関数を呼び出した場合は、実際に再生が始まるまでにタイムラグが発生します。)
+ * 本関数を呼び出すと、EasyPlayerのハンドル状態はMVEASY_STATUS_STOP → MVEASY_STATUS_DECHDR → MVEASY_STATUS_PREP と遷移していき、 + * 再生準備が完了するとMVEASY_STATUS_READYとなります。 + * + * ハンドル状態がMVEASY_STATUS_READYの時に、 CriMvEasyPlayer::Start() を呼ぶことで再生を開始することができます。 + * + * CriMvEasyPlayer::DecodeHeader() の呼び出し無しでこの関数を呼び出す場合は、CriMvEasyPlayerのハンドル状態が + * MVEASY_STATUS_STOPかMVEASY_STATUS_PLAYEND でなければいけません。 + * + * 再生開始前には CriMvEasyPlayer::SetFile() か CriMvEasyPlayer::SetData() でムービデータを指定してください。
+ * ただし、ファイル要求コールバック関数を登録している場合は事前のムービデータ設定は省略することだきます。 + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Start(), + * CriMvEasyPlayer::SetBufferingTime(), CriMvInputBufferInfo + */ + void Prepare(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Starts movie playback + * \param err Optional error code + * + * Opens the movie and starts playback. If CriMvEasyPlayer::Prepare() was not called, there will be a + * delay while the library reads the movie header and buffers the initial data. If CriMvEasyPlayer::Prepare() + * was called and the handle status is MVEASY_STATUS_READY, playback will start as soon as this function is called. + * + * \remarks + * If you call this function without calling CriMvEasyPlayer::DecodeHeader() or CriMvEasyPlayer::Prepare() + * first, this function can only be called when the handle status is MVEASY_STATUS_STOP, MVEASY_STATUS_PLAYEND, + * or MVEASY_STATUS_READY. + * + * \remarks + * You must either call CriMvEasyPlayer::SetFile() or CriMvEasyPlayer::SetData(), or provide a file request + * callback with CriMvEasyPlayer::SetFileRequestCallback(), before calling this function. + * + * \remarks + * Once this function has been called, CriMvEasyPlayer::ExecuteDecode() and CriMvEasyPlayer::Update() must be + * called periodically in order for this function to have any effect. Otherwise, the movie will not play and + * the handle status will never change. + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Prepare() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief 再生開始 + * \param err エラー情報(省略可) + * + * ムービの再生を開始します。
+ * CriMvEasyPlayer::Prepare()を呼ばずに、本関数を呼び出した場合は、ムービの解析と再生の準備を行うため、 + * 実際にムービの再生が始まるまでにタイムラグが発生します。
+ * CriMvEasyPlayer::Prepare()を先に呼び出して、ハンドル状態がMVEASY_STATUS_READYになっていれば、 + * この関数を呼び出してすぐに再生が始まります。 + * + * CriMvEasyPlayer::DecodeHeader() または CriMvEasyPlayer::Prepare() の呼び出し無しでこの関数を呼び出す場合は、 + * CriMvEasyPlayerのハンドル状態が MVEASY_STATUS_STOPかMVEASY_STATUS_PLAYEND でなければいけません。 + * + * 再生開始前には CriMvEasyPlayer::SetFile() か CriMvEasyPlayer::SetData() でムービデータを指定してください。
+ * ただし、ファイル要求コールバック関数を登録している場合は事前のムービデータ設定は省略することだきます。 + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Prepare() + */ + void Start(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Stops movie playback; resets a handle that is in an ERROR state, + * \param err Optional error code + * + * Tells the movie to stop playing and returns immediately. Note that this does not actually stop playback; + * an application must continue to call CriMvEasyPlayer::Update() and CriMvEasyPlayer::ExecuteDecode() until + * the status changes to MVEASY_STATUS_STOP. + * + * Once the handle is in the MVEASY_STATUS_STOP state, it can be reused for a different movie. + * + * If the handle state is MVEASY_STATUS_ERROR, an application must call this function and wait for the status + * to change to MVEASY_STATUS_STOP before destroying or reusing the player handle. + * + * In principle, this function does not reset any EasyPlayer handle parameters that were explicitly set via + * any of the settings APIs, so an application can replay the same movie by simply calling CriMvEasyPlayer::Start() + * once the state has changed to MVEASY_STATUS_STOP. However, calling this function will reset the following + * parameters: + * + * - The pause state (see CriMvEasyPlayer::Pause()) will be reset to OFF (not paused). + * - If a file request callback has been set (via CriMvEasyPlayer::SetFileRequestCallback()), the movie + * data information will be reset. + * + * See the description of CriMvEasyPlayer::ResetAllParameters() for a comparison of the parameters that are + * affected by that function and by this function. + * + * \remarks + * This function may call CriMvSoundInterface::Stop() and CriMvFileReaderInterface::Close(). For an EasyPlayer + * handle to change to MVEASY_STATUS_STOP, the sound and file interfaces need to transition to their STOP states. + * In the case of CriMvSoundInterface, this means that CriMvSoundInterface::GetStatus() will return + * MVEASY_SOUND_STATUS_STOP. For CriMvFileReaderInterface, this means that CriMvFileReaderInterface::GetCloseStatus() + * will return ASYNC_STATUS_COMPLETE. + * + * \sa CriMvEasyPlayer::Status, CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::ResetAllParameters() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief 再生停止/エラー状態からの復帰 + * \param err エラー情報(省略可) + * + * ムービ再生停止の要求を出します。本関数は即時復帰関数です。本関数内で全ての停止処理が実行されるわけではありません。
+ * 本関数呼出し後、再生状態が MVEASY_STATUS_STOP なるまでは通常のメインループ処理を動かしてください。
+ * 具体的には CriMvEasyPlayer::Update(), CriMvEasyPlayer::ExecuteDecode() が通常通り呼び出される必要があります。 + * + * 再生状態が MVEASY_STATUS_ERROR になった場合は、本関数を呼び出して MVEASY_STATUS_STOP を待ってください。
+ * + * forループなどによるローカルループで状態変更待ちをしても MVEASY_STATUS_STOP にはなりません。
+ * + * 本関数を呼び出しても、アプリケーションが再生ハンドルに設定した各種パラメータは原則としてリセットされません。
+ * MVEASY_STATUS_STOP 状態になったあと、もう一度再生を開始すると前回と同じパラメータで再生を行うことができます。
+ * 例外的に本関数でリセットされるパラメータは以下のものがあります。 + * - CriMvEasyPlayer::Pause() によるポーズ状態は、OFFにリセットされます。 + * - ファイル要求コールバック関数の登録がある場合、ムービファイル名(またはメモリ)の情報はリセットされます。 + * + * リセットされるパラメータ一覧は CriMvEasyPlayer::ResetAllParameters() の説明を参照してください。 + * + * 本関数は必要に応じて CriMvSoundInterface::Stop() および CriMvFileReaderInterface::Close() を呼び出します。
+ * EasyPlayer ハンドルが MVEASY_STATUS_STOP 状態になるためには、各インタフェースが停止状態にならなければいけません。
+ * サウンドインタフェースの場合、 CriMvSoundInterface::GetStatus()が MVEASY_SOUND_STATUS_STOP を返すこと。
+ * ファイル読み込みインタフェースの場合、 CriMvFileReaderInterface::GetCloseStatus() が、ASYNC_STATUS_COMPLETE + * を返さなければいけません。 + * + * \sa CriMvEasyPlayer::Status, CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::ResetAllParameters() + */ + void Stop(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Pauses or resumes movie playback + * \param sw Pause state. ON (1) will pause playback, OFF (0) will resume it. + * \param err Optional error code + * + * Pauses or resumes movie playback, depending on the argument. If \a sw is ON (1), playback will be paused. + * If \a sw is OFF (0), playback will be resumed. + * + * \remarks + * This function will call CriMvSoundInterface::Pause() and CriMvSystemTimerInterface::Pause() with the + * provided argument. + * + * \remarks + * Calling CriMvEasyPlayer::Stop() or CriMvEasyPlayer::ResetAllParameters() will set the pause state to OFF. + * + * \sa CriMvSoundInterface::Pause(), CriMvSystemTimerInterface::Pause() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief 再生の一時停止または再開 + * \param sw ポーズスイッチ。ポーズONの場合は1、ポーズOFF(レジューム)の場合は0を指定します。 + * \param err エラー情報(省略可) + * + * 本関数の動作は引数に依存します。
+ * 引数 sw がON(1)なら、一時停止。引数 sw がOFF(0)なら再生再開です。 + * + * CriMvEasyPlayer::Stop() または CriMvEasyPlayer::ResetAllParameters を呼び出すとポーズ状態はOFFにリセットされます。 + * + * この関数は CriMvSoundInterface::Pause() と CriMvSystemTimerInterface::Pause() を同じ引数で呼び出します。 + * + * \sa CriMvSoundInterface::Pause(), CriMvSystemTimerInterface::Pause() + */ + void Pause(CriBool sw, CriError &err=CriMv::ErrorContainer); + + CriBool IsPaused(CriError &err=CriMv::ErrorContainer); + + /* オプション設定/取得 */ + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the type of timer used for video synchronization + * \param type Type of timer to use + * \param err Optional error code + * + * In order to display video frames at the proper rate, CRI Movie uses a timer to determine when the + * next frame should be shown. For a movie with an audio track, you would typically use the + * MVEASY_TIMER_AUDIO timer type. For a movie with no audio, the MVEASY_TIMER_SYSTEM type timer + * should be used. + * + * The default is the timer type that was passed to CriMvEasyPlayer::Create(). If this value + * was NULL, a system timer (MVEASY_TIMER_SYSTEM) will be used. + * + * \remarks + * If an audio timer (MVEASY_TIMER_AUDIO) is wanted, it must be created and passed to + * CriMvEasyPlayer::Create(). + * + * \remarks + * If the movie does not have an audio track, CRI Movie will use a MVEASY_TIMER_SYSTEM regardless of + * the value set by this function. + * + * \sa CriMvEasyPlayer::GetMasterTimer(), CriMvEasyPlayer::Create(), TimerType + */ + /*JP + * \ingroup MODULE_OPTION + * \brief マスタタイマ種別の指定 + * \param type マスタタイマ種別 + * \param err エラー情報(省略可) + * + * ビデオフレームの時刻管理に使用するタイマ種別を指定します。
+ * デフォルトはハンドル作成時に指定するシステムタイマです。
+ * ビデオフレームの表示タイミングをオーディオの時刻と同期させたいときはオーディオタイマを指定してください。
+ * オーディオタイマを指定した場合でも、再生するムービにオーディオが含まれていない場合はシステムタイマ同期となります。 + * + * \sa CriMvEasyPlayer::GetMasterTimer(), CriMvEasyPlayer::Create() + */ + void SetMasterTimer(TimerType type, CriError &err=CriMv::ErrorContainer); // default is SYSTEM + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Returns the type of timer currently being used by the EasyPlayer handle + * \param err Optional error code + * \return The current timer type + * + * Returns the current type of timer used to synchronize video frames. This value can be changed + * by calling CriMvEasyPlayer::SetMasterTimer(). Otherwise, the timer type is set when the handle + * is created. + * + * \sa CriMvEasyPlayer::SetMasterTimer(), CriMvEasyPlayer::Create(), TimerType + */ + /*JP + * \ingroup MODULE_OPTION + * \brief マスタタイマ種別の取得 + * \param err エラー情報(省略可) + * \return 現在設定されているマスタタイマ種別 + * + * 現在設定されているマスタタイマ種別を取得します。 + * + * \sa CriMvEasyPlayer::SetMasterTimer() + */ + TimerType GetMasterTimer(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the number of internal video buffers + * \param npools The number of buffers to use; must be greater than 0 + * \param err Optional error code + * + * CRI Movie uses internal memory, or frame pools, to buffer decoded frames before display. + * More frame pools can help smooth out playback under high CPU loads. + * + * \remarks + * By default, the number of pools is 1. To change the value, this function must be called + * before starting playback (with either CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start()). + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 内部ビデオバッファ(フレームプール)数の指定 + * \param npools 内部ビデオバッファ数(最低でも1) + * \param err エラー情報(省略可) + * + * EasyPlayerハンドル内部のビデオバッファ数を指定します。
+ * この内部ビデオバッファはデコード結果を蓄えておくためのもので、フレームプールと呼びます。
+ * フレームプールが多いほど先行してビデオデコードを進めることができるため、デコードの + * 負荷変動が大きかったり、デコードに使用できるCPU時間の変動が大きい場合にもスムーズな再生を + * 行いやすくなります。
+ * デフォルトのフレームプール数は1です。
+ * フレームプール数を変更したい場合は、再生開始前( CriMvEasyPlayer::Prepare()または CriMvEasyPlayer::Start())に + * 本関数を実行してください。 + */ + void SetNumberOfFramePools(CriUint32 npools, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the amount of movie data that will be buffered, in seconds + * \param sec Buffering time, in seconds + * \param err Optional error code + * + * CRI Movie buffers enough raw data from disk to allow for smooth playback and to reduce disk reads. + * The buffer size is based on the bitrate of the movie, and other movie parameters. + * + * By default, this buffer will be large enough to hold 1 second worth of playback. + * + * To determine the current buffering time, look at the \a buffering_time field of the + * CriMvStreamingParameters structure, which is retrieved by calling CriMvEasyPlayer::GetMovieInfo(). + * + * \remarks + * If this function is called, it must be called before starting playback (with either + * CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start()). + * + * \remarks + * Passing \a 0.0 as the value of \a sec will reset the buffering time to the default value. + * + * \remarks + * If an application calls CriMvEasyPlayer::SetStreamingParameters() for a handle, this function + * can not be used with that handle. + * + * \remarks + * The value set by this function, along with the value set by CriMvEasyPlayer::SetReloadThresholdTime(), + * determine how often data is read from disk. See the description of + * CriMvEasyPlayer::SetReloadThresholdTime() for details. + * + * \sa CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::GetInputBufferInfo(), + * CriMvStreamingParameters + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 入力データのバッファリング時間の指定 + * \param sec バッファリング時間。単位は秒。 + * \param err エラー情報(省略可) + * + * ストリーミング再生でバッファリングする入力データの量を秒単位の時間で指定します。
+ * EasyPlayerは、バッファリング時間とムービのビットレート等から読み込みバッファのサイズを決定します。 + * + * デフォルトのバッファリング時間は、再生開始時点でアプリケーションが作成済みのEasyPlayerハンドル数 + * に依存して決まります。EasyPlayerハンドル1つにつき1秒のバッファリング時間を確保します。もしもアプリ + * ケーションが3つのEasyPlayerハンドルを作成していた場合、バッファリング時間は3秒となります。 + * + * EasyPlayerハンドルが何秒分のバッファリング時間になっているかは CriMvEasyPlayer::GetMovieInfo + * 関数で取得する CriMvStreamingParameters 構造体の変数 buffering_time で確認できます。 + * + * 本関数の呼び出しは、 CriMvEasyPlayer::Prepare 関数または CriMvEasyPlayer::Start 関数の前までに実行してください。 + * + * バッファリング時間に 0.0f を指定した場合、バッファリング時間はライブラリのデフォルト値となります。
+ * また、アプリケーションが CriMvEasyPlayer::SetStreamingParameters 関数を呼び出した場合は本関数で + * 設定した値よりも、 CriMvEasyPlayer::SetStreamingParameters 関数の指定が優先されます。 + * + * \sa CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::GetInputBufferInfo() + */ + void SetBufferingTime(CriFloat32 sec, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Determines how often the movie data buffer is refilled from disk + * \param sec Number of seconds of playback time to buffer + * \param err Optional error code + * + * EasyPlayer buffers raw data from disk to allow for smooth playback. How often it refills + * its buffers is determined by this function. When the amount of data remaining, in seconds, + * falls below this value, EasyPlayer will call into the FileReader module for this handle in + * order to read more data. + * + * SetBufferingTime() sets a "low water mark" for the data buffer. For instance, if an application + * sets the buffer size to 4 seconds (with CriMvEasyPlayer::SetBufferingTime()), and sets the reload + * threshold to 1 second, then CRI Movie will initially fill the buffer with 4 seconds worth of + * data. After 3 seconds worth of data have been decoded and consumed, there will be less than + * \a reload \a threshold seconds of data remaining, and CRI Movie will refill the buffer. + * + * \remarks + * The default value for \a sec is 0.8s. + * + * \remarks + * If this function is called, it must be called before starting playback (with either + * CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start()). + * + * \sa CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::GetInputBufferInfo(), CriMvFileReaderInterface + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 再読み込み閾値の時間指定 + * \param sec 時間指定による再読み込み閾値。単位は秒。 + * \param err エラー情報(省略可) + * + * EasyPlayerハンドルは、入力バッファ内のデータが再読み込み閾値以下になった時に次のデータ読み込みを実行します。 + * 再読み込み閾値は本関数による指定時間とムービデータのビットレートによって自動的に計算されます。 + * 再読み込み閾値は時間[秒]で指定します。デフォルト値は0.8秒です。 + * + * ムービ再生中にデータを裏読みする場合などにシーク回数を減らすために閾値設定を利用することができます。 + * 例えば、バッファリング時間を2秒、再読み込み閾値を1秒に設定すると、ムービデータの読み込みは約1秒に1回の実行になります。 + * こうすることで、約1秒の間はデータの読み込みを連続的に行うことができます。 + * + * ムービを再生しながらユーザデータの読み込みを行う場合、ユーザデータの読み込みは本関数で指定した時間以内に読み込み + * 処理が終わるようにしてください。サイズの大きなデータは複数に分割して読み込むなどの対処が必要になります。 + * 本関数で指定した時間以内にユーザデータの読み込みが終わらなかった場合、ムービデータが枯渇してムービ再生が滞ります。 + * + * 本関数の呼び出しは、 CriMvEasyPlayer::Prepare 関数または CriMvEasyPlayer::Start 関数の前までに実行してください。 + * + * ムービ再生中の入力バッファのデータ量や再読み込み閾値のサイズは、CriMvEasyPlayer::GetInputBufferInfo で取得可能です。 + * + * \sa CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::GetInputBufferInfo() + */ + void SetReloadThresholdTime(CriFloat32 sec, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Retrieves input data buffering settings + * \param ibuf_info Input buffer information structure + * \param err Optional error code + * + * Populates the passed CriMvInputBufferInfo structure with the values of the settings + * for the raw input buffer size, the reload interval, and the amount of data currently buffered. + * + * \remarks + * This function can be called once the handle status has transitioned to MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvInputBufferInfo, CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::SetReloadThresholdTime() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 入力バッファ情報の取得 + * \param ibuf_info 入力バッファ情報 + * \param err エラー情報(省略可) + * + * 入力バッファ情報 CriMvInputBufferInfo を取得します。
+ * 入力バッファ情報はEasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあと取得できます。
+ * + * \sa CriMvInputBufferInfo, CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::SetReloadThresholdTime() + */ + void GetInputBufferInfo(CriMvInputBufferInfo &ibuf_info, CriError &err=CriMv::ErrorContainer); + + /*EN + * + * \brief Sets the maximum bitrate EasyPlayer will assume for movie data + * \param max_bitrate Maximum bitrate, in bits/second + * \param err Optional error code + * + * EasyPlayer determines the size of its input data buffer by the movie's bitrate, the buffering time, + * and other movie parameters. In normal usage, an application should not need to call this function. + * However, it can be useful when doing concatenated playback of several movies sequentially. + * + * If the bitrate of the first movie is smaller or larger than the next movie, EasyPlayer can choose + * a buffer size that will be appropriate for the first movie, but either too small for the next + * (causing excessive disk reads or playback stuttering) or too large (using more memory than necessary). + * + * Passing a value of 0 for \a max_bitrate will cause the handle to revert to its default behavior + * for determining maximum bitrate. + * + * \remarks + * The value set by this function will not be reflected in the \a max_bitrate field of the + * CriMvStreamingParameters structure, which will contain the actual value as stored in the movie's + * header. + * + * \remarks + * If this function is called, it must be called before starting playback (with either + * CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start()). + * + * \remarks + * If an application calls CriMvEasyPlayer::SetStreamingParameters() for a handle, this function + * can not be used with that handle. + * + * \remarks + * For details about concatenated playback, see the description of CriMvEasyPlayer::SetFileRequestCallback(). + * + * \sa CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::SetReloadThresholdTime(), + * CriMvEasyPlayer::SetFileRequestCallback() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 最大ビットレートの指定 + * \param max_bitrate 最大ビットレート(bit per second) + * \param err エラー情報(省略可) + * + * ムービデータの最大ビットレートを指定します。最大ビットレートはストリーム再生用に確保するバッファサイズに影響します。
+ * + * 単純再生時は本関数を呼び出す必要はありません。EasyPlayerハンドルが自動的に最大ビットレートを取得して必要なだけの + * 読み込みバッファを確保します。
+ * + * 連結再生時に、先頭のムービファイルのビットレートが後続のムービファイルと比べて極端に小さい場合には、本関数を使用して + * 明示的に最大ビットレートを大きく指定してください。
+ * + * 本関数で設定した最大ビットレートは、CriMvEasyPlayer::GetMovieInfo 関数で取得するムービ情報には反映されません。 + * CriMvEasyPlayer::GetMovieInfo 関数で取得できるのはムービデータの本来の情報です。
+ * + * 本関数の呼び出しは、 CriMvEasyPlayer::Prepare 関数または CriMvEasyPlayer::Start 関数の前までに実行してください。
+ * + * 最大ビットレートに 0を指定した場合、最大ビットレートはムービデータの持つ値となります。
+ * また、アプリケーションが CriMvEasyPlayer::SetStreamingParameters 関数を呼び出した場合は本関数で + * 設定した値よりも、 CriMvEasyPlayer::SetStreamingParameters 関数の指定が優先されます。 + * + * \sa CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::SetReloadThresholdTime(), + * CriMvEasyPlayer::SetFileRequestCallback() + */ + void SetMaxBitrate(CriUint32 max_bitrate, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the audio playback track + * \param track Audio track number + * \param err Optional error code + * + * If a movie has multiple audio tracks (for instance, English and Spanish versions), this function + * will determine which track plays. By default, the first audio track is used. + * + * To determine the number of audio tracks in the movie, call CriMvEasyPlayer::GetMovieInfo() and + * look at the \a num_audio field of the CriMvStreamingParameters structure. + * + * If the movie does not have any audio, this function has no effect. + * + * \remarks + * To use the default setting, set \a track to CRIMV_AUDIO_TRACK_AUTO. + * + * \remarks + * To turn off audio altogether, set \a track to CRIMV_AUDIO_TRACK_OFF. + * + * \sa CriMvEasyPlayer::GetMovieInfo() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 再生するオーディオトラックの指定 + * \param track 再生するオーディオトラック + * \param err エラー情報(省略可) + * + * ムービが複数のオーディオトラックを持っている場合に、再生するオーディオを指定します。
+ * 再生開始前( CriMvEasyPlayer::Prepare()または CriMvEasyPlayer::Start())に本関数を実行してください。 + * + * 本関数を実行しなかった場合は、もっとも若い番号のオーディオトラックを再生します。
+ * CriMvEasyPlayer::DecodeHeader()と CriMvEasyPlayer::GetMovieInfo()を使うことで、どのチャネルに + * どんなオーディオが入っているかを再生開始前に知ることができます。 + * + * データが存在しないトラック番号を指定した場合は、オーディオは再生されません。 + * + * トラック番号としてCRIMV_AUDIO_TRACK_OFFを指定すると、例えムービにオーディオが含まれていたと + * してもオーディオは再生しません。 + * + * また、デフォルト設定(もっとも若いチャネルのオーディオを再生する)にしたい場合は、 + * チャネルとしてCRIMV_AUDIO_TRACK_AUTOを指定してください。 + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader() + */ + void SetAudioTrack(CriSint32 track, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Turns movie looping on or off + * \param sw Looping value + * \param err Optional error code + * + * If \a sw is 1 (ON), the movie will loop continuously. + * If \a sw is 0 (OFF), the movie will play normally. + * + * In normal usage, a movie will play once, with the handle status changing to MVEASY_STATUS_PLAYEND + * when it completes. When looping is ON, this behavior changes. When the movie reaches the + * end, it will immediately start playing again from the beginning, and the status will continue to + * toggle between MVEASY_STATUS_PLAYING and MVEASY_STATUS_PREP. + * + * If looping is ON, and the playback is from a file, EasyPlayer will call CriMvFileReaderInterface::Seek() + * as necessary to reset the file pointer. + * + * \remarks + * If looping is ON, and an application sets it to OFF while the movie is playing, playback might + * not stop at the end of the movie. In that case, playback will end after the next loop iteration. + * + * \sa CriMvEasyPlayer::GetLoopFlag(), CriMvFileReaderInterface::Seek() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ループ再生フラグの指定 + * \param sw ループスイッチ。ONの場合はループあり、OFFの場合はループ無しになります。 + * \param err エラー情報(省略可) + * + * ループ再生の有無を設定します。デフォルトはループOFFです。
+ * ループ再生ONにした場合は、ムービの終端まで再生してもハンドル状態はMVEASY_STATUS_PLAYENDにならず、 + * ムービの先頭から再生を繰り返します。
+ * ファイル名指定で再生している場合は、最後まで読み込んだあと CriMvFileReaderInterface::Seek()を使って + * 読み込み位置をファイルの先頭に戻します。 + * + * ループ再生OFFに設定した場合は、そのとき読み込んでいたムービの終端まで再生すると、 + * ハンドル状態がMVEASY_STATUS_PLAYENDに遷移します。
+ * 再生中にループOFFにした場合、タイミングによっては、再生中のムービ終端で終わらず、次の繰り返し + * 再生まで実行されます。 + * + * 現在のループ設定を取得するには CriMvEasyPlayer::GetLoopFlag()を使ってください。 + * + * \sa CriMvEasyPlayer::GetLoopFlag(), CriMvFileReaderInterface::Seek() + */ + void SetLoopFlag(CriBool sw, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Retrieves the value of the looping flag + * \return The current looping setting + * + * By default, looping is OFF and playback will stop when it reaches the end. You can + * change this behavior by calling CriMvEasyPlayer::SetLoopFlag(). + * + * \sa CriMvEasyPlayer::SetLoopFlag() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ループ再生フラグの取得 + * \param err エラー情報(省略可) + * \return 現在のループ再生設定 + * + * 現在のループ設定を取得します。 + * ループ設定は CriMvEasyPlayer::SetLoopFlag() で変更することができます。 + * + * \sa CriMvEasyPlayer::SetLoopFlag() + */ + CriBool GetLoopFlag(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Gets the amount of time that a movie has been playing + * \param count Number of timer units since the movie started playing + * \param unit Number of timer units per second + * \param err Optional error code + * + * This function retrieves the absolute time that has elapsed since a movie started playing. + * The time value is returned in two parts - a counter with an arbitrary interval, and the + * number of timer ticks per second. To determine the playing time in seconds, divide + * \a count by \a unit. + * + * Before playback has started, and after it has stopped, this function will return a \a count value of 0. + * + * The value retrieved is the value of the master timer for the handle, not the time of the current frame itself. + * To get the video frame time, check the CriMvFrameInfo structure once you have retrieved the frame. + * + * \remarks + * Note that this function provides an absolute playback time - it does not wrap to 0 + * when the movie loops. + * + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 再生時刻の取得 + * \param count タイマカウント + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * \param err エラー情報(省略可) + * + * タイマ時刻を取得します。時刻はcountとunitの二つの変数で表現します。
+ * count ÷ unit で秒単位の時刻となるような値を返します。
+ * 再生開始前( CriMvSoundInterface::Start()呼び出し前)および + * 再生停止後( CriMvSoundInterface::Stop()呼び出し後)は、時刻0(タイマカウントが0)を返します。
+ * 本関数はマスタタイマで指定されたタイマの時刻を返すだけで、ビデオフレームの時刻を返すものではありません。
+ * 取得したビデオフレームの本来の表示時刻は、ビデオフレーム取得時の CriMvFrameInfo 構造体を参照してください。 + */ + void GetTime(CriUint64 &count, CriUint64 &unit, CriError &err=CriMv::ErrorContainer); // only refer time of SyncMasterTimer + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Gets information about the movie + * \param stmprm Movie information structure + * \param err Optional error code + * \return TRUE if movie information was successfully retrieved + * \return FALSE if the header has not yet been decoded, or if an error occurred + * + * Populates the passed \a CriMvStreamingParameters structure with information about the current movie, + * including the bitrate, resolution, audio track information, subtitle availability, and more. + * + * This function is available once the handle status has changed to MVEASY_STATUS_WAIT_PREP. If an application + * needs this information before starting playback (for instance, to set up for playing subtitles, or to + * allocate a display surface based on the size of the movie), call CriMvEasyPlayer::DecodeHeader(), then + * call GetMovieInfo(). + * + * \remarks + * When doing concatenated playback (via CriMvEasyPlayer::SetFileRequestCallback()), GetMovieInfo() will + * return information about the currently playing movie. + * + * \sa CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::SetFileRequestCallback() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ムービ情報の取得 + * \param stmprm ムービ情報 + * \param err エラー情報(省略可) + * + * ムービ情報 CriMvStreamingParameters を取得します。
+ * ムービ情報からは主にビットレートや解像度、オーディオ数などがわかります。
+ * ムービ情報はEasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあと取得できます。
+ * 再生開始前にムービ情報を知りたい場合は、 CriMvEasyPlayer::DecodeHeader()を呼び出してヘッダ解析を行ってください。 + * + * 連結再生を行った場合、最後に取得したフレームを含むムービファイルについての情報を返します。 + * + * \sa CriMvEasyPlayer::DecodeHeader() + */ + CriBool GetMovieInfo(CriMvStreamingParameters &stmprm, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Changes the parameters for the movie + * \param stmprm Movie information structure + * \param err Optional error code + * + * This is a DEBUG function and should not normally be used by applications. + * + * This function allows an application to change the streaming parameters for the movie as a whole. + * It is available once the handle status has changed to MVEASY_STATUS_WAIT_PREP. + * + * To use this function, first call CriMvEasyPlayer::DecodeHeader(), then call CriMvEasyPlayer::GetMovieInfo() + * to retrieve the current movie parameters. Change the fields of the CriMvStreamingParameters structure + * as appropriate, then call SetStreamingParameters(). + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ストリーミングパラメータの変更 + * \param stmprm ストリーミングパラメータ + * \param err エラー情報(省略可) + * + * 本関数は通常、アプリケーションからは使用しません。デバッグ用の関数です。 + * + * ムービ再生のためのストリーミングパラメータをEasyPlayerハンドルに設定します。
+ * ストリーミングパラメータが指定できるのは、EasyPlayerハンドル状態がMVEASY_STATUS_WAIT_PREPの時だけです。
+ * この関数は、読み込みバッファサイズなど細かなパラメータを全てアプリケーションで調整したい場合に使います。
+ * CriMvEasyPlayer::DecodeHeader()でヘッダ解析を行ったあと、 CriMvEasyPlayer::GetMovieInfo()で取得できる + * ムービ情報がそのままストリーミングパラメータとなりますので、調整したい値を変更して、本関数で設定しなお + * してください。 + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader() + */ + void SetStreamingParameters(CriMvStreamingParameters *stmprm, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Determine if a new video frame can be displayed + * + * \param err Optional error code + * + * \return TRUE if a frame is ready to be displayed + * \return FALSE if the movie is paused or not playing, or if a new frame is + * not yet decoded or ready to be displayed + * + * Each frame in a movie corresponds to an absolute time, with the first frame being time 0. + * The playback time is controlled by the master timer for this handle. + * If the time of the next frame is less than or equal to the current playback time, as determined + * by CriMvEasyPlayer::GetTime(), it is ready to be displayed, and this function will return TRUE. + * + * If an application needs to do some complex or lengthy processing before displaying a frame (such + * as locking a texture), it should call this function first. + * + * \remarks + * If the next frame has not yet been decoded, this function will return FALSE regardless of the playback time. + * + * \sa CriMvEasyPlayer::GetTime() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief 次フレームの表示時刻判定 + * \param err エラー情報(省略可) + * \return 次のビデオフレームがすでに表示時刻になっている場合はTRUE(1)を返します。
+ * 次のビデオフレームがまだデコードできない場合はFALSE(0)を返します。 + * + * 次のビデオフレームがすでに表示時刻になっているかどうかを問い合わせます。
+ * もしもデコードが遅れていて次のビデオフレームがまだデコードできていない場合は、再生時刻に関係 + * なくFALSEを返します。
+ * つまりこの関数は「次のフレームが GetFrameOnTime関数で取得できるかどうか」を調べます。
+ * ビデオフレームが実際に取得するよりも先にやらなければいけない処理(例えばテクスチャロックなど) + * がある場合は、この関数でフレーム取得の成否を判定してから処理してください。 + * + * \sa CriMvEasyPlayer::GetTime() + */ + CriBool IsNextFrameOnTime(CriError &err=CriMv::ErrorContainer); + +#if !defined(XPT_TGT_EE) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Loads video frame data into a buffer, in 32 bit ARGB format + * \param imagebuf Pointer to output buffer + * \param pitch Pitch of output buffer, in bytes + * \param bufsize Size of output buffer, in bytes + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Copies the next decoded frame into the 32 bit ARGB image buffer pointed to by \a imagebuf. + * If the display time is less than the frame time, or if the frame has not yet been decoded, the + * \a frameinfo parameter will be cleared and this function will return FALSE. + * + * The \a pitch parameter is the width, in bytes, of each row of the frame image, including any padding. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * CRI Movie decodes video frames into YUV420 format internally, and stores them in frame pools (see + * CriMvEasyPlayer::SetNumberOfFramePools()) for later display. When this function is called, + * the frame must first converted to ARGB format. This can be a very CPU-intensive operation, + * especially on the PS3 and Xbox360. For 1280 x 720 video resolution, this can use almost an + * entire vsync interval. On these platforms, we recommend implementing a pixel shader and calling + * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() instead. + * + * \remarks
+ * If an application uses this function, an application need to call CriMv::InitializeFrame32bitARGB() + * after CriMv::Initialize(). If an application calls this function without CriMv::InitializeFrame32bitARGB() + * calling, this function failed and an error callback occurs. + * + * \remarks + * This function is not available on the PS2. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers(), + * CriMvEasyPlayer::SetNumberOfFramePools() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief 32bit ARGBフォーマットでのデコード結果の取得 + * \param imagebuf 出力バッファポインタ + * \param pitch 出力バッファのピッチ [byte] + * \param bufsize 出力バッファのサイズ [byte] + * \param frameinfo 取得したビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * \return フレームが取得できた場合はTRUE(1)、できなかった場合はFALSE(0)を返します。 + * + * 32bit ARGBフォーマットで、表示時刻になっているビデオフレームを取得します。
+ * この関数を呼び出す場合は、ARGBバッファの実体を確保したうえで呼び出す必要があります。
+ * ビデオフレームは引数imagebufで指定したARGBバッファに書き出されます。
+ * もしも次のビデオフレームの表示時刻になっていなかったり、デコードが終わっていなかった場合は + * フレーム取得できず、frameinfoの中身はクリアされます。
+ * 事前にビデオフレームが取得できるかどうかを知りたい場合は CriMvEasyPlayer::IsNextFrameOnTime() + * を使用してください。 + * + * 32bit ARGB の実際のピクセルデータの並びについては、そのプラットフォームで最も標準的な + * フォーマットになります。 + * + * 注意:
+ * 本関数を使用する場合はフレーム変換の初期化 CriMv::InitializeFrame32bitARGB()の呼び出しが + * 事前に必要です。フレーム変換の初期化を行わずに本関数を呼び出した場合はフレーム取得に失敗し、 + * エラーコールバックが発生します。 + * + * 注意:
+ * PS3, Xbox360 でも本関数は使用できますが、とてもCPU負荷の高い関数となります。
+ * 解像度が 1280x720 のムービを本関数をフレーム取得すると1vsync近い時間がかかります。
+ * PS3, Xbox360 ではCriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() 関数と ピクセルシェーダー + * の組み合わせによるフレーム変換をおすすめします。
+ * + * 備考:
+ * PS2版CRI Movie は本関数に対応していません。 + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriBool GetFrameOnTimeAs32bitARGB(CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + +#if !defined(XPT_TGT_EE) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Loads video frame data into a set of Y,U,V separate buffers + * \param yuvbuffers Pointer to Y,U,V buffer data structure + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Copies the next decoded frame into the Y,U,V image buffers pointed to by \a yuvbuffers, for use + * with a pixel shader. CRI Movie decodes video frames into YUV420 format internally, so this is + * a very efficient function. + * + * If the display time is less than the frame time, or if the frame has not yet been decoded, the + * \a frameinfo parameter will be cleared and this function will return FALSE. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \remarks + * If the movie does not have an alpha channel, the alpha buffer fields of the \a CriMvYuvBuffers + * structure are not used. + * + * \remarks + * This function is not available on the PS2. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief YUV個別バッファへのデコード結果の取得 + * \param yuvbuffers YUV個別バッファのパラメータ構造体 + * \param frameinfo 取得したビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * \return フレームが取得できた場合はTRUE(1)、できなかった場合はFALSE(0)を返します。 + * + * YUV個別バッファ形式で表示時刻になっているビデオフレームを取得します。
+ * YUV個別バッファ形式はピクセルシェーダーでフレームを描画するための出力フォーマットです。
+ * この関数を呼び出す場合は、YUV個別バッファの実体を確保したうえで呼び出す必要があります。
+ * ビデオフレームは引数yuvbuffersで指定したYUV個別バッファに書き出されます。
+ * もしも次のビデオフレームの表示時刻になっていなかったり、デコードが終わっていなかった場合は + * フレーム取得できず、frameinfoの中身はクリアされます。
+ * 事前にビデオフレームが取得できるかどうかを知りたい場合は CriMvEasyPlayer::IsNextFrameOnTime() + * を使用してください。
+ *
+ * アルファムービ再生を行わない場合は、引数 yuvbuffers のAlphaテクスチャ関連のパラメータは使用しません。
+ * + * 備考:
+ * PS2版CRI Movie は本関数に対応していません。 + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriBool GetFrameOnTimeAsYUVBuffers(CriMvYuvBuffers *yuvbuffers, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + +#if defined(XPT_TGT_PC) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Loads video frame data into a buffer, in YUV422 format + * \param imagebuf Pointer to output buffer + * \param pitch Pitch of output buffer, in bytes + * \param bufsize Size of output buffer, in bytes + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Copies the next decoded frame into the YUV422 texture buffer pointed to by \a imagebuf. + * CRI Movie decodes video frames into YUV420 format internally, so there is some internal conversion + * required when using this function. + * + * If the display time is less than the frame time, or if the frame has not yet been decoded, the + * \a frameinfo parameter will be cleared and this function will return FALSE. + * + * The \a pitch parameter is the width, in bytes, of each row of the frame image, including any padding. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \remarks + * This function is currently only available in the PC version of CRI Movie. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief YUV422フォーマットでのデコード結果の取得 + * \param imagebuf 出力バッファのポインタ + * \param pitch 出力バッファのピッチ [byte] + * \param bufsize 出力バッファサイズ [byte] + * \param frameinfo 取得したビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * \return フレームが取得できた場合はTRUE(1)、できなかった場合はFALSE(0)を返します。 + * + * YUV422テクスチャフォーマットで、表示時刻になっているビデオフレームを取得します。
+ * この関数を呼び出す場合は、YUVバッファの実体を確保したうえで呼び出す必要があります。
+ * ビデオフレームは引数imagebufで指定したYUVバッファに書き出されます。
+ * もしも次のビデオフレームの表示時刻になっていなかったり、デコードが終わっていなかった場合は + * フレーム取得できず、frameinfoの中身はクリアされます。
+ * 事前にビデオフレームが取得できるかどうかを知りたい場合は CriMvEasyPlayer::IsNextFrameOnTime() + * を使用してください。 + * + * 【備考】
+ * 現在は、PC版CRI Movie のみ本関数に対応しています。 + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriBool GetFrameOnTimeAsYUV422(CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_PC)|| defined(XPT_TGT_TRGP6K) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * \brief Get video frame data to 16bit RGB565 format buffer + * + * This function is added for a prototype library for iPhone + * Please add comments when releasing the SDK. + * + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief 16bit RGB565フォーマットでのデコード結果の取得 + * + * この関数はiPhone版CRI Movieのプロトタイプ用の関数宣言です。 + * SDKとしてリリースする際は、コメントを追加して下さい。 + * + */ + CriBool GetFrameOnTimeAsRGB565(CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + +#if defined(XPT_TGT_EE) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Gets a reference to EasyPlayer's internal video frame buffer, in 32 bit ARGB format + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Locks the internal buffer for the current video frame in memory, and retrieves a pointer to it. This is + * different behavior than the GetFrameXXX()functions, which copy the frame data into a caller-supplied location. + * + * On successful return from this function, the fields of \a frameinfo will be populated with information + * about the frame. In particular, the \a imageptr field will be set to the image buffer, in 32 bit ARGB format. + * After calling this function, an application must copy the video frame into its own buffer or transfer it to + * GS local memory via DMA. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \remarks + * After the application has copied the frame data, it must call CriMvEasyPlayer::UnlockFrame(). + * + * \remarks + * This function is only available on the PS2. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::UnlockFrame() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief デコード結果領域(ARGB32bit)のロック。PS2専用。 + * \param frameinfo ロックしたビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * + * 本関数はPS2専用のフレーム取得関数で、他機種の GetFrame 関数に相当します。
+ * PS2では GetFrame 関数の代わりに本関数と UnlockFrame 関数を使用してフレーム取得を行います。
+ * GetFrame 関数は出力バッファを指定してそこへデコード結果を取得するのに対し、LockFrame 関数はバッファを指定せず + * CriMvEasyPlayerハンドル内部にあるデコード結果バッファのポインタを取得するところが違います。
+ * + * 本関数はデコード結果のメモリ領域を参照開始するためにロックします。
+ * この関数でフレームをロックできるのは、そのフレームが表示可能時間になっている場合のみです。
+ * アプリケーションはフレームをロックしたあと、デコード結果をDMAでテクスチャ領域へ転送するか、 + * 別バッファへコピーするなどの処理を行います。
+ * デコード結果の参照が終わった後には、必ず CriMvEasyPlayer::UnlockFrame() 関数を呼び出して参照終了を通知してください。
+ * + * 備考:
+ * 本関数はPS2版CRI Movie のみ対応しています。 + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::UnlockFrame() + */ + CriBool LockFrameOnTimeAs32bitARGB_PS2(CriMvFrameInfo &frameinfo, CriError &err=CriMv::ErrorContainer); +#endif + + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Unlocks the video frame + * \param frameinfo Pointer to locked video frame information + * \param err Optional error code + * + * Unlocks the video frame that was locked in memory by a call to one of the LockFrameXXX() functions. + * + * The \a frameinfo parameter must be the same one that was passed to LockFrameXXX(). + * + * If the frame has been locked, EasyPlayer will not be able to retrieve the next frame until the frame is + * unlocked. An attempt to lock the same frame more than once will fail. + * + * The LockFrameXXX() functions are CriMvEasyPlayer::LockFrameOnTimeAs32bitARGB_PS2() and + * CriMvEasyPlayer::LockFrameOnTimeAsYUVBuffers(). Depending on the platform, only one or the other of + * these functions will be available. + * + * \sa CriMvEasyPlayer::LockFrameOnTimeAs32bitARGB_PS2(), CriMvEasyPlayer::LockFrameOnTimeAsYUVBuffers() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief ロックフレームで取得したデコード結果をアンロックする + * \param frameinfo ロックしたビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * + * 本関数はロックフレーム関数を使ってロックしていたフレームをアンロックし、メモリ参照の終了を通知します。
+ * ロックフレーム関数には CriMvEasyPlayer::LockFrameOnTimeAs32bitARGB_PS2() と CriMvEasyPlayer::LockFrameOnTimeAsYUVBuffers() + * がありますが、どちらの関数を使ってロックした場合も、本関数を使ってアンロックします。
+ * 本関数の引数には、どのフレームをアンロックするかを指示するために、ロックフレーム関数で取得したフレーム情報構造体を指定します。
+ * + * 本関数でアンロックしたフレームは、以後、次にビデオフレームのデコード出力バッファとして使用されます。
+ * 1度アンロックしたフレームをもう一度ロックすることは出来ません。
+ * + * \sa CriMvEasyPlayer::LockFrameOnTimeAs32bitARGB_PS2(), CriMvEasyPlayer::LockFrameOnTimeAsYUVBuffers() + */ + CriBool UnlockFrame(CriMvFrameInfo *frameinfo, CriError &err=CriMv::ErrorContainer); + +#if !defined(XPT_TGT_EE) + /*EN + * + * \brief Gets a reference to EasyPlayer's internal video frame buffer + * \param yuvbuffers Y,U,V buffer data structure + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Locks the internal buffer for the current video frame in memory, and retrieves a pointer to it. This is + * different behavior than the GetFrameXXX() functions, which copy the frame data into a caller-supplied location. + * + * On successful return from this function, the fields of \a yuvbuffers will be set to the Y,U,V fields of the + * video frame, and the fields of \a frameinfo will be populated with information about the frame. + * + * After calling this function, an application must copy the video frame into its own buffer or transfer it to + * texture memory. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \remarks + * After the application has copied the frame data, it must call CriMvEasyPlayer::UnlockFrame(). + * + * \remarks + * This function is not available on the PS2. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::UnlockFrame() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief デコード結果領域のロック + * \param yuvbuffers YUV個別バッファのパラメータ構造体 + * \param frameinfo ロックしたビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * + * GetFrame とは別の仕様のフレーム取得関数です。
+ * 本関数は UnlockFrame 関数とセットで使用します。
+ * GetFrame 関数は出力バッファを指定してそこへデコード結果を取得するのに対し、LockFrame 関数はバッファを指定せず + * CriMvEasyPlayerハンドル内部にあるデコード結果バッファのポインタを取得するところが違います。
+ * + * 本関数はデコード結果のメモリ領域を参照開始するためにロックし、 + * デコード結果のYUV3種類のバッファについての情報を引数 yuvbuffers に格納します。
+ * この関数でフレームをロックできるのは、そのフレームが表示可能時間になっている場合のみです。
+ * アプリケーションはフレームをロックしたあと、デコード結果をテクスチャ領域へコピーするか、 + * 別バッファへコピーするなどの処理を行います。
+ * デコード結果の参照が終わった後には、必ず CriMvEasyPlayer::UnlockFrame() 関数を呼び出して参照終了を通知してください。
+ * + * 備考:
+ * PS2版CRI Movie は本関数に対応していません。 + * + * \sa CriMvEasyPlayer::UnlockFrame() + */ + CriBool LockFrameOnTimeAsYUVBuffers(CriMvYuvBuffers &yuvbuffers, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Discards the next video frame + * \param frameinfo Discarded frame information structure + * \param err Optional error code + * \return TRUE if a frame was available to discard + * \return FALSE otherwise + * + * Discards the next video frame, if it is available, and populates \a frameinfo with information about + * the frame. Note that the \a imageptr field of that structure will not be available and should not + * be referenced. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief 次フレームを取得せずに捨てる + * \param frameinfo 破棄したビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * + * デコード済みのビデオフレームを捨てたい場合に使用する関数です。
+ * フレーム取得関数と比べると、出力用バッファを準備する必要が無い部分が特徴です。
+ * CriMvEasyPlayer::IsNextFrameOnTime()で次フレームが取得できることを確認した後、本関数を呼び出してください。
+ * 引数frameinfoには参考のために破棄したビデオフレームの情報が格納されますが、デコード結果自体にはアクセスできません。 + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriBool DiscardNextFrame(CriMvFrameInfo &frameinfo, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the current channel for displaying subtitles + * + * \param channel Subtitle channel number + * \param err Optional error code + * + * A movie can contain up to 16 distinct sets of subtitles, each on its own display channel. This can + * be used, for instance, to provide multilanguage support. + * + * Subtitle channels are numbered sequentially, starting from 0, but do not need to be contiguous. + * For example, a movie can have 3 sets of subtitles, on channels 1, 5, and 7. The number of channels + * can be determined once CriMvEasyPlayer::GetMovieInfo() has completed successfully by looking at the + * \a num_subtitle field of the \a CriMvStreamingParameters structure passed to that function. + * + * By default, subtitle playback is off. To turn off subtitles once they have been turned on, pass + * CRIMV_SUBTITLE_CHANNEL_OFF as the value of \a channel. + * + * If the selected subtitle channel does not exist, subtitles will not be displayed. + * + * \remarks + * If an application turns on subtitle display with this function, it must periodically call + * CriMvEasyPlayer::GetSubtitleOnTime(), or else movie playback will stall. + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::GetSubtitleOnTime() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 取得する字幕チャネルの設定 + * \param channel 字幕チャネル + * \param err エラー情報(省略可) + * + * 取得する字幕チャネルを設定します。デフォルトは字幕取得無しです。 + * + * CriMvEasyPlayer::DecodeHeader()と CriMvEasyPlayer::GetMovieInfo()を使うことで、再生するムービが + * いくつの字幕を含んでいるかを再生開始前に知ることができます。 + * + * データが存在しないチャネル番号を指定した場合は、字幕は取得できません。
+ * デフォルト設定(字幕取得無し)にしたい場合は、チャネルとしてCRIMV_SUBTITLE_CHANNEL_OFFを指定してください。 + * + * この関数で字幕チャネルを指定した場合は、メインループから定期的に CriMvEasyPlayer::GetSubtitleOnTime() を + * 実行してください。字幕取得を定期的に行わない場合は、ムービ再生が途中で止まります。 + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::GetSubtitleOnTime + */ + void SetSubtitleChannel(CriSint32 channel, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Retrieves subtitle data for the current frame, if available + * + * \param bufptr Buffer to receive subtitle data + * \param bufsize Size of buffer, in bytes + * \param err Optional error code + * + * \return The number of bytes copied into \a bufptr + * + * If the movie contains subtitle data, and there is a subtitle for the current frame, up to \a bufsize + * bytes of the subtitle data for the active subtitle channel will be copied into \a bufptr. Otherwise, + * the entire buffer will be filled with zeroes. + * + * \remarks + * If an application turns on subtitle display with CriMvEasyPlayer::SetSubtitleChannel(), it must + * periodically call this function, or else movie playback will stall. + * + * \remarks + * An application should not make assumptions as to whether the returned data is NUL-terminated. + * + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief 字幕データの取得 + * \param bufptr 出力バッファポインタ + * \param bufsize 出力バッファサイズ [byte] + * \param err エラー情報(省略可) + * \return 取得した字幕データのサイズ[byte]を返します。 + * + * 表示時刻になっている字幕データを取得します。 + * この関数を呼び出す場合は、字幕用バッファの実体を確保したうえで呼び出してください。
+ * 字幕データは引数 bufptr で指定したバッファに書き出されます。
+ * もし字幕データが bufsize よりも大きい場合は、bufsize に収まる量だけ書き出し、残りは破棄されます。 + * + * もしも表示時刻の字幕が無い場合は、バッファの中身はクリアされます。 + * + * CriMvEasyPlayer::SetSubtitleChannel()で存在する字幕チャネルを指定している場合は、 + * メインループから定期的に本関数を実行してください。
+ * 実行しない場合は、ムービ再生が途中で止まります。 + * + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ + CriUint32 GetSubtitleOnTime(CriUint8 *bufptr, CriUint32 bufsize, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets a secondary sound interface + * + * \param sound Secondary sound interface to attach to this handle + * \param err Optional error code + * + * A subaudio interface allows an application to play two audio tracks at the same time. This is + * typically used to play a dialog track or sound effects along with background music. After calling + * this function, an application needs to call CriMvEasyPlayer::SetSubAudioTrack() to choose the secondary + * audio track to play. + * + * Note that you must create a separate sound interface to pass to this function. The interface used + * in the CriMvEasyPlayer::Create() call can not be used. + * + * If a subaudio interface is used, the application must call CriMvEasyPlayer::DetachSubAudioInterface() + * when the EasyPlayer handle reaches the MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND state before calling + * CriMvEasyPlayer::Destroy(). + * + * Calling CriMvEasyPlayer::ResetAllParameters() will not affect the value set by this function. + * + * \remarks + * If this function is called, it must be called before starting playback (with either CriMvEasyPlayer::Prepare() + * or CriMvEasyPlayer::Start()). + * + * \remarks + * An EasyPlayer handle can not use a subaudio interface and center channel replacement (see + * CriMvEasyPlayer::ReplaceCenterVoice()) at the same time. + * + * \sa CriMvEasyPlayer::DetachSubAudioInterface(), CriMvEasyPlayer::SetSubAudioTrack(), + * CriMvEasyPlayer::ReplaceCenterVoice() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief サブオーディオ用サウンドインタフェースの設定 + * \param sound サブオーディオ用サウンドインタフェース + * \param err エラー情報(省略可) + * + * サブオーディオ(メインオーディオと同時に別のオーディオを再生する機能)のための + * サウンドインタフェースを設定します。
+ * 設定するサウンドインタフェースは、 CriMvEasyPlayer::Create() 時に指定したサウンドインタフェース + * とは「別の」インスタンスでなければいけません。
+ * + * 本関数は、EasyPlayerハンドル作成後、 CriMvEasyPlayer::Start() または CriMvEasyPlayer::Prepare() の + * 呼び出しより前に実行しなければいけません。
+ * + * サブオーディオを再生するには、本関数でサウンドインタフェースを設定したあと、 + * CriMvEasyPlayer::SetSubAudioTrack() でサブオーディオのトラックを指定してください。
+ * + * サブオーディオ用サウンドインタフェースを設定したハンドル破棄を破棄する前に、 + * MVEASY_STATUS_STOP または MVEASY_STATUS_PLAYEND の状態で CriMvEasyPlayer::DetachSubAudioInterface() を呼んでください。 + * なお、サブオーディオ用サウンドインタフェースは CriMvEasyPlayer::ResetAllParameters() を呼び出してもリセットされません。 + * + * 注意:
+ * サブオーディオ機能は、 CriMvEasyPlayer::ReplaceCenterVoice() によるセンターチャネル置き換え機能とは + * 同時に使用できません。
+ * + * \sa CriMvEasyPlayer::DetachSubAudioInterface(), CriMvEasyPlayer::SetSubAudioTrack(), + * CriMvEasyPlayer::ReplaceCenterVoice() + */ + void AttachSubAudioInterface(CriMvSoundInterface *sound, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Removes a secondary audio interface + * + * \param err Optional error code + * + * Removes the secondary sound interface that was set by a call to CriMvEasyPlayer::AttachSubAudioInterface(). + * + * This function should be called when the EasyPlayer handle's state is either MVEASY_STATUS_STOP or + * MVEASY_STATUS_PLAYEND. + * + * \sa CriMvEasyPlayer::AttachSubAudioInterface() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief サブオーディオ用サウンドインタフェースの解除 + * \param err エラー情報(省略可) + * + * 現在設定されているサブオーディオ用サウンドインタフェースを解除します。
+ * + * 本関数は、EasyPlayerハンドルの状態が CriMvEasyPlayer::MVEASY_STATUS_STOP または + * CriMvEasyPlayer::MVEASY_STATUS_PLAYEND の時に呼び出してください。
+ * + * \sa CriMvEasyPlayer::AttachSubAudioInterface() + */ + void DetachSubAudioInterface(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the secondary audio track + * + * \param track Track number + * \param err Optional error code + * + * A secondary, or subaudio, track is typically used to play a dialog track or sound effects along + * with a movie. An application can support several different languages by setting the desired language + * track with this function. By default, the subaudio track is disabled, even if the interface has been set. + * + * Subaudio is enabled with CriMvEasyPlayer::AttachSubAudioInterface(). If the interface has not been set, + * this function will have no effect. + * + * The main audio track for the movie is set with CriMvEasyPlayer::SetAudioTrack(). If the same track + * number is used for the main and subaudio, the subaudio will not play. + * + * To turn off the subaudio track, pass CRIMV_CENTER_VOICE_OFF as the track number. + * + * \remarks + * If this function is called, it must be called before starting playback (with either CriMvEasyPlayer::Prepare() + * or CriMvEasyPlayer::Start()). + * + * \remarks + * An EasyPlayer handle can not use a subaudio interface and center channel replacement (see + * CriMvEasyPlayer::ReplaceCenterVoice()) at the same time. + * + * \sa CriMvEasyPlayer::AttachSubAudioInterface(), CriMvEasyPlayer::ReplaceCenterVoice() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief サブオーディオトラックの設定 + * \param track サブオーディオ再生するトラック番号 + * \param err エラー情報(省略可) + * + * サブオーディオトラックを設定します。デフォルト値は CRIMV_CENTER_VOICE_OFF です。
+ * + * サブオーディオを再生するには、 CriMvEasyPlayer::AttachSubAudioInterface() でサウンドインタフェースを設定したあと、 + * 本関数でサブオーディオのトラックを指定してください。
+ * 本関数の呼び出しは、 CriMvEasyPlayer::Start() または CriMvEasyPlayer::Prepare() の呼び出しより前でなければいけません。
+ * + * メインオーディオのトラックは CriMvEasyPlayer::SetAudioTrack() で指定します。 + * サブオーディオトラックとしてメインオーディオと同じトラックを指定した場合は、サブオーディオからは何も再生されません。
+ * + * サブオーディオトラックには、センターチャネル置き換え機能とは異なりチャネル数の制限はありません。 + * モノラル、ステレオ、5.1ch のいずれのトラックもサブオーディオとして使用することができます。
+ * + * 注意:
+ * サブオーディオ機能は、 CriMvEasyPlayer::ReplaceCenterVoice() によるセンターチャネル置き換え機能とは + * 同時に使用できません。
+ * + * \sa CriMvEasyPlayer::AttachSubAudioInterface() + */ + // default value is -1. + void SetSubAudioTrack(CriSint32 track, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Retrieves the secondary audio track + * + * \param err Optional error code + * \return track number Current subaudio track number + * + * When you successfully set the subaudio track, this function return the track number + * that you specified by CriMvEasyPlayer::SetSubAudioTrack(). Otherwise, it retuns CRIMV_CENTER_VOICE_OFF. + * + * \sa CriMvEasyPlayer::SetSubAudioTrack() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief サブオーディオトラックの取得 + * \param err エラー情報(省略可) + * \return トラック番号 現在設定されているトラック番号 + * + * サブオーディオ再生が有効になっていれば、ユーザがCriMvEasyPlayer::SetSubAudioTrack()で設定した + * サブオーディオトラック番号を返します。 + * + * サブオーディオ再生が有効でない場合や、サブオーディオトラックを指定していなかった場合は、 + * CRIMV_CENTER_VOICE_OFFを返します。 + * + * \sa CriMvEasyPlayer::SetSubAudioTrack() + */ + CriSint32 GetSubAudioTrack(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Replaces the center channel of a 5.1ch audio track + * + * \param track Track number to use + * \param err Optional error code + * + * If the current audio track for a movie (set with CriMvEasyPlayer::SetAudioTrack()) is in 5.1ch + * surround sound, the center channel can be replaced with a different, mono, track. This does not + * affect any of the other channels in the 5.1ch track. + * + * If the current audio track is not 5.1ch, or the replacement track is not monaural, this call will + * have no effect. + * + * Passing CRIMV_CENTER_VOICE_OFF as the value of \a track will undo the replacement and revert to + * playing the original center channel of th 5.1ch track. + * + * \remarks + * An EasyPlayer handle can not use center channel replacement and a subaudio interface (see + * CriMvEasyPlayer::AttachSubAudioInterface() and CriMvEasyPlayer::SetSubAudioTrack()) at the same time. + * + * \sa CriMvEasyPlayer::SetAudioTrack(), CriMvEasyPlayer::AttachSubAudioInterface(), + * CriMvEasyPlayer::SetSubAudioTrack() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief センターボイスの設定 + * \param track ボイストラック番号 + * \param err エラー情報(省略可) + * + * 5.1ch オーディオ再生時に、センターチャネルだけを別のモノラルトラックと置き換えることができます。
+ * 本関数は、置き換え用のモノラルデータが入ったオーディオトラックを設定します。
+ * 5.1ch BGM に対して、ボイスだけを複数種類から差し替えたい場合に使用してください。 + * + * デフォルトはセンターボイス指定無しです。 + * + * この関数を使用した場合、メインのオーディオトラックとして再生している5.1chデータのセンターチャネル + * は破棄され、代わりにセンターボイスとして指定したデータが入ります。 + * + * (a) センターボイスとして使用できるのはモノラルのオーディオだけです。
+ * (b) センター置き換えが有効なのはメインのオーディオが5.1chの場合だけです。 + * + * この二つの条件を満たしていない場合は、本関数で設定した値は無視されます。 + * + * デフォルト値に戻したい場合は、チャネルとしてCRIMV_CENTER_VOICE_OFFを指定してください。 + * + * \sa CriMvEasyPlayer::SetAudioTrack(), CriMvEasyPlayer::AttachSubAudioInterface(), + * CriMvEasyPlayer::SetSubAudioTrack() + */ + void ReplaceCenterVoice(CriSint32 track, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets a callback function that will set the movie file + * + * \param func Callback function + * \param usrobj Pointer to user-provided data + * \param err Optional error code + * + * Normally, the movie file is provided directly, via CriMvEasyPlayer::SetFile() or + * CriMvEasyPlayer::SetData(), before playback is started. Setting a file request callback + * allows an application to do \a concatenated \a playback, playing multiple movies, one + * after the other. + * + * If the callback function is set, it will be called when + * + * - The last data chunk of the current movie has been read by EasyPlayer. + * - Any of the playback functions (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), + * or CriMvEasyPlayer::DecodeHeader()) are called and the movie file has not been set. + * + * The callback should call CriMvEasyPlayer::SetFile() or CriMvEasyPlayer::SetData() if the + * application wants to continue playback. Otherwise, playback will end once the callback returns. + * + * The \a usrobj parameter specifies a pointer to arbitrary data, that will be passed as the + * second parameter to the callback. + * + * The prototype of the callback function is + * + * void callback(CriMvEasyPlayer *mveasy, void *usrobj) + * + * where + * + * mveasy is the EasyPlayer object + * usrobj is the pointer to user data that was passed to SetFileRequestCallback(). + * + * \remarks + * In order to do concatenated playback, all movies must have the same + * + * \remarks + * - video resolution + * - framerate + * - video codec + * - audio track structure + * - subtitle structure + * + * \remarks + * The same audio track structure means that all movies must have the same number of tracks, and the + * same track number must be of the same audio type for each movie. For instance, if the first movie has + * 2 audio tracks, with track 1 being stereo and track 2 being mono, then \a all other movies would have + * to have 2 tracks, track 1 stereo and track 2 mono. + * + * \remarks + * Subtitles have to match in the number of channels. For instance, if the first movie had 3 subtitle + * channels, then all other movies would need 3 channels. It is also important to keep the languages on + * the same tracks for each movie, since otherwise the application would get confused. CRI Movie makes + * no assumptions about languages or the interpretation of subtitles; subtitles are simply treated as + * binary data. + * + * \remarks + * Currently, cuepoints are not supported with concatenated playback. + * + * \sa CriMvEasyPlayer::SetFile(), CriMvEasyPlayer::SetData() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ファイル要求コールバック関数の登録 + * \param func ファイル要求コールバック関数 + * \param usrobj ユーザオブジェクト + * \param err エラー情報(省略可) + * + * ムービの連結再生を行うために、ムービファイルを要求するコールバック関数を登録します。 + * このコールバック関数は以下のタイミングで発生します。 + * + * ・ムービファイルを読み込み終了した時。
+ * ・ファイルの指定無しで再生を開始した時。 + * + * ファイル要求コールバック関数内で CriMvEasyPlayer::SetFile() または CriMvEasyPlayer::SetData() + * を呼び出すことで、連続して次のムービファイルを指定することができます。
+ * SetFile() も SetData() も呼び出さなかった場合は、読み込み済みのムービが終わると + * 再生終了になります。 + * + * ファイル要求コールバック発生時、コールバック関数の第二引数usrobjには、登録時に指定 + * したユーザオブジェクトが渡されます。登録ファイルリストなどの管理に利用してください。 + * + * 連結再生できるムービファイルには以下の条件があります。
+ * - ビデオ解像度が同じ + * - ビデオのフレームレートが同じ + * - ビデオのコーデックが同じ + * - オーディオおよび字幕のトラック構成が同じ + * + * \sa CriMvEasyPlayer::SetFile(), CriMvEasyPlayer::SetData() + */ + void SetFileRequestCallback(void (*func)(CriMvEasyPlayer *mveasy, void *usrobj), + void *usrobj, CriError &err=CriMv::ErrorContainer); + +#if defined(XPT_TGT_PC) + /*EN + * \ingroup MODULE_OPTION + * \brief Set processor parameters for decoding on PC + * + * \param num_threads Number of additional threads for load distribution in decoding (Maximum 3 threads) + * \param affinity_mask Pointer to an array of thread affinity masks for each thread specified with num_threads. + * \param priority Thread priority of the decoding threads for load balancing + * \param err Optional error code + * + * This function sets the processor parameters for decoding. Use it when you want to change + * processors or thread priority for decoding load distribution. + * + * If this function is called, it must be called before calling any of the playback functions + * (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()). + * + * On initialization, CRI Movie prepares three worker threads for distributed decoding.
+ * + * \a num_threads specifies how many worker threads CRI Movie should use.
+ * \a affinity_mask is an array of affinity masks for the worker threads. This array must have + * \a num_threads many elements. The format of \a affinity_mask is same as for the value passed to the + * Win32 SetThreadAffinityMask() API function.
+ * \a priority is used as the thread priority for all of the threads specified by \a num_threads. + * + * If this function is called, three distributed decoding threads will run in parallel by default. + * Also, processor assignment of the decoding threads is handled by the operating system, and their + * priority will be normal. + * + * To reset the parameters, call this function again, passing CRIMV_DEFAULT_AFFNITY_MASK_PC and + * CRIMV_DEFAULT_THREAD_PRIORITY_PC as the affinity masks and thread priority. + * + * \sa CRIMV_DEFAULT_AFFNITY_MASK_PC, CRIMV_DEFAULT_THREAD_PRIORITY_PC + */ + /*JP + * \ingroup MODULE_OPTION + * \brief PCでデコード処理に使う追加プロセッサ設定 + * \param num_threads 負荷分散デコード用に使用する追加スレッドの数 (最大3つ) + * \param affinity_masks スレッドアフィニティマスクの配列へのポインタ。num_threadsで指定したスレッドごとのマスク値。 + * \param priority 負荷分散デコードスレッドの優先度 + * \param err エラー情報(省略可) + * + * デコード処理を分散して処理するためのプロセッサを指定できます。 + * デコード処理に行うプロセッサやスレッド優先度を変更したい場合に使用してください。 + * 本関数は再生開始(Start, Prepare, DecodeHader)前に呼び出す必要があります。 + * + * CRI Movieは初期化の際に3つの分散デコード用のワーカースレッドを用意します。 + * num_threads引数で、そのうちのいくつのスレッドを実際に使用するかを指定できます。 + * アプリケーションから明示的にプロセッサ割り当てを行いたい場合、個々のスレッドに対して + * アフィニティマスクを設定してください。 + * アフィニティマスクの値は、Win32 APIのSetThreadAffinityMaskの引数と同じ書式です。 + * スレッド優先度は、num_threadsで指定したデコードに使用するスレッドに対して適用されます。 + * + * この関数を呼ばなかった場合、3つのスレッドで並列デコードを行います。 + * デコードスレッドのプロセッサは割り当ては全てOS任せで、優先度はスレッド標準になります。 + * + * 一度本関数で設定を変更した後、状態を戻したい場合は、CRIMV_DEFAULT_AFFNITY_MASK_PC, CRIMV_DEFAULT_THREAD_PRIORITY_PCを + * 引数として指定し、再度呼び出してください。 + * + * \sa CRIMV_DEFAULT_AFFNITY_MASK_PC, CRIMV_DEFAULT_THREAD_PRIORITY_PC + */ + void SetUsableProcessors_PC(CriSint32 num_threads, const CriUint32 *affinity_mask, CriSint32 priority, + CriError &err=CriMv::ErrorContainer); + +#endif + +#if defined(XPT_TGT_XBOX360) + /*EN + * \ingroup MODULE_OPTION + * \brief Set processor parameters for decoding + * \param processors_param Processor Parameters + * \param err Optional error code + * + * \brief Set processor parameters for decoding + * \param processors_param Processor Parameters + * \param err Optional error code + * + * This function sets the processor parameters for decoding, along the priority of the + * decoding threads. + * + * If this function is called, it must be called before calling any of the playback functions + * (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()). + * + * If you don't call this function, the EasyPlayer handle uses Processor 3 (Core 0, Thread 0) + * and Processor 5 (Core 0, Thread 0). + * + * \sa CriMvProcessorParameters_XBOX360 + */ + /*JP + * \ingroup MODULE_OPTION + * \brief Xbox360でデコードに使うプロセッサ設定 + * \param processors_param 使用プロセッサパラメータ + * \param err エラー情報(省略可) + * + * デコードに使用するプロセッサを指定します。
+ * 本関数は再生開始(Start, Prepare, DecodeHader)前に呼び出す必要があります。 + * + * また、デコードに使用する内部スレッドの優先度の設定が出来ます。 + * + * デフォルトのプロセッサ設定では、プロセッサ3(コア1スレッド1)とプロセッサ5 + * (コア2スレッド1)を使用します。 + * + * \sa CriMvProcessorParameters_XBOX360 + */ + void SetUsableProcessors_XBOX360(const CriMvProcessorParameters_XBOX360 *processors_param, + CriError &err=CriMv::ErrorContainer); +#endif + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the frame where playback will start + * + * \param seek_frame_id Frame (0-based) to start playing from + * \param err Optional error code + * + * To play a movie from other than the first frame, call this function before starting playback. + * To seek to a new frame when the movie is already playing, call CriMvEasyPlayer::Stop() and wait + * for the handle to change to the MVEASY_STATUS_STOP state, call this function with the desired + * frame number, then call CriMvEasyPlayer::Start() again. + * + * Valid values for seek_frame_id are from 0 to \a num_frames - 1, where \a num_frames can be found by + * + *
+	 *
+	 *   CriMvStreamingParameters streaming_params;
+	 *   CriSint32                num_frames;
+	 *
+	 *   GetMovieInfo(streaming_params);
+	 *   num_frames = streaming_params.video_prm[0].total_frames;
+	 *
+	 * 
+ * + * Refer to \ref usr_mech7 for more information. + * + * \remarks + * If the value of \a seek_frame_id is out of range, playback will start from frame 0. + * + * \sa CriMvStreamingParameters + */ + /*JP + * \ingroup MODULE_OPTION + * \brief シーク再生開始位置の設定 + * \param seek_frame_id シーク再生開始するフレーム番号(0〜) + * \param err エラー情報(省略可) + * + * シーク再生を開始するフレーム番号を指定します。 + * + * 再生開始前( CriMvEasyPlayer::Prepare()または CriMvEasyPlayer::Start()呼び出し前)に本関数を実行してください。 + * また、この関数はムービの再生中に呼び出すことは出来ません。再生中にシークをする場合は、一度再生を停止してから + * 本関数を呼び出してください。 + * + * 本関数を実行しなかった場合、またはフレーム番号0を指定した場合はムービの先頭から再生を開始します。 + * 指定したフレーム番号が、ムービデータの総フレーム数より大きかったり負の値だった場合もムービの先頭から再生します。 + * + * \ref usr_mech7 もあわせて参照してください。 + * + */ + void SetSeekPosition(CriSint32 seek_frame_id, CriError &err=CriMv::ErrorContainer); + + /*EN + * + * \brief Calculates a frame ID from a frame time + * + * \param count Timer counter + * \param unit Counter increment per second + * \param err Optional error code + * + * \return Frame ID corresponding to given time + * + * Each frame of a movie corresponds to a particular display time, based on the framerate. Given a + * time from the start of playback, this function will return the ID of the specific frame that should + * be displayed, barring any delays or skipped frames, at that time. + * + * The time, in seconds, is specified by \a count / \a unit.
+ * + * This function can be used for, among other things, jumping to a particular frame when a cuepoint is reached. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvEasyPlayer::CalcTimeFromFrameId(); + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 再生時刻からフレーム番号の計算 + * \param count タイマカウント + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * \param err エラー情報(省略可) + * \return frame ID + * + * 再生時刻からフレーム番号を計算します。 + * この関数は、EasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあとに使用できます。 + * + * シーク再生開始位置を、時刻から計算したいときに使用してください。 + * (例えばキューポイント情報からシーク位置を決定する場合など。) + * + * \sa CriMvEasyPlayer::CalcTimeFromFrameId(); + */ + CriSint32 CalcFrameIdFromTime(CriUint64 count, CriUint64 unit, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Calculates a frame time from a frame ID + * + * \param frame_id Frame ID + * \param unit Counter increment per second + * \param err Optional error code + * + * \return Timer counter corresponding to given frame ID + * + * Each frame of a movie corresponds to a particular display time, based on the framerate. Given a + * frame ID and the number of timer intervals per second, this function will return the timer count + * of the display time for that frame. + * + * The display time, in seconds, for this frame is calculated by dividing the timer count by the timer + * interval. + * + * If you have the movie frame, you do not have to calculate the time. The \a time and \a tunit fields + * of the CriMvFrameInfo structure that is passed the GetFrameOnTimeXXX() and DiscardNextFrame() + * functions will contain this information. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvEasyPlayer::CalcFrameIdFromTime(), CriMvFrameInfo + */ + /*JP + * \ingroup MODULE_OPTION + * \brief フレーム番号から再生時刻の計算 + * \param frame_id frame ID + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * \param err エラー情報(省略可) + * \return タイマカウント + * + * フレーム番号から再生時刻を計算します。 + * この関数は、EasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあとに使用できます。 + * + * 実際にフレーム取得した場合は、計算の必要はありません。フレーム情報構造体の時刻を参照してください。 + * + * \sa CriMvEasyPlayer::CalcFrameIdFromTime(), CriMvFrameInfo + */ + CriUint64 CalcTimeFromFrameId(CriSint32 frame_id, CriUint64 unit, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Find the next event point, if any, after the given time counter + * + * \param count Timer counter + * \param unit Counter increment per second + * \param type Type of event point to look for + * \param eventinfo Returned event point information structure + * \param err Optional error code + * + * \return Frame ID corresponding to given time + * + * Event points allow an application to associate arbitrary actions with specific points in a movie. + * This function will search forward in the movie for the next event point after the given time + * (specifed as \a count / \a unit). If an event point is found, \a eventinfo will be populated with + * the information about the event point, and the function will return the corresponding frame ID. + * + * \a type is an application-defined value that can be used to categorize event points, and is specified + * when the movie is encoded (see link to event-point-specification-section for more information + * about creating event points.). If -1 is passed as the value of \a type, all event points will be + * searched. Otherwise, only matching event point types will be searched. + * + * If no event point of the requested type is found, this function will return -1. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvEasyPlayer::SearchPrevEventPointByTime(); + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 指定時刻直後のイベントポイントの検索 + * \param count タイマカウント + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * \param type 検索対象とするイベントポイントのtype値 + * \param eventinfo 発見したイベントポイントの情報 + * \param err エラー情報(省略可) + * \return frame ID + * + * 指定時刻の次にあるイベントポイントを検索し、イベントポイント情報とフレーム番号を取得します。 + * この関数は、EasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあとに使用できます。 + * + * 検索の対象となるのは type で指定した値が一致するイベントポイントです。 + * type に -1を指定した場合は、全てのイベントポイントが検索対象となります。 + * + * 検索対象となるイベントポイントが発見できなかった場合は、フレーム番号は-1を返します。 + * + * \sa CriMvEasyPlayer::SearchPrevEventPointByTime(); + */ + CriSint32 SearchNextEventPointByTime(CriUint64 count, CriUint64 unit, CriSint32 type, + CriMvEventPoint &eventinfo, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Find the previous event point, if any, before the given time counter + * + * \param count Timer counter + * \param unit Counter increment per second + * \param type Type of event point to look for + * \param eventinfo Returned event point information structure + * \param err Optional error code + * + * \return Frame ID corresponding to given time + * + * Event points allow an application to associate arbitrary actions with specific points in a movie. + * This function will search backward in the movie (i.e. towards the beginning) for the next event + * point before the given time (specifed as \a count / \a unit). If an event point is found, + * \a eventinfo will be populated with the information about the event point, and the function will + * return the corresponding frame ID. + * + * \a type is an application-defined value that can be used to categorize event points, and is specified + * when the movie is encoded (see link to event-point-specification-section for more information + * about creating event points.). If -1 is passed as the value of \a type, all event points will be + * searched. Otherwise, only matching event point types will be searched. + * + * If no event point of the requested type is found, this function will return -1. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvEasyPlayer::SearchNextEventPointByTime(); + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 指定時刻直前のイベントポイントの検索 + * \param count タイマカウント + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * \param type 検索対象とするイベントポイントのtype値 + * \param eventinfo 発見したイベントポイントの情報 + * \param err エラー情報(省略可) + * \return frame ID + * + * 指定時刻の手前にあるイベントポイントを検索し、イベントポイント情報とフレーム番号を取得します。 + * この関数は、EasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあとに使用できます。 + * + * 検索の対象となるのは type で指定した値が一致するイベントポイントです。 + * type に -1を指定した場合は、全てのイベントポイントが検索対象となります。 + * + * 検索対象となるイベントポイントが発見できなかった場合は、フレーム番号は-1を返します。 + * + * \sa CriMvEasyPlayer::SearchNextEventPointByTime(); + */ + CriSint32 SearchPrevEventPointByTime(CriUint64 count, CriUint64 unit, CriSint32 type, + CriMvEventPoint &eventinfo, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Gets the list of all event points in the movie + * + * \param err Optional error code + * + * \return Pointer to the list of event points, or NULL if there are no event points + * + * CRI Movie considers a cue point list to be the number of event points in a movie, and a pointer to + * an array of event point structures. Event points allow an application to associate arbitrary actions + * with specific points in a movie. + * + * The returned pointer points to an area inside of the EasyPlayer's work buffer. An application should + * not attempt to write to it. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * The returned information is valid through the MVEASY_STATUS_STOP state. Once the EasyPlayer handle + * has been destroyed, or the movie has been restarted (by calling CriMvEasyPlayer::Start(), + * CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()), the cuepoint information will be + * invalid. + * + */ + /*JP + * \ingroup MODULE_OPTION + * \brief キューポイント情報(イベントポイント一覧)の取得 + * \param err エラー情報(省略可) + * \return Cue point info (Event point list) + * + * キューポイント情報(イベントポイント一覧)を取得します。 + * この関数は、EasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあとに使用できます。 + * + * この関数で取得するキューポイント情報は、再生ハンドルのワークバッファを直接参照しています。
+ * 再生停止状態での参照は可能ですが、次の再生を開始した後は参照を禁止します。
+ * このキューポイント情報を別のメモリにコピーした場合もこの条件は変わりません。 + * + */ + CriMvCuePointInfo* GetCuePointInfo(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets a function that will be called when a cue point is reached + * + * \param func Callback function + * \param usrobj Pointer to user-provided data + * \param err Optional error code + * + * Beginning with version 2.0, CRI Movie allows a movie to specify arbitrary actions to + * happen at various points on the timeline. These are referred to as \a cue \a points, or, + * more generally, as \a event \a points. If a cue point callback has been installed for the + * movie, it will be called whenever a cuepoint has been reached. + * + * The \a usrobj parameter specifies a pointer to arbitrary data, that will be passed as the + * third parameter to the callback. + * + * The prototype of the callback function is + * + * void callback(CriMvEasyPlayer *mveasy, CriMvEventPoint *eventinfo, void *usrobj) + * + * where + * + * mveasy is the EasyPlayer object
+ * eventinfo is the event info structure that was reached
+ * usrobj is the pointer to user data that was passed to SetFileRequestCallback().
+ * + * \remarks + * Do not call any movie playback functions (for example, CriMvEasyPlayer::Stop()) from the callback + * function. If you need to do this, set a flag from the callback and refer to it in your main loop. + * + * \sa CriMvEventPoint + */ + /*JP + * \ingroup MODULE_OPTION + * \brief キューポイントコールバック関数の登録 + * \param func キューポイントコールバック関数 + * \param usrobj ユーザオブジェクト + * \param err エラー情報(省略可) + * + * キューポイントのコールバック関数を登録します。 + * このコールバック関数は、ムービの再生時刻が各イベントポイントで指定された時刻を経過した時に発生します。 + * コールバック関数の呼び出し判定は CriMvEasyPlayer::Update() から行われます。 + * + * キューポイントコールバック発生時、コールバック関数の第2引数 eventinfo にはエベントポイント情報が、 + * 第3引数usrobjには、登録時に指定したユーザオブジェクトが渡されます。 + * + * キューポイントコールバック関数内では、ムービ再生をコントロールする関数(例えば CriMvEasyPlayer::Stop()) + * を呼び出してはいけません。 + * + * \sa CriMvEventPoint + */ + void SetCuePointCallback(void (*func)(CriMvEasyPlayer *mveasy, CriMvEventPoint *eventinfo, void *usrobj), + void *usrobj, CriError &err=CriMv::ErrorContainer); + + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Resets movie handle parameters to their default values + * + * \param err Optional error code + * + * This function will reset most parameters back to their default values. Call this when you are + * reusing an EasyPlayer handle and need to quickly undo changes to a number of parameters. + * + * Note that this will not remove a subaudio interface (set by CriMvEasyPlayer::AttachSubAudioInterface()). + * CriMvEasyPlayer::DetachSubAudioInterface() must be called instead. + * + * \remarks + * This function can be called once the EasyPlayer handle status is either MVEASY_STATUS_STOP or + * MVEASY_STATUS_PLAYEND. + * + * + *
Setting API Reset by ResetAllParameters() Reset by Stop() + *
SetFile YES (*1) + *
SetData YES (*1) + *
Pause YES YES + *
SetMasterTimer YES NO + *
SetNumberOfFramePools YES NO + *
SetBufferingTime YES NO + *
SetReloadThresholdTime YES NO + *
SetMaxBitrate YES NO + *
SetAudioTrack YES NO + *
SetLoopFlag YES NO + *
SetStreamingParameters YES NO + *
AttachSubAudioInterface NO NO + *
SetSubAudioTrack YES NO + *
ReplaceCenterVoice YES NO + *
SetFileRequestCallback YES NO + *
SetSeekPosition YES NO + *
SetCuePointCallback YES NO + *
+ * + * (*1) Normally, values set by SetFile() or SetData() are not reset by a call to Stop(). However, + * if a file request callback has been set (via CriMvEasyPlayer::SetFileRequestCallback()), this + * setting will be reset. + * + * \sa CriMvEasyPlayer::Stop(), CriMvEasyPlayer::SetFileRequestCallback() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief パラメータのリセット + * \param err エラー情報(省略可) + * + * 再生ハンドルに設定されたパラメータ類をリセットします。
+ * ただしサブオーディオ用インタフェースだけはリセットされませんので、アプリケーションで明示的に + * CriMvEasyPlayer::DetachSubAudioInterface() を呼び出してください。 + * + * 本関数はハンドル状態が MVEASY_STATUS_STOP または MVEASY_STATUS_PLAYEND の時に呼び出してください。 + * + * + *
設定関数 ResetAllParametersによる
リセット処理
Stopによる
リセット処理 + *
SetFile o (*1) + *
SetData o (*1) + *
Pause o o + *
SetMasterTimer o x + *
SetNumberOfFramePools o x + *
SetBufferingTime o x + *
SetReloadThresholdTime o x + *
SetMaxBitrate o x + *
SetAudioTrack o x + *
SetLoopFlag o x + *
SetStreamingParameters o x + *
AttachSubAudioInterface x x + *
SetSubAudioTrack o x + *
ReplaceCenterVoice o x + *
SetFileRequestCallback o x + *
SetSeekPosition o x + *
SetCuePointCallback o x + *
+ * (*1) 通常はリセットされません。ただしファイル要求コールバックが登録されていた場合はリセットされます。 + * + * \sa CriMvEasyPlayer::Stop() + */ + void ResetAllParameters(CriError &err=CriMv::ErrorContainer); + + /* 再生用ワークバッファおよび下位モジュールの解放(明示的な呼び出し用) */ + void ReleasePlaybackWork(CriError &err=CriMv::ErrorContainer); + +public: /* for DEBUG */ + /*//EN + * \ingroup MODULE_OPTION + * + * \brief Sets the maximum movie data read size + * + * \param max_chunk_size The maximum read size, in bytes + * \param err Optional error code + * + * This is a DEBUG function and should not normally need to be used by applications. + * + * Sets the maximum read size. CRI Movie will attempt to read this many bytes each time it + * needs to load more movie data from disk. + * + * If this function is called, it must be called before calling any of the playback functions + * (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()). + * + * To revert to the default behavior, pass 0 as \a max_chunk_size. + * + * \remarks + * If this function is called, the new value for \a max_chunk_size will not be reflected in the + * CriMvStreapingParameters structure. A call to CriMvEasyPlayer::GetMovieInfo() will return the + * original value that was set in the movie header. + * + * \remarks + * If you call CriMvEasyPlayer::SetStreamingParameters(), this function can not be used. + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::SetMinBufferSize() + */ + /*//JP + * \ingroup MODULE_OPTION + * \brief 最大チャンクサイズの指定 + * \param max_chunk_size 最大チャンクサイズ[byte] + * \param err エラー情報(省略可) + * + * ムービデータの最大チャンクサイズを指定します。
+ * 現在のライブラリでは、本関数はアプリケーションから使用する必要はありません。
+ * + * 本関数で設定した最大チャンクサイズは、CriMvEasyPlayer::GetMovieInfo 関数で取得するムービ情報には反映されません。 + * CriMvEasyPlayer::GetMovieInfo 関数で取得できるのはムービデータの本来の情報です。
+ * + * 本関数の呼び出しは、 CriMvEasyPlayer::Prepare 関数または CriMvEasyPlayer::Start 関数の前までに実行してください。 + * + * 最大チャンクサイズに 0を指定した場合、最大チャンクサイズはムービデータの持つ値となります。
+ * また、アプリケーションが CriMvEasyPlayer::SetStreamingParameters 関数を呼び出した場合は本関数で + * 設定した値よりも、 CriMvEasyPlayer::SetStreamingParameters 関数の指定が優先されます。 + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::SetMinBufferSize() + */ + void SetMaxChunkSize(CriUint32 max_chunk_size, CriError &err=CriMv::ErrorContainer); + + /*//EN + * \ingroup MODULE_OPTION + * + * \brief Sets the minimum movie data buffer size + * + * \param min_buffer_size The minimum buffer size, in bytes + * \param err Optional error code + * + * This is a DEBUG function and should not normally need to be used by applications. + * + * Sets the minimum buffer size used for reading movie data from disk. + * + * If this function is called, it must be called before calling any of the playback functions + * (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()). + * + * To revert to the default behavior, pass 0 as \a max_chunk_size. + * + * \remarks + * If this function is called, the new value for \a min_buffer_size will not be reflected in the + * CriMvStreapingParameters structure. A call to CriMvEasyPlayer::GetMovieInfo() will return the + * original value that was set in the movie header. + * + * \remarks + * If you call CriMvEasyPlayer::SetStreamingParameters(), this function can not be used. + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::SetMaxChunkSize() + */ + /*//JP + * \ingroup MODULE_OPTION + * \brief 最小バッファサイズの指定 + * \param min_buffer_size 最小バッファサイズ[byte] + * \param err エラー情報(省略可) + * + * ムービデータの最小バッファサイズを指定します。
+ * 現在のライブラリでは、本関数はアプリケーションから使用する必要はありません。
+ * + * 本関数で設定した最小バッファサイズは、CriMvEasyPlayer::GetMovieInfo 関数で取得するムービ情報には反映されません。 + * CriMvEasyPlayer::GetMovieInfo 関数で取得できるのはムービデータの本来の情報です。
+ * + * 本関数の呼び出しは、 CriMvEasyPlayer::Prepare 関数または CriMvEasyPlayer::Start 関数の前までに実行してください。 + * + * 最小バッファサイズに 0を指定した場合、最小バッファサイズはムービデータの持つ値となります。
+ * また、アプリケーションが CriMvEasyPlayer::SetStreamingParameters 関数を呼び出した場合は本関数で + * 設定した値よりも、 CriMvEasyPlayer::SetStreamingParameters 関数の指定が優先されます。 + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::SetMaxChunkSize() + */ + void SetMinBufferSize(CriUint32 min_buffer_size, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Retrieves various movie playback statistics + * + * \param playinfo Playback statistics structure + * \param err Optional error code + * + * This is a DEBUG function and is not normally needed by applications. + * + * Retrieves a number of performance statistics dealing with movie playback, including how often + * a frame could not be retrieved and how close the plaback framerate is to the movie's expected + * playback. + * + * This information is updated on every call to CriMvEasyPlayer::IsNextFrameOnTime(). In order for + * the values to be accurate, an application should call IsNextFrameOnTime() once each time through + * its main loop. Calling IsNextFrameOnTime() too often or not often enough will result in + * misleading statistics. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ムービ再生情報の取得 + * \param playinfo ムービ情報(返り値) + * \param err エラー情報(省略可) + * + * 本関数は通常、アプリケーションからは使用しません。デバッグ用の関数です。 + * + * 現在再生しているムービの再生情報 CriMvPlaybackInfo 構造体を取得できます。
+ * この情報からビデオフレームの取得間隔や、ビデオフレームのデコード遅延などを知ることができます。
+ * + * 再生情報はアプリが呼び出す CriMvEasyPlayer::IsNextFrameOnTime() 内で更新します。
+ * アプリケーションが CriMvEasyPlayer::IsNextFrameOnTime()を呼び出さない場合や、メインループで複数回 + * 呼び出す場合は情報が正しく更新されないので注意してください。
+ * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + void GetPlaybackInfo(CriMvPlaybackInfo & playinfo, CriError & err = CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Gets the result of the last attempt to retrieve a video frame + * + * \param err Optional error code + * + * \return The result of the last frame retrieval + * + * Returns one of the following values: + * + * + * + * + * + * + * + *
Value Meaning
CRIMV_LASTFRAME_OK The frame was successfully retrieved.
CRIMV_LASTFRAME_TIME_EARLY It is too soon to display this frame. The frame time + * is greater than the current playback time.
CRIMV_LASTFRAME_DECODE_DELAY The frame has not been decoded yet, or CRI Movie is not + * done decoding it.
CRIMV_LASTFRAME_DISCARDED The frame was discarded, by calling + * CriMvEasyPlayer::DiscardNextFrame()
+ * + * \remarks + * The result is determined by calling CriMvEasyPlayer::IsNextFrameOnTime(), not the GetFrameOnTimeXXX() + * functions. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::DiscardNextFrame() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 前回のビデオフレーム取得の結果を取得する + * \param err エラー情報(省略可) + * \return フレーム取得結果の列挙値 + * + * 本関数は通常、アプリケーションからは使用しません。デバッグ用の関数です。 + * + * 前回のビデオフレーム取得の結果を返します。 + * ビデオフレームのデコードが間に合っているのかどうかをチェックすることが出来ます。 + * + * 注意:
+ * ビデオフレーム取得の結果とは、基本的にアプリケーションが呼び出す CriMvEasyPlayer::IsNextFrameOnTime() の結果を元に + * 更新します。GetFrameOnTime関数の結果ではありません。 + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriMvLastFrameResult GetLastFrameResult(CriError & err = CriMv::ErrorContainer); + + /* [Unofficial] */ + /* Set the number of decoded frames to keep internally during the MVEASY_STATUS_PREP status. */ + /* Adjust the number if you need to reduce latesy for the first frame */ + void SetNumberOfFramesForPrep(CriUint32 num_frames, CriError & err = CriMv::ErrorContainer); + + /* [Unofficial] + * \ingroup MODULE_OPTION + * \brief 再生終了/停止通知コールバック関数の登録 + * \param func 再生終了/停止通知コールバック関数 + * \param usrobj ユーザオブジェクト + * \param err エラー情報(省略可) + * + * 再生終了および再生停止を通知するコールバック関数を登録します。 + * このコールバック関数は、ヘッダ解析/再生準備/再生状態から再生停止/再生終了状態に + * 遷移した直後に一度だけ呼び出されます。 + * コールバック関数の呼び出しは CriMvEasyPlayer::Update() から行われます。 + * + * 登録したコールバック関数内では、ムービ再生をコントロールする関数(例えば CriMvEasyPlayer::Stop()) + * を呼び出してはいけません。 + * + * 注意: MVEASY_STATUS_PLAYEND状態からMVEASY_STATUS_STOP状態への遷移時にはコールバック関数は呼び出されません。 + */ + void SetStopCompleteCallback(void (*func)(CriMvEasyPlayer *mveasy, void *usrobj), + void *usrobj, CriError &err=CriMv::ErrorContainer); + + /* For FAST_LATENCY */ + /*************************************************************************************/ + /* コンフィグ指定のハンドル作成関数 */ + static CriMvEasyPlayer* CRIAPI Create(CriHeap heap, + CriMvHandleConfig *config, + CriMvFileReaderInterface *freader, + CriMvSystemTimerInterface *stimer, + CriMvSoundInterface *sound, + CriError &err=CriMv::ErrorContainer); + + /* For Sofdec2 */ + /*************************************************************************************/ + enum MetaFlag { + MVEASY_META_FLAG_CUE = 0x0001, + MVEASY_META_FLAG_SEEK = 0x0002, + MVEASY_META_FLAG_ALL = MVEASY_META_FLAG_CUE + MVEASY_META_FLAG_SEEK, + + /* Keep enum 4bytes */ + MVEASY_META_FLAG_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + enum ReferFrameResult { + MVEASY_REFER_FRAME_RESULT_OK = (1), + MVEASY_REFER_FRAME_RESULT_SHORT_INPUT = (2), + MVEASY_REFER_FRAME_RESULT_SHORT_CPUTIME = (3), + MVEASY_REFER_FRAME_RESULT_DEMUX_STUCK = (4), + + /* Keep enum 4bytes */ + MVEASY_REFER_FRAME_RESULT_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /* ユーザからのワーク領域渡し版、ハンドル作成関数 */ + static CriMvEasyPlayer* CRIAPI Create(void *work, CriSint32 work_size, + CriMvHandleConfig *config, + CriMvFileReaderInterface *freader, + CriMvSystemTimerInterface *stimer, + CriMvSoundInterface *sound, + CriError &err=CriMv::ErrorContainer); + + /* 再生用ワーク領域サイズの計算 */ + CriSint32 CalcPlaybackWorkSize(const CriMvStreamingParameters *stmprm, CriError & err = CriMv::ErrorContainer); + + /* 再生用ワーク領域の設定関数 */ + void SetPlaybackWork(void *work, Sint32 work_size, CriError & err = CriMv::ErrorContainer); + + /* メタデータワーク用コールバック関数 */ + void SetMetaDataWorkAllocator(CriMvMetaDataWorkMallocFunc allocfunc, CriMvMetaDataWorkFreeFunc freefunc,void *usrobj, CriMvMetaFlag meta_flag); + + /* 引数で指定したフレーム情報の表示判定 */ + CriBool IsFrameOnTime(const CriMvFrameInfo *frameinfo, CriError &err=CriMv::ErrorContainer); + + /* フレームの参照 */ + ReferFrameResult ReferFrame(CriMvFrameInfo &frameinfo, CriError &err=CriMv::ErrorContainer); + + /* YUV個別バッファフォーマットでのバッファ取得 */ + CriBool LockFrameYUVBuffersWithAlpha(CriMvYuvBuffers &yuvbuffers, CriMvFrameInfo &frameinfo, CriMvAlphaFrameInfo &alpha_frameinfo, CriError &err=CriMv::ErrorContainer); + + /* LockFrameYUVBuffersWithAlphaでロックしたフレームの解放 */ + CriBool UnlockFrameBufferWithAlpha(CriMvFrameInfo *frameinfo, CriMvAlphaFrameInfo *alpha_frameinfo, CriError &err=CriMv::ErrorContainer); + + /* 32bitARGBバッファフォーマットへのコピー関数 */ + CriBool CopyFrameToBufferARGB32(CriUint8 *dstbuf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *srcbufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf, CriError &err=CriMv::ErrorContainer); + + /* 32bitARGBバッファフォーマットへαのみのコピー関数 */ + CriBool CopyAlphaToBufferARGB32( + const CriMvFrameInfo *src_vinf, + CriUint8 *dst_buf, + CriUint32 dst_pitch, + CriUint32 dst_bufsize, + CriError &err=CriMv::ErrorContainer + ); + +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_PC)|| defined(XPT_TGT_TRGP6K) + CriBool CopyFrameToBufferRGB565(CriUint8 *dstbuf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *srcbufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf, CriError &err=CriMv::ErrorContainer); +#endif + + /* YUV個別バッファフォーマットのコピー関数 */ + CriBool CopyFrameToBuffersYUV(CriMvYuvBuffers *dstbufs, + const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf, CriError &err=CriMv::ErrorContainer); + + /* リードバッファサイズの強制指定 */ + void SetReadBufferSize(CriUint32 buffer_size, CriError &err=CriMv::ErrorContainer); + + CriUint32 GetMinBufferSize(CriError &err=CriMv::ErrorContainer); + /**************************************************************************************/ + void SetVideoFramerate(CriUint32 framerate_n, CriUint32 framerate_d); + + void SetCompareFrameTimeCallback( + CriBool (*func)(CriMvEasyPlayer *mveasy, CriMvFrameInfo *frameinfo, CriUint64 count, CriUint64 unit, void *usrobj), + void *usrobj, CriError &err=CriMv::ErrorContainer); + void SetSeekFrameAndOffset(CriSint32 seek_frame_id, CriUint64 seek_byte, CriError &err=CriMv::ErrorContainer); + + enum InputMode { + MVEASY_INPUT_UNDEFINED, + MVEASY_INPUT_STREAMING, /* メモリストリーミング */ + MVEASY_INPUT_MEMORY, /* メモリ直接参照(ユニSJ) */ + + /* Keep enum 4bytes */ + MVEASY_INPUT_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + /* 実験中: この関数のために InputMode 定義を暫定でpublicへ移動 */ + void SetMemoryPlaybackType(InputMode memplay_type, CriError &err=CriMv::ErrorContainer); + + /* デコードスキップの自動実行モード */ + //void SetAutoSkipDecode(CriBool sw, CriFloat32 margin_msec, CriError &err=CriMv::ErrorContainer) + + /* ファイル要求の再コールバック要求 */ + void DeferFileRequest(CriError &err=CriMv::ErrorContainer); + + /* for specific use */ + void SetHeaderAndBodyData(const CriUint64Adr header_ptr, CriSint64 header_size, + const CriUint64Adr body_ptr, CriSint64 body_size); + CriSint32 CalcFramepoolWorkSize(const CriMvStreamingParameters *stmprm, CriError & err = CriMv::ErrorContainer); + void SetFramepoolWork(void *work, CriSint32 work_size, CriError & err = CriMv::ErrorContainer); + void SetFramepoolWorkAllocator(CriMvFramepoolWorkMallocFunc allocfunc, CriMvFramepoolWorkFreeFunc freefunc, void *usrobj); + void SetCapacityOfPictureSize(CriSint32 video_picsize, CriSint32 alpha_picsize, CriError &err); + void GetUsrCapacityOfPictureSize(CriSint32 *video_picsize, CriSint32 *alpha_picsize); + void SetMaxMovieSize(CriUint32 max_width, CriUint32 max_height, CriError &err); + void GetMaxMovieSize(CriUint32 *max_width, CriUint32 *max_height); + CriBool PlaybackResourceAllocated() const; + CriBool CanReusePlaybackResource(const CriMvStreamingParameters *stmprm) const; + CriBool GetReusePlaybackResourceFlag() const; + +private: + /* CRI internal use only */ + + void initializeHandleParameters(void); + void initializeCompareFrameParameters(void); + void resetHandleParameters(void); + CriBool startInputAndDecoding(void); + CriBool isEndReadFile(void); + void reinputDataForLooping(void); + void executeFileCloseServer(void); + void supplyDataFromStreamer(void); + void executeFileReadServer(void); + void executeFileOpenServer(void); + void executeCuePointServer(void); + //void executeAutoSkipDecode(void); + void executeWaitStatusServer(CriError &err = CriMv::ErrorContainer); + void surveilTerminationInput(void); + CriBool isAvailableCenterVoice(const CriMvStreamingParameters *stmprm); + CriBool isAvailableSubAudio(const CriMvStreamingParameters *stmprm); + CriBool attachCenterVoice(void); + void detachCenterVoice(void); + + CriBool attachSubAudioHandle(CriHeap heap); + void detachSubAudioHandle(void); + + void getAudioTime(CriUint64 &out_count, CriUint64 &out_unit, CriUint64 s_count, CriUint64 s_unit); + + CriBool allocAndCreateModules(void); + void startModules(void); + void requestStopModules(void); + CriBool closeFileIfOpening(void); + CriBool isCompleteStopModules(void); + void tryCleanupModules(CriMvPlyStatus mvstat); + CriBool tryFreeAndDestroySubmodules(void); + void freeAndDestroyModules(void); + + CriUint32 adjustNumTrackAudioOut(void); + + /* ストリーミング用のパラメータ取得 */ + /* GetMovieInfo()との違いはユーザ指定値がどこまで反映されるか。 + * 例えば、最大チャンクサイズはこの関数ではユーザ指定値をとるが、GetMovieInfoだとファイルの値。 + * この関数は、内部で下位モジュール作成およびメモリ確保する時に使う。 */ + CriBool GetStreamingParameters(CriMvStreamingParameters &stmprm, CriError &err=CriMv::ErrorContainer); + + void setNormalErrorStatus(const CriChar8 *errmsg); + + CriBool compareFrameTimeSimple(CriMvEasyPlayer *mveasy, CriMvFrameInfo *frameinfo, CriUint64 count, CriUint64 unit, void *usrobj); + static CriBool compareFrameTimeFluctuation(CriMvEasyPlayer *mveasy, CriMvFrameInfo *frameinfo, CriUint64 count, CriUint64 unit, void *usrobj); + + Bool isNextFrameOnTime(CriBool update_stats, CriError &err); + Bool checkFrameTime(CriMvFrameInfo *frameinfo); + void updateGetFrameInfo(CriBool time_ready, CriBool acquired_frame, CriBool discard_frame, CriUint64 frame_count, CriUint64 frame_unit); + + /* for DEBUG */ + void crimveasy_SetSeekInfo(void); + + void executeUpdate(CriError &err); + +private: + static CriUint32 crimveasy_SupplyPcmDataByFloat32(void *obj, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_SupplyPcmDataBySint16(void *obj, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_CalcAvailableNumSmpls(CriMvEasyPlayer *mveasy); + static CriUint32 crimveasy_GetWave16(CriMvEasyPlayer *mveasy, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_GetWave32(CriMvEasyPlayer *mveasy, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl); + + static CriUint32 crimveasy_SupplySubAudioDataByFloat32(void *obj, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_GetSubAudioWave32(CriMvEasyPlayer *mveasy, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_SupplySubAudioDataBySint16(void *obj, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_GetSubAudioWave16(CriMvEasyPlayer *mveasy, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl); + +public: + CriMvPly mvply; /* Temporally allowed to access for debug */ + +private: + CriHeap heap; + CriBool user_stmprm_flag; + CriMvStreamingParameters stmprm; + CriBool alloced_submodules_flag; + CriMvFrameInfo frameinfo; + CriMvAlphaFrameInfo alpha_frame; + CriMvFileReaderInterface *freader; + CriMvSoundInterface *sndout; + CriMvSystemTimerInterface *stimer; + TimerType timertype; + Status pre_ezstat; + CriBool req_decode_header_flag; + CriBool req_prepare_flag; + CriBool pause_flag; + CriUint32 npools; + CriSint32 track_play_audio; + CriUint32 num_track_audio_data; + CriUint32 num_track_audio_out; + CriBool loop_flag; + CriUint64 time_count; + CriUint64 time_unit; + CriSint64 total_read; + CriSint64 fsize_byte; + CriChunk read_crick; + CriBool exe_open; + CriBool exe_close; + CriBool exe_read; + + CriUint64 time_syslog_count; /* システムタイマの記録 */ + CriUint64 time_syslog_unit; + CriUint64 time_ofs_count; /* オーディオ終了時のシステムタイマ */ + CriUint64 time_ofs_unit; + CriUint64 time_prev_audio_count; /* オーディオ時刻変化チェック用 */ + CriUint64 time_prev_audio_unit; + + CriFloat32 user_buffering_sec; /* 0.0f means AUTO */ + CriUint32 user_max_bitrate; /* 0 means AUTO */ + CriUint32 user_max_chunk_size; /* 0 means AUTO */ + CriUint32 user_min_buffer_size; /* 0 means AUTO */ + CriSint32 user_read_buffer_size; /* CRIMV_READ_BUFFER_SIZE_AUTO means AUTO */ + CriSint32 user_video_capacity_of_picsize; /* 0 means AUTO */ + CriSint32 user_alpha_capacity_of_picsize; /* 0 means AUTO */ + CriUint32 user_max_width; + CriUint32 user_max_height; + + CriSint32 usr_subtitle_channel; + CriMvSubtitleInfo sbtinfo; + CriFloat32 sbt_start_msec; + CriFloat32 sbt_end_msec; + CriUint8 *sbtbuf; + + enum InputSrc { + MVEASY_INPUT_SRC_UNDEFINED, + MVEASY_INPUT_SRC_FILE, + MVEASY_INPUT_SRC_MEMORY, + /* Keep enum 4bytes */ + MVEASY_INPUT_SRC_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + InputSrc input_src; + CriMvFileReaderInterface *ext_reader; + CriMvFileReaderInterface *mem_reader; + + enum InputSupplyStatus { + MVEASY_SUPPLY_STOP, + MVEASY_SUPPLY_REQ_OPEN, + MVEASY_SUPPLY_OPENING, + MVEASY_SUPPLY_READING, + MVEASY_SUPPLY_REQ_CLOSE, + MVEASY_SUPPLY_CLOSING, + + /* Keep enum 4bytes */ + MVEASY_SUPPLY_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + InputMode memplay_type; /* メモリ再生をストリームするかユニSJするか */ + InputMode input_mode; + InputSupplyStatus supply_stat; + CriBool change_file_mode; + CriChar8 file_name[CRIMV_MAX_FILE_NAME]; + CriUint64 file_offset; + CriSint64 file_range; + CriUint8 *dataptr; + CriUint32 datasize; + CriBool terminate_flag; + CriSint32 reinput_cnt; + + enum NextEntryState { + MVEASY_NEXT_ENTRY_NONE, + MVEASY_NEXT_ENTRY_READY, + MVEASY_NEXT_ENTRY_DEFER, + /* Keep enum 4bytes */ + MVEASY_NEXT_ENTRY_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + NextEntryState next_entry_state; + + CriUint32 center_ch; + CriSint32 usr_voice_track; // by SetCenterVoice() + CriSint32 voice_attached_track; + + // Sub Audio + CriMvSoundInterface *if_subaudio; + CriSint32 usr_subaudio_track; + CriSint32 attached_subaudio_track; + + void (*cbfunc_file_request)(CriMvEasyPlayer *mveasy, void *usrobj); + void *usrobj_file_request; + + CriBool (*cbfunc_compare_ftime)(CriMvEasyPlayer *mveasy, CriMvFrameInfo *frameinfo, CriUint64 count, CriUint64 unit, void *usrobj); + void *usrobj_compare_ftime; + + /* Seek Playback */ + CriSint32 seek_frame_id; + CriUint64 seek_byte; + + /* CuePoint */ + void (*cbfunc_cuepoint)(CriMvEasyPlayer *mveasy, CriMvEventPoint *eventinfo, void *usrobj); + void *usrobj_cuepoint; + + /* Playback Statistics */ + CriBool start_getfrm; + CriUint64 last_getfrm_count; + CriFloat32 sum_diff_time; + CriMvPlaybackInfo playinfo; + CriMvLastFrameResult last_frm_result; + + /* Block flag for simultanious calls on multi-threads */ + CriSint32 execute_decode_block_flag; + CriSint32 update_block_flag; + + /* Stop Completion Notification */ + void (*cbfunc_stopcomplete)(CriMvEasyPlayer *mveasy, void *usrobj); + void *usrobj_stopcomplete; + + /* For Sofdec2 */ + void *playback_work; + CriSint32 playback_work_size; + void *mvply_work; + CriHeap heap_mveasy; + CriHeap heap_extra_sound; + CriBool reuse_modules_flag; + + /* For Debug */ + volatile CriUint8 end_sequence_info; + + /* Handle Protection */ + void *cshn; + void *cs_work; + + /* Skip Decoding */ + //CriBool skip_auto_flag; + //CriFloat32 margin_msec; + +public: + enum FrameCompareMode { + MVEASY_COMPARE_MODE_JUST, /* 正確に時刻比較する */ + MVEASY_COMPARE_MODE_DELAY_GET, /* タイマ時刻を前倒し=フレームはなるべく渡さない */ + MVEASY_COMPARE_MODE_FAST_GET, /* タイマ時刻を水増し=フレームはなるべく渡す */ + + /* Keep enum 4bytes */ + MVEASY_COMPARE_MODE_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + FrameCompareMode compare_mode; + CriFloat32 accuracy_system_tmr_msec; /* システム時刻精度 milli sec */ + CriFloat32 accuracy_audio_tmr_msec; /* オーディオ時刻精度 milli sec */ + CriFloat32 fluctuation_system; /* システム(SyncFrame)の揺らぎ milli sec */ + CriFloat32 fluctuation_adjust; /* 揺らぎ補正 */ +// CriFloat32 fluctuation_system_msec; /* システム時刻ゆらぎ幅 milli sec */ +// CriFloat32 fluctuation_audio_msec; /* オーディオ時刻ゆらぎ幅 milli sec */ +// CriFloat32 fluctuation_adjust; /* ゆらぎ補正倍率 */ +// CriSint32 fluctuation_system_usec; /* システム時刻ゆらぎ幅 micro sec */ +// CriSint32 fluctuation_audio_usec; /* オーディオ時刻ゆらぎ幅 micro sec */ +// CriFloat32 fluctuation_adjust_multi; /* ゆらぎ補正倍率 */ +// CriSint32 fluctuation_adjust_add; /* ゆらぎ補正オフセット */ + +private: + CriBool req_stop_modules; + CriBool error_flag; + CriBool req_start_modules; + +protected: + CriMvEasyPlayer(CriHeap heap, + CriMvFileReaderInterface *freader, + CriMvSystemTimerInterface *stimer, + CriMvSoundInterface *sound, + CriError &err=CriMv::ErrorContainer); + virtual ~CriMvEasyPlayer(); + +private: + CriMvEasyPlayer(void); //disabled +}; + + + + +#endif /* CRI_MOVIE_H_INCLUDED */ diff --git a/3rdParty/cri/PS4/include/cri_movie_core.h b/3rdParty/cri/PS4/include/cri_movie_core.h new file mode 100644 index 00000000..06f7f797 --- /dev/null +++ b/3rdParty/cri/PS4/include/cri_movie_core.h @@ -0,0 +1,2554 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2005-2013 CRI Middleware Co., Ltd. + * + * Library : CRI Movie + * Module : Library User's Header + * File : cri_movie_core.h + * Date : 2013-11-21 + * Version : (see CRIMVPLY_VER) + * + ****************************************************************************/ +/*! + * \file cri_movie_core.h + */ +#ifndef CRI_MOVIE_CORE_H_INCLUDED /* Re-definition prevention */ +#define CRI_MOVIE_CORE_H_INCLUDED + +/* Version No. */ +#define CRIMVPLY_VER "3.50" +#define CRIMVPLY_NAME "criMvPly" + +/*************************************************************************** + * Include file + ***************************************************************************/ +#include +#include +#include + +/*************************************************************************** + * MACRO CONSTANT + ***************************************************************************/ + +/*EN + * \brief Audio OFF setting of Audio Track + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +/*JP + * \brief オーディオ再生OFFの指定値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +#define CRIMV_AUDIO_TRACK_OFF (-1) + +/*EN + * \brief Default setting of Audio Track + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +/*JP + * \brief オーディオチャネルのデフォルト値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +#define CRIMV_AUDIO_TRACK_AUTO (100) + +/*EN + * \brief Maximum number of PCM tracks in one audio stream + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief オーディオデータ内の最大PCMトラック数 + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_PCM_BUFFER_MAX (8) + +/*EN + * \brief Subtitle OFF setting + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ +/*JP + * \brief 字幕再生OFFの指定値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ +#define CRIMV_SUBTITLE_CHANNEL_OFF (-1) + +/*EN + * \brief Maximum number of video tracks in a movie file + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief ムービファイル内の最大ビデオストリーム数 + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_MAX_VIDEO_NUM (1) + +/*EN + * \brief Maximum number of audio tracks in a movie file + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief ムービファイル内の最大オーディオストリーム数 + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_MAX_AUDIO_NUM (32) + +/*EN + * \brief Maximum number of alpha tracks in a movie file + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief ムービファイル内の最大アルファストリーム数 + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_MAX_ALPHA_NUM (1) + +#if defined(XPT_TGT_PC) +/*EN + * \brief Number of extra threads for multicore decoding + * \ingroup MDL_MV_OPTION + * The number of additional decoding threads that CRI Movie library internally creates. + * The threads are intended to run on multiple processors in parallel. + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +/*JP + * \brief マルチコアデコード用の追加のデコードスレッド数 + * \ingroup MDL_MV_OPTION + * CRI Movieライブラリが内部で作成する追加のデコードの数です。これらのスレッドは、マルチコアPC上で + * デコード処理を並列分散させるために作られます。 + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +#define CRIMV_NUM_EXT_DECTHREAD_PC (3) + +/*EN + * \brief Default affnity mask of a thread + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +/*JP + * \brief スレッドアフィニティマスクのデフォルト設定値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +#define CRIMV_DEFAULT_AFFNITY_MASK_PC (0xFFFFFFFF) + + +/*EN + * \brief Default priority of a thread + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +/*JP + * \brief スレッドのデフォルト優先度 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +#define CRIMV_DEFAULT_THREAD_PRIORITY_PC (0x8000000) +#endif + +/*EN + * \brief Default value of the read buffer size + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetReadBufferSize() + */ +/*JP + * \brief リードバッファサイズをデフォルト値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetReadBufferSize() + */ +#define CRIMV_READ_BUFFER_SIZE_AUTO (-1) + + +/*************************************************************************** + * Library Spec Defenition + ***************************************************************************/ + +/* */ + +/* 2007-09-06:URUSHI オーディオ処理のサブモジュール化 * + * MvPlyのオーディオ処理部分をCriMvPlyAmngという新たなクラスに切り出す。* + * CriMvPlyAmngはデマルチプレクサから全トラックデータを受け取って、 * + * トラックごとに割り振られたAdecに処理を渡します。 * + * 目的は以下の二つ * + * 1) オーディオトラックの動的切替 * + * 2) ループ再生での異なるAV尺の同期 */ + +#define NUM_MAX_ADEC (2) /* Adecの最大数 */ +/* ADECのインデックス定義 */ +/* このindexを使ってCriMvPlyAmngからAdecをコントロールしてください。 */ +#define MAIN_ADEC_IDX (0) // メイントラック用 +#define SUB_ADEC_IDX (1) // ボイストラック用 + +/* オーディオの動的切替機能をサポートするか */ +//#define ENABLE_DYNAMIC_AUDIO_SWITCH + +#if defined(ENABLE_DYNAMIC_AUDIO_SWITCH) + #define CRIMVPLYAMNG_TRACK_OFF (512) // 切り替え先トラック番号のデフォルト値(切替OFF) + + /* トラックの動的切替のための状態定義 */ + typedef enum _crimvplyamng_track_state { + CRIMVPLYAMNG_TRACK_STATE_FIXED = (1), // デフォルト + CRIMVPLYAMNG_TRACK_STATE_PREP_SWITCHING, // ユーザが切替を命令し、切替の準備段階(時刻判定のための基準時間をセット) + CRIMVPLYAMNG_TRACK_STATE_SWITCHING // 切替元と先の時刻判定を行なって切替を行なう状態 + } CriMvPlyAmngTrackState; +#endif + +/* 連結再生時、2個目以降のヘッダを取得できるようにするため */ +#define CRIMVPLY_HEAD_CONTAINER_NUM (2) + +/* 再読み込み閾値のデフォルト値 */ +#define CRIMV_DEFAULT_RELOAD_THRESHOLD (0.8f) // 0.8[sec] + +/* 再生準備中の貯金フレーム数デフォルト値 */ +#define CRIMV_DEFAULT_NUM_FRAMES_FOR_PREP (-1) /* デフォルト:不使用 (フレームプール数を採用) */ + +/* 内部ワーク領域の確保にCRI Heapを使用しない */ +#define CRIMV_REMOVE_CRIHEAP + +/* 機種固有フレーム情報数 */ +#define CRIMV_FRAME_DETAILS_NUM (2) + +/* CriVavfios で指定する外部ファイルのパスの上限 */ +#if defined(XPT_TGT_IOS) + #define CRIMVPLY_VAVFIOS_MAX_FILEPATH (256) +#endif + +/*************************************************************************** + * Process MACRO + ***************************************************************************/ +#define criMv_SetDefaultHandleConfig(p_config) \ +{\ + (p_config)->readbuffer_size = 0;\ +} + +/*************************************************************************** + * Enum declaration + ***************************************************************************/ +/*EN + * \brief Speaker index of CRI Movie PCM output + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief CRI Movie のPCM出力のスピーカー配置 + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_PCM_BUFFER_L = 0, /*EN< The LEFT channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の LEFT チャンネル */ + CRIMV_PCM_BUFFER_R = 1, /*EN< The RIGHT channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の RIGHT チャンネル */ + CRIMV_PCM_BUFFER_LS = 2, /*EN< The Surround LEFT channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の Surround LEFT チャンネル */ + CRIMV_PCM_BUFFER_RS = 3, /*EN< The Surround RIGHT channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の Surround RIGHT チャンネル */ + CRIMV_PCM_BUFFER_C = 4, /*EN< The CENTER channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の CENTER チャンネル */ + CRIMV_PCM_BUFFER_LFE = 5, /*EN< The LFE channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の LFE チャンネル */ + CRIMV_PCM_BUFFER_EXT1 = 6, /*EN< The EXT1(Rear Left) channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の EXT1(Rear Left) チャンネル */ + CRIMV_PCM_BUFFER_EXT2 = 7, /*EN< The EXT2(Rear Right) channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の EXT2(Rear Right) チャンネル */ + + /* Keep enum 4bytes */ + CRIMV_PCM_BUFFER_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvPcmBufferIndex; + + +/*EN + * \brief Composite mode of alpha movie + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief アルファムービの合成モード + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_COMPO_OPAQ = 0, /*EN< Opacity, no alpha value */ + /*JP< 不透明、アルファ情報なし */ + CRIMV_COMPO_ALPHFULL = 1, /*EN< Full alpha blending (8bits-alpha data) */ + /*JP< フルAlpha合成(アルファ用データが8ビット) */ + CRIMV_COMPO_ALPH3STEP = 2, /*EN< 3 Step Alpha */ + /*JP< 3値アルファ */ + CRIMV_COMPO_ALPH32BIT = 3, /*EN< Full alpha blending (32bits color + alpha data) */ + /*JP< フルAlpha、(カラーとアルファデータで32ビット) */ + CRIMV_COMPO_ALPH1BIT = 4, /*EN< Alpha blending (24bits color + 1->8bits alpha) */ + /*JP< フルAlpha、(カラーとアルファデータで32bit、値は2値) */ + CRIMV_COMPO_ALPH2BIT = 5, /*EN< Alpha blending (24bits color + 2->8bits alpha) */ + /*JP< フルAlpha、(カラーとアルファデータで32bit、値は4値) */ + CRIMV_COMPO_ALPH3BIT = 6, /*EN< Alpha blending (24bits color + 3->8bits alpha) */ + /*JP< フルAlpha、(カラーとアルファデータで32bit、値は8値) */ + CRIMV_COMPO_ALPH4BIT = 7, /*EN< Alpha blending (24bits color + 4->8bits alpha) */ + /*JP< フルAlpha、(カラーとアルファデータで32bit、値は16値)*/ + + /* Keep enum 4bytes */ + CRIMV_COMPO_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvAlphaType; + + +/*EN + * \brief Result of the last video frame retrieval + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief 前回のビデオフレーム取得の結果 + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_LASTFRAME_OK = 0, /*EN< Succeeded */ + /*JP< 取得成功 */ + CRIMV_LASTFRAME_TIME_EARLY = 1, /*EN< Failed. The frame is not yet the time to draw */ + /*JP< 取得失敗。フレーム表示時刻が再生時間に達していなかった */ + CRIMV_LASTFRAME_DECODE_DELAY = 2, /*EN< Failed. The frame to draw is not decoded yet */ + /*JP< 取得失敗。ビデオフレームのデコードが間に合わなかった */ + CRIMV_LASTFRAME_DISCARDED = 3, /*EN< Failed. The video frame is discarded by app */ + /*JP< 取得失敗。アプリによって破棄された */ + //CRIMV_LASTFRAME_NO_INPUT_DATA = 4, //Not supported yet + //CRIMV_LASTFRAME_SKIPPED = 5, //Not supported yet + //CRIMV_LASTFRAME_DEMUX_STUCKED = 6, //Not supported yet + + /* Keep enum 4bytes */ + CRIMV_LASTFRAME_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvLastFrameResult; + +#if defined(XPT_TGT_PS3PPU) +/*EN + * \brief Graphic Environment type for PS3 + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief PS3のグラフィック環境 + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_GRAPHIC_ENV_GCM = 0, /*EN< GCM. (or same ARGB 32bit texture format of GCM) */ + /*JP< GCM環境 (またはテクスチャフォーマットがGCMと同じ環境) */ + CRIMV_GRAPHIC_ENV_PSGL = 1, /*EN< PSGL. (or same ARGB 32bit texture format of PSGL) */ + /*JP< PSGL環境 (またはテクスチャフォーマットがPSGLと同じ環境) */ + + /* Keep enum 4bytes */ + CRIMV_GRAPHIC_ENV_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvGraphicEnv; +#endif + + +/* CRI Movie Interanl handle status + * + * The possible legal states of a CriMvPly handle. Over the course of your application + * the CriMvPly handle will walk through the following states in roughly the following + * order. In states that are waiting states, you can request the + * CriMvPly handle to advance to the next state by calling the criMvPly_IncrementState() + * function. You can check the status of a valid CriMvPly handle at any time + * by calling criMvPly_GetStatus(). + * + * It is not possible to jump from a state to an arbitrary other state. Normal play + * proceeds from the CRIMVPLY_STATUS_STOP state through the CRIMV_PLY_STATUS_PLAYEND + * state in that order. Premature termination can be requested with the criMvPly_Stop() + * function. + * + * \sa criMvPly_IncrementState(), criMvPly_GetStatus(), criMvPly_Stop() + */ +typedef enum { + CRIMVPLY_STATUS_STOP = 0, /* Standstill. No processing is occurring. + * CriMvPly handles are created into this state. + */ + /* 停止中 */ + CRIMVPLY_STATUS_DECHDR = 1, /* The CriMvPly structure is now parsing the header + * of the file, including information on height and width + * of the video stream. + */ + /* ヘッダ解析中 */ + CRIMVPLY_STATUS_WAIT_PREP = 2, /* The header has been decoded and criMvPly_GetStreamingParameters() + * will now provide valid values. Typically you will call + * criMvPly_AllocateWorkBuffer() with this information at this point. + */ + /* PREP状態へのIncrementState待ち
+ AllocateWorkBufferしてから次へいくこと */ + CRIMVPLY_STATUS_PREP = 3, /* Transition to this state to acknowledge to the + * CriMvPly handle that you have allocated your work buffers. */ + /* 再生準備中 */ + CRIMVPLY_STATUS_WAIT_PLAYING = 4, /* The audio and video decoders are now ready to begin playback.*/ + /* PLAYING状態へのIncrementState待ち
+ この状態で既にビデオとオーディオのデコード結果は取得できる。*/ + CRIMVPLY_STATUS_PLAYING = 5, /* The decoders are currently decoding and playing output. */ + /* 再生中 */ + CRIMVPLY_STATUS_WAIT_PLAYEND = 6, /* The library is waiting for you to acknowledge the end of the movie. You + * have informed the CriMvPly structure that an end-of-file condition exists, + * but final frames of video and audio may still be pending in your application. */ + /* PLAYEND状態へのIncrementState待ち */ + CRIMVPLY_STATUS_PLAYEND = 7, /* You have acknowledged the end of the movie. Teardown can occur at this point. */ + /* 再生終了 */ + CRIMVPLY_STATUS_STOP_PROCESSING = 8, /* A request to stop has been received by the CriMvPly structure, + * that is, you have called criMvPly_Stop(), and a stop is now pending. */ + /* 停止処理中 */ + CRIMVPLY_STATUS_WAIT_STOP = 9, /* The CriMvPly handle has acknowledged the stop request and + * you may now call criMvPly_IncrementState() to transition to + * the CRIMVPLY_STATUS_STOP state. */ + /* STOP状態へのIncrementState待ち */ + CRIMVPLY_STATUS_ERROR = 10, /* An error has occurred. */ + /* エラー */ + + /* Keep enum 4bytes */ + CRIMVPLY_STATUS_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvPlyStatus; + + +/* Sofdec2 */ +typedef enum { + CRIMVPLY_META_FLAG_OFF = 0x0000, + CRIMVPLY_META_FLAG_CUE = 0x0001, + CRIMVPLY_META_FLAG_SEEK = 0x0002, + CRIMVPLY_META_FLAG_ALL = CRIMVPLY_META_FLAG_CUE + CRIMVPLY_META_FLAG_SEEK, + + /* Keep enum 4bytes */ + CRIMVPLY_META_FLAG_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvMetaFlag; + +/* Color Conversion*/ +typedef enum{ + CRIMV_COLORSPACE_CONVERSION_TYPE_ITU_R_BT601_LIMITED = 0, + CRIMV_COLORSPACE_CONVERSION_TYPE_ITU_R_BT601_FULLRANGE = 1, + + /* Keep enum 4bytes */ + CRIMV_COLORSPACE_CONVERSION_TYPE_ENUM_SINT32 = 0x7FFFFFFF +}CriMvColorSpaceConversionType; + +typedef void *(*CriMvMetaDataWorkMallocFunc)(void *obj, CriUint32 size); +typedef void (*CriMvMetaDataWorkFreeFunc)(void *obj, void *mem); + +/* OUTER_FRAMEPOOL_WORK */ +#define CriMvFramepoolWorkMallocFunc CriMvMetaDataWorkMallocFunc +#define CriMvFramepoolWorkFreeFunc CriMvMetaDataWorkFreeFunc + +/*************************************************************************** + * Data type declaration + ***************************************************************************/ + +/*EN + * \brief Audio parameters + * \ingroup MDL_MV_INFO + * + * \sa CriMvStreamingParameters, CriMvWaveInfo + */ +/*JP + * \brief オーディオパラメータ + * \ingroup MDL_MV_INFO + * + * オーディオストリームのパラメータ + * \sa CriMvStreamingParameters, CriMvWaveInfo + */ +typedef struct { + CriUint32 sampling_rate; /*EN< Sampling rate */ + /*JP< サンプリング周波数 */ + CriUint32 num_channel; /*EN< Number of channels. Monaural = 1, Stereo = 2 */ + /*JP< オーディオチャネル数 */ + CriUint32 total_samples; /*EN< Total number of samples */ + /*JP< 総サンプル数 */ + CriUint32 output_buffer_samples; /*EN< Output wave buffer size */ + /*JP< サウンド出力バッファのサンプル数 */ + CriUint32 codec_type; /*EN< Codec type */ + /*JP< コーデック種別 */ + +} CriMvAudioParameters; + +/*EN + * \brief Video Parameters + * \ingroup MDL_MV_INFO + * \sa CriMvStreamingParameters + */ +/*JP + * \brief ビデオパラメータ + * \ingroup MDL_MV_INFO + * ビデオストリームのパラメータ + * \sa CriMvStreamingParameters + */ +typedef struct { + CriUint32 max_width; /*EN< Maximum video width for stream. (multiple of 8) */ + /*JP< ムービ最大幅(8の倍数) */ + CriUint32 max_height; /*EN< Maximum video height for stream. (multiple of 8)*/ + /*JP< ムービ最大高さ(8の倍数) */ + CriUint32 disp_width; /*EN< Width of the image to draw. */ + /*JP< 表示したい映像の横ピクセル数(左端から) */ + CriUint32 disp_height; /*EN< Height of the image to draw. */ + /*JP< 表示したい映像の縦ピクセル数(上端から) */ + CriUint32 num_frame_pool; /*EN< Number of frame pools required for stream */ + /*JP< フレームプール数 */ + CriUint32 framerate; /*EN< Frame rate per second [x1000]. */ + /*JP< フレームレート[x1000] */ + CriUint32 framerate_n; /*EN< Frame rate (in rational as numerator). framerate_n/framerate_d = framerate */ /* UTODO: 変数名 */ + /*JP< フレームレートの分子(有理数形式)。framerate_n/framerate_d = framerate */ + CriUint32 framerate_d; /*EN< Frame rate (in rational as denominator). */ + /*JP< フレームレートの分母(有理数形式)。 */ + CriUint32 total_frames; /*EN< Total number of video frames */ + /*JP< 総フレーム数 */ + + CriUint32 material_width; /*EN< Width of the video source resolustion before encoding. */ + /*JP< エンコード前のビデオ素材の横ピクセル数 */ + CriUint32 material_height; /*EN< Height of the video source resolustion before encoding. */ + /*JP< エンコード前のビデオ素材の縦ピクセル数 */ + CriUint32 screen_width; /*EN< Screen width set by encoding and cropping. + * This parameter is only available when you encoded the movie with "Widescreen TV Support" option. + * Normally this value is 0. */ + /*JP< エンコード時に指定したスクリーン幅。 + * この値はエンコード時に「ワイドテレビ支援機能」を使用した場合のみ有効になります。 + * 通常は0です。 */ + + CriUint32 codec_type; /*EN< Video Codec Type. If you encoded the movie for PS2, this value is 2. + * Normally this value is 1 or 0(no info). + * If the codec_type is 1, the CRI Movie for ONLY PS2 can play the movie file. */ + /*JP< ビデオコーデック種別。PS2用にエンコードした場合 2になります。 + * 通常は 1または 0(情報無し)です。 + * コーデック種別が2のムービは、PS2版ライブラリで「のみ」再生可能です。 */ + CriUint32 codec_dc_option; /*EN< Video Codec DC Option. If you encoded the movie for PS2, this value is 10. + * Normally this value is 11 or 0(no info). + * If the codec_type is 11, the CRI Movie for PS2 can NOT play the movie file. */ + /*JP< ビデオコーデックのDCオプション種別。PS2用にエンコードした場合10になります。 + * 通常は11または 0(情報無し)です。 + * コーデックDCオプションが11のムービは、PS2版ライブラリ「では」再生できません。 */ + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< 色変換タイプ。 */ + CriSint32 capacity_of_picsize; /*EN< Capacity size of video pictures. */ + /*JP< ピクチャサイズ上限値 */ + CriUint32 average_bitrate; /*EN< Average bitrate. */ + /*JP< 平均ビットレート */ +} CriMvVideoParameters; + +/*EN + * \brief Alpha Parameters + * \ingroup MDL_MV_INFO + * \sa CriMvStreamingParameters + */ +/*JP + * \brief アルファパラメータ + * \ingroup MDL_MV_INFO + * アルファストリームのパラメータ + * \sa CriMvStreamingParameters + */ +typedef struct { + CriUint32 max_width; /*EN< Maximum alpha width for stream */ + /*JP< アルファフレームの最大幅 */ + CriUint32 max_height; /*EN< Maximum alpha height for stream */ + /*JP< アルファフレームの最大高さ */ + CriUint32 disp_width; /*EN< valid alpha width */ + /*JP< アルファフレームの実有効幅 */ + CriUint32 disp_height; /*EN< valid alpha height */ + /*JP< アルファフレームの実有効高さ */ + CriUint32 framerate; /*EN< Frame rate per second [x1000]. */ + /*JP< アルファのフレームレート[x1000] */ + CriUint32 framerate_n; /*EN< Frame rate (in rational as numerator). framerate_n/framerate_d = framerate */ /* UTODO: 変数名 */ + /*JP< フレームレートの分子(有理数形式)。framerate_n/framerate_d = framerate */ + CriUint32 framerate_d; /*EN< Frame rate (in rational as denominator). */ + /*JP< フレームレートの分母(有理数形式)。 */ + CriUint32 total_frames; /*EN< Total number of alpha frames */ + /*JP< 総フレーム数 */ + CriMvAlphaType alpha_type; /*EN< Alpha Composite Type. */ + /*JP< アルファ合成種別。 */ + CriUint32 codec_type; /*EN< Internal use only. Do not access this */ + /*JP< ライブラリ内部使用変数 */ + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< 色変換タイプ。 */ + CriSint32 capacity_of_picsize; /*EN< Capacity size of video pictures. */ + /*JP< ピクチャサイズ上限値 */ + CriUint32 average_bitrate; /*EN< Average bitrate. */ + /*JP< 平均ビットレート */ +} CriMvAlphaParameters; + + +/*EN + * \brief Streaming Parameters + * \ingroup MDL_MV_INFO + * This structure includes streaming parameters and playing parameters. + * \sa CriMvEasyPlayer::GetMovieInfo() + */ +/*JP + * \brief ストリーミング再生パラメータ + * \ingroup MDL_MV_INFO + * ストリーミング再生パラメータ。
+ * ストリーム自体の情報と、再生のために必要なパラメータの両方を含んでいる。 + * \sa CriMvEasyPlayer::GetMovieInfo() + */ +typedef struct { + /* Stream */ + CriUint32 is_playable; /*EN< Flag of the movie file is playable or not. 1 is playable. 0 is not playable.*/ + /*JP< 再生可能フラグ(1: 再生可能、0: 再生不可) */ + CriFloat32 buffering_time; /*EN< Amount of time to buffer in the stream, in seconds */ + /*JP< 読み込みデータのバッファリング時間。単位[sec]。 */ + CriUint32 max_bitrate; /*EN< Maximum bits per second for stream. This value includes video and audio both. */ + /*JP< 最大ビットレート(絵と音の合計) */ + CriUint32 max_chunk_size; /*EN< Maximum chunk size of incoming stream (USF) file */ + /*JP< 最大USFチャンクサイズ */ + CriUint32 min_buffer_size; /*EN< Minimum buffer size for reading */ + /*JP< 最低限必要な読み込みバッファサイズ。
オーディオとビデオの合計 */ + CriSint32 read_buffer_size; /*EN< Input buffer size for reading data */ + /*JP< リードバッファサイズ */ + /* Video */ + CriUint32 num_video; /*EN< Number of simultaneous video streams */ + /*JP< ビデオデコーダの数。現在は1固定。*/ + CriMvVideoParameters video_prm[CRIMV_MAX_VIDEO_NUM]; /*EN< Video parameters see CriMvVideoParameters struct for details */ + /*JP< ビデオパラメータ */ + /* Audio */ + CriUint32 num_audio; /*EN< Number of simultaneous audio streams */ + /*JP< オーディオデコーダの数。現在は1固定。*/ + CriSint32 track_play_audio; /*EN< Track of audio playback. */ + /*JP< 再生するオーディオチャネル番号。-1指定で再生無し。 */ + CriMvAudioParameters audio_prm[CRIMV_MAX_AUDIO_NUM]; /*EN< Audio parameters see CriMvAudioParameters struct for details */ + /*JP< オーディオパラメータ */ + /* Subtitle */ + CriUint32 num_subtitle; /*EN< Number of subtitles */ + /*JP< 字幕チャネル数 */ + CriSint32 channel_play_subtitle; /*EN< Channel for playing subtitles */ + /*JP< 再生する字幕チャネル番号 */ + CriUint32 max_subtitle_size; /*EN< Maximum size of subtitle data */ + /*JP< 字幕データの最大サイズ*/ + + /* Composite mode */ + CriUint32 num_alpha; /*EN< Number of alpha channels (current spec allows only one) */ + /*JP< アルファデコーダの数。現在は1固定。 */ + CriMvAlphaParameters alpha_prm[CRIMV_MAX_ALPHA_NUM]; /*EN< Alpha parameters see CriMvAlphaParameters struct for details */ + /*JP< アルファパラメータ */ + + CriBool seekinfo_flag; /*EN< Flag of the movie file inclues seek info */ + /*JP< シーク情報フラグ */ + CriUint32 format_ver; /*EN< Format version */ + /*JP< フォーマットバージョン */ +} CriMvStreamingParameters; + + +/*EN + * \brief Input Buffer Information + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetInputBufferInfo(), + * CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::SetBufferingTime() + */ +/*JP + * \brief 入力バッファ情報 + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetInputBufferInfo(), + * CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::SetBufferingTime() + */ +typedef struct { + CriUint32 buffer_size; /*EN< Input buffer size [byte] */ + /*JP< 入力バッファサイズ[byte] */ + CriUint32 data_size; /*EN< Data size in input buffer[byte] */ + /*JP< 入力バッファにあるデータサイズ[byte] */ + CriUint32 reload_threshold; /*EN< Re-load threshold. When data size is less than re-load threshold, next read is requested. */ + /*JP< 再読み込み閾値[byte]。データサイズがこの値以下になると読み込みを行います。 */ +} CriMvInputBufferInfo; + + +// TEMP: for internal use +typedef struct { + CriUint8 *imageptr; + CriUint32 bufsize; // [Byte] + CriUint32 line_pitch; // [Byte] + CriUint32 line_size; // [Byte] + CriUint32 num_lines; +} CriMvImageBufferInfo; + +/*EN + * \brief Video Frame Information + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB(), CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers, + * CriMvEasyPlayer::GetFrameOnTimeAsYUV422(), CriMvEasyPlayer::DiscardNextFrame() + */ +/*JP + * \brief ビデオフレーム情報 + * \ingroup MDL_MV_INFO + * ビデオフレーム情報 + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB(), CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers, + * CriMvEasyPlayer::GetFrameOnTimeAsYUV422(), CriMvEasyPlayer::DiscardNextFrame() + */ +typedef struct { + CriUint8 *imageptr; /*EN< Pointer to image data */ + /*JP< 画像データのポインタ */ + CriSint32 frame_id; /*EN< Frame ID ot the playback */ + /*JP< フレーム識別ID(ループ/連結再生時は通算) */ + CriUint32 width; /*EN< Width of movie frame [pixel] (multiple of 8) */ + /*JP< ムービの横幅[pixel] (8の倍数) */ + CriUint32 height; /*EN< Height of movie frame [pixel] (multiple of 8) */ + /*JP< ムービの高さ[pixel] (8の倍数) */ + CriUint32 pitch; /*EN< Pitch of movie frame [byte]*/ + /*JP< ムービのピッチ[byte] */ + CriUint32 disp_width; /*EN< Width of the image to draw. */ + /*JP< 表示したい映像の横ピクセル数(左端から) */ + CriUint32 disp_height; /*EN< Height of the image to draw. */ + /*JP< 表示したい映像の縦ピクセル数(上端から) */ + CriUint32 framerate; /*EN< Frames per second times 1000 */ + /*JP< フレームレートの1000倍の値 */ + CriUint32 framerate_n; /*EN< Frame rate (in rational as numerator). framerate_n/framerate_d = framerate */ /* UTODO: 変数名 */ + /*JP< フレームレートの分子(有理数形式)。framerate_n/framerate_d = framerate */ + CriUint32 framerate_d; /*EN< Frame rate (in rational as denominator). */ + /*JP< フレームレートの分母(有理数形式)。 */ + CriUint64 time; /*EN< Frame time ('time / tunit' indicates time in seconds) */ + /*JP< 時刻。time / tunit で秒を表す。 */ + CriUint64 tunit; /*EN< Unit of time measurement */ + /*JP< 時刻単位 */ + CriUint32 cnt_concatenated_movie; /*EN< Number of concatenated movie data */ + /*JP< ムービの連結回数 */ + CriSint32 frame_id_per_data; /*EN< Frame ID of the movie data */ + /*JP< ムービデータごとのフレーム番号 */ + + CriBool csc_flag; /*EN< This is temporary variable. Please don't access. */ + /*JP< テスト中の変数です。アクセスしないでください。 */ + + CriMvAlphaType alpha_type; /*EN< Composite mode */ + /*JP< アルファの合成モード*/ + + void *details_ptr[CRIMV_FRAME_DETAILS_NUM]; // for internal use + + CriSint32 num_images; // TEMP: for internal use + CriMvImageBufferInfo image_info[4]; // TEMP: for internal use + + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< 色変換タイプ。 */ + CriUint32 total_frames_per_data; /*EN< Total frames of the movie data*/ + /*JP< ムービデータ単位の総フレーム数 */ + CriUint32 cnt_skipped_frames; /*EN< Number of skipped frames to decode */ + /*JP< デコードスキップされたフレーム数 */ +} CriMvFrameInfo; + +/*EN + * \brief Subtitle Information + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetSubtitleOnTime() + */ +/*JP + * \brief 字幕情報 + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetSubtitleOnTime() + */ +typedef struct { + CriUint8 *dataptr; /*EN< Pointer to subtitle data */ + /*JP< 字幕データのポインタ */ + CriUint32 data_size; /*EN< Size of subtitle data */ + /*JP< 字幕データサイズ */ + CriSint32 channel_no; /*EN< Channel number of subtitle data */ + /*JP< 字幕データのチャネル番号 */ + CriUint64 time_unit; /*EN< Unit of time measurement */ + /*JP< 時刻単位 */ + CriUint64 in_time; /*EN< Display start time */ + /*JP< 表示開始時刻*/ + CriUint64 duration_time; /*EN< Display duration time */ + /*JP< 表示持続時間 */ + CriUint32 cnt_concatenated_movie; /*EN< Number of concatenated movie data */ + /*JP< ムービの連結回数 */ + CriUint64 in_time_per_data; /*EN< Display start time per movie data*/ + /*JP< ムービデータごとに表示開始時刻*/ +} CriMvSubtitleInfo; + +/*EN + * \brief Event Point Info + * \ingroup MDL_MV_INFO + * Event point info is the each timing info was embeded to movie data as cue point info. + * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +/*JP + * \brief イベントポイント情報 + * \ingroup MDL_MV_INFO + * キューポイント機能でムービデータに埋め込まれた個々のタイミング情報です。 + * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +typedef struct { + CriChar8 *cue_name; /*EN< The name string of event point. Char code depends on cue point text. */ + /*JP< イベントポイント名。文字コードはキューポイント情報テキストに従います。 */ + CriUint32 size_name; /*EN< The data size of name string */ + /*JP< イベントポイント名のデータサイズ */ + CriUint64 time; /*EN< Timer counter */ + /*JP< タイマカウント */ + CriUint64 tunit; /*EN< Counter per 1 second. "count / unit" indicates the timer on the second time scale. */ + /*JP< 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 */ + CriSint32 type; /*EN< Event point type */ + /*JP< イベントポイント種別 */ + CriChar8 *param_string; /*EN< The string of user parameters. Char code depends on cue point text. */ + /*JP< ユーザパラメータ文字列。文字コードはキューポイント情報テキストに従います。 */ + CriUint32 size_param; /*EN< The data size of user parameters string */ + /*JP< ユーザパラメータ文字列のデータサイズ */ + CriUint32 cnt_callback; /*EN< The counter of calling cue point callback. */ + /*JP< キューポイントコールバックの呼び出しカウンタ */ +} CriMvEventPoint; + +/*EN + * \brief Cue Point Info + * \ingroup MDL_MV_INFO + * Cue point info includes the number of event points and the list. + * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +/*JP + * \brief キューポイント情報 + * \ingroup MDL_MV_INFO + * キューポイント情報は、イベントポイントの個数と一覧です。
+ * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +typedef struct { + CriUint32 num_eventpoint; /*EN< The number of event points */ + /*JP< イベントポイント個数 */ + CriMvEventPoint *eventtable; /*EN< The list of event points */ + /*JP< イベントポイント一覧 */ +} CriMvCuePointInfo; + +/*EN + * \brief YUV Texture Buffer Parameters + * \ingroup MDL_MV_INFO + * The output buffer parameters for CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers(). + * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() outputs data for pixel shader.
+ * If an application doesn't play alpha movie, CRI Movie library doesn't use alpha buffer parameters.
+ * \sa CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() + */ +/*JP + * \brief YUV個別バッファ情報 + * \ingroup MDL_MV_INFO + * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() の出力バッファ情報です。
+ * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() はPixel Shader 向けのデコード結果を出力します。
+ * アルファムービ再生を行わない場合(不透明の通常再生)は、Alphaテクスチャ関連のパラメータは使用しません。
+ * \sa CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() + */ +typedef struct { + CriUint8 *y_imagebuf; /*EN< Pointer to the buffer of Y texture */ + /*JP< Yテクスチャのバッファポインタ */ + CriUint32 y_bufsize; /*EN< Size of the buffer of Y texture [byte] */ + /*JP< Yテクスチャのバッファサイズ[byte] */ + CriUint32 y_pitch; /*EN< Pitch of the buffer of Y texture [byte] */ + /*JP< Yテクスチャのピッチ[byte] */ + CriUint8 *u_imagebuf; /*EN< Pointer to the buffer of U texture */ + /*JP< Uテクスチャのバッファポインタ */ + CriUint32 u_bufsize; /*EN< Size of the buffer of U texture [byte] */ + /*JP< Uテクスチャのバッファサイズ[byte] */ + CriUint32 u_pitch; /*EN< Pitch of the buffer of U texture [byte] */ + /*JP< Uテクスチャのピッチ[byte] */ + CriUint8 *v_imagebuf; /*EN< Pointer to the buffer of V texture */ + /*JP< Vテクスチャのバッファポインタ */ + CriUint32 v_bufsize; /*EN< Size of the buffer of V texture [byte] */ + /*JP< Vテクスチャのバッファサイズ[byte] */ + CriUint32 v_pitch; /*EN< Pitch of the buffer of V texture [byte] */ + /*JP< Vテクスチャのピッチ[byte] */ + CriUint8 *a_imagebuf; /*EN< Pointer to the buffer of Alpha texture */ + /*JP< Alphaテクスチャのバッファポインタ */ + CriUint32 a_bufsize; /*EN< Size of the buffer of Alpha texture [byte] */ + /*JP< Alphaテクスチャのバッファサイズ[byte] */ + CriUint32 a_pitch; /*EN< Pitch of the buffer of Alpha texture [byte] */ + /*JP< Alphaテクスチャのピッチ[byte] */ +} CriMvYuvBuffers; + + +/*EN + * \brief Playback Information + * \ingroup MDL_MV_INFO + * The output playback information of CriMvEasyPlayer::GetPlaybackInfo(). + * These parameters represents current movie playback information such as decode delay of movie data and + * interval of video frames retrieval. + * \sa CriMvEasyPlayer::GetPlaybackInfo() + */ +/*JP + * \brief 再生情報 + * \ingroup MDL_MV_INFO + * CriMvEasyPlayer::GetPlaybackInfo() の出力再生情報です。
+ * フレームの取得間隔やデコードの遅延などの現在再生しているムービの再生情報を表します。
+ * \sa CriMvEasyPlayer::GetPlaybackInfo() + */ +typedef struct { + CriUint64 cnt_app_loop; /*EN< Loop count of application. Precisely, this is a number of calls of CriMvEasyPlayer::Update(). The count up will start after app is able to acquire the first video frame */ + /*JP< アプリケーションのループカウント。具体的には CriMvEasyPlayer::Update() の呼び出し回数になります。最初のフレームが取得可能になるとカウントが始まります。*/ + CriUint64 cnt_frame_interval[4]; /*EN< Interval of video frames retrieval. These values are count up when CriMvEasyPlayer::IsNextFrameOnTime() returns TRUE. + * + * The interval of video frames retrieval indicates a number of the loop count when your application calls CriMvEasyPlayer::IsNextFrameOnTime() in the main loop. + * In case that the application waits for vertical retrace, 1 interval equals about 16.7 msec. + * The index of array represents the count of intervals as follows: + * + *
Index Interval of video frames retrieval + *
0 Every main loop + *
1 2 main loops + *
2 3 main loops + *
3 4 or more main loops + *
+ * With these values, you can check if the application gets video frames with appropriate intervals. Please use the values as measuring playback smoothness + * + * In order to use these values, the application must meet the following conditions: + * - The main loop should work periodically and stably (Ideally sync with vertical retrace) + * - The application should call CriMvEasyPlayer::IsNextFrameOnTime() once in everly main loop + * + * For example, if the application runs at 59.94fps by waiting for vertical retrace and a framerate of playing movie file is 29.97fps, + * only cnt_frame_interval[1] should be increased. + */ + /*JP< フレームの取得間隔。これらの値は、 CriMvEasyPlayer::IsNextFrameOnTime() がTRUEを返した時にカウントアップされます。
+ * + * フレームの取得間隔とは、アプリケーションがメインループ内でフレーム取得関数を読んだ時のループの回数を意味します。 + * メインループがVSyncと同期している場合は、1 Interval = 約16.7msecということになります。 + * 配列のインデックスは、以下のように取得間隔を表します。
+ * + *
インデックス フレームの取得間隔 + *
0 毎メインループ + *
1 2 メインループ + *
2 3 メインループ + *
3 4 メインループ以上 + *
+ * これらの値を見ることで、アプリが正しい間隔でフレームを取得できたのかどうかをチェックすることができます。ムービが滑らかに再生できているかの目安にしてください。
+ * + * ただし前提として、以下の条件をアプリが満たしている必要があります。 + * - アプリがVSyncなど、一定の周期で安定して動作している + * - メインループ内で毎回 CriMvEasyPlayer::IsNextFrameOnTime() を呼び出す + * + * 上記の条件下において、例えばアプリが59.94fpsで動作している状態で、フレームレートが29.97fpsのムービを再生した場合、cnt_frame_interval[1]のみが増え続けれれば + * 正しい間隔でフレームの取得が出来たことになります。 + */ + CriUint64 cnt_time_early; /*EN< A count of how many times CriMvEasyPlayer::IsNextFrameOnTime() returns FALSE due to the determination if it is the time to provide the next video frame */ + /*JP< CriMvEasyPlayer::IsNextFrameOnTime() が、フレーム表示時刻判定によりFALSEを返した回数。*/ + CriUint64 cnt_decode_delay; /*EN< A count of how many times CriMvEasyPlayer::IsNextFrameOnTime() returns FALSE due to the delay of decoding movie data */ + /*JP< CriMvEasyPlayer::IsNextFrameOnTime()が、ビデオフレームのデコード遅延によりFALSEを返した回数 */ + CriFloat32 time_max_delay; /*EN< Maximum delay time [msec] of the actual time a video frame retrieved against the original time should be retrieved */ + /*JP< ビデオフレームを取得した実際の時刻と、本来表示すべき時刻との最大遅延時間 [msec]。 */ + CriFloat32 time_average_delay; /*EN< Average delay time [msec] of the actual time a video frame retrieved against the original time should be retrieved */ + /*JP< ビデオフレームを取得した実際の時刻と、本来表示すべき時刻との平均遅延時間 [msec]。 */ +} CriMvPlaybackInfo; + +#if defined(XPT_TGT_PS3PPU) +/*EN + * \brief Parameters of SPURS and PPU for decoding + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupSpursParameters_PS3(), CriMv::CalcSpursWorkSize_PS3() + */ +/*JP + * \brief デコードに使うSPURSおよびPPUのパラメータ + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupSpursParameters_PS3(), CriMv::CalcSpursWorkSize_PS3() + */ +typedef struct { + void *spurs_handler; /*EN< SPURS handler */ + /*JP< SPURSハンドル */ + void *spurs_work; /*EN< SPURS work area. The size is spurs_worksize. The alignment is 128 byte. */ + /*JP< SPURS用ワークバッファ。バッファサイズは spurs_worksize で128バイト境界。 */ + CriSint32 spurs_worksize; /*EN< SPURS work size. This size is calculated by CriMv::CalcSpursWorkSize_PS3 function. */ + /*JP< SPURS用ワークサイズ。CriMv::CalcSpursWorkSize_PS3 関数で取得した値。 */ + CriSint32 spurs_max_contention; /*EN< SPURS max contention */ + /*JP< SPURS でムービデコード用に使うSPUの最大数 */ + CriUint8 *spurs_task_priority; /*EN< SPURS task priority x 8 */ + /*JP< SPURS のタスクプライオリティ配列。配列要素は8個。 */ + + CriUint32 ppu_num; /*EN< The number of PPU for decoding (0-2) */ + /*JP< The number of PPU for decoding (0-2) */ + CriSint32 ppu_thread_prio; /*EN< PPU Thread Priority. This priority is used for decoding thread in the case of ppu_num equal 2. */ + /*JP< PPU Thread Priority. この値は ppu_num に2を指定した場合に作成するスレッドに使われる。 */ +} CriMvProcessorParameters_PS3; + +// [NOT SUPPORT on normal library] +// for SPU Thread +typedef struct { + CriUint32 ppu_num; /* The number of PPU for decoding (0-2) */ + CriSint32 ppu_prio; /* PPU Thread Priority */ + CriUint32 spu_num; /* The number of SPU for decoding (0-6) */ + CriSint32 spu_grp_prio; /* SPU Thread Group Priority */ +} CriMvSpuThreadParameters_PS3; + +#endif + +#if defined(XPT_TGT_XBOX360) +/*EN + * \brief Parameters of Xbox360 processors for decoding + * \ingroup MDL_MV_BASIC + * + * \sa CriMvEasyPlayer::SetUsableProcessors_XBOX360() + */ +/*JP + * \brief デコードに使うXbox360プロセッサのパラメータ + * \ingroup MDL_MV_BASIC + * + * \sa CriMvEasyPlayer::SetUsableProcessors_XBOX360() + */ +typedef struct { + CriBool processor0_flag; /*EN< Processor 0 (Core 0, Thread 0) usable flag */ + /*JP< プロセッサ0 (コア0スレッド0) 使用可能フラグ */ + CriBool processor1_flag; /*EN< Processor 1 (Core 0, Thread 1) usable flag */ + /*JP< プロセッサ1 (コア0スレッド1) 使用可能フラグ */ + CriBool processor2_flag; /*EN< Processor 2 (Core 1, Thread 0) usable flag */ + /*JP< プロセッサ2 (コア1スレッド0) 使用可能フラグ */ + CriBool processor3_flag; /*EN< Processor 3 (Core 1, Thread 1) usable flag */ + /*JP< プロセッサ3 (コア1スレッド1) 使用可能フラグ */ + CriBool processor4_flag; /*EN< Processor 4 (Core 2, Thread 0) usable flag */ + /*JP< プロセッサ4 (コア2スレッド0) 使用可能フラグ */ + CriBool processor5_flag; /*EN< Processor 5 (Core 2, Thread 1) usable flag */ + /*JP< プロセッサ5 (コア2スレッド1) 使用可能フラグ */ + CriSint32 thread_priority; /*EN< Priority of decoding threads on the active processors */ + /*JP< 各プロセッサ上でデコード処理を行うスレッドの優先度 */ +} CriMvProcessorParameters_XBOX360; +#endif + +#if defined(XPT_TGT_VITA) +/*EN + * \brief AVC Decoder Parameters + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupAvcDecoderParameters_VITA() + */ +/*JP + * \brief AVCデコーダパラメータ + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupAvcDecoderParameters_VITA() + */ +typedef struct { + CriUint32 horizontal; /*EN< Maximum width for decoding (in pixel) */ + /*JP< 最大デコード画像の横幅 (単位:ピクセル) */ + CriUint32 vertical; /*EN< Maximum height for decoding (in pixel) */ + /*JP< 最大デコード画像の高さ (単位:ピクセル) */ + CriUint32 n_ref_frames; /*EN< Maximum reference frames on decoding (default:3) */ + /*JP< デコード時の最大参照画像の枚数 */ + CriUint32 n_decoders; /*EN< Maximum number of avc decoders (max:1) */ + /*JP< 同時に使用するAVCでコーダの最大数 (1固定) */ + +} CriMvAvcDecoderParameters_VITA; +#endif + +/*--------------------------------------------------------------------------*/ +/* */ +/*--------------------------------------------------------------------------*/ +typedef enum { + CRIMV_PCM_FORMAT_SINT16 = 0, + CRIMV_PCM_FORMAT_FLOAT32 = 1, + + /* Keep enum 4bytes */ + CRIMV_PCM_FORMAT__MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvPcmFormat; +/* + * \brief 16bit wave data information + * \ingroup MDL_MV_INFO + * Information about a 16-bit waveform. + */ +/* 16bit Waveform 情報 */ +typedef struct { + CriUint32 num_channel; /* Number of Channels. monaural = 1, stereo = 2 */ + /* Number of Channels. monaural = 1, stereo = 2 */ + CriUint32 num_samples; /* Number of sample */ + /* サンプル数 */ + CriUint32 sampling_rate; /* Sampling rate */ + /* サンプリング周波数 */ +} CriMvWaveInfo; + +/* オーディオヘッダ */ +typedef struct { + /* ストリーミングパラメータと共通 */ + CriUint32 sampling_rate; + CriUint32 num_channel; + CriUint32 total_samples; + CriUint32 codec_type; + + CriUint32 metadata_count; + CriUint32 metadata_size; + + /* ヘッダ固有 */ + CriUint32 a_input_xsize; +} CriMvPlyAudioHeader; + +/* ビデオヘッダ */ +typedef struct { + /* ヘッダ固有 */ + CriUint32 width; + CriUint32 height; + CriUint32 disp_width; + CriUint32 disp_height; + CriUint32 framerate_n; + CriUint32 framerate_d; + CriUint32 total_frames; + + CriUint32 material_width; /* width of video original source. 0 means no info. */ + CriUint32 material_height; /* height of video original source. 0 means no info. */ + CriUint32 screen_width; /* screen width for Wii */ + + CriUint32 codec_type; + CriUint32 codec_dc_option; /* 11 or 10 */ + + CriUint32 metadata_count; + CriUint32 metadata_size; + + CriUint32 pre_padding; + CriUint32 color_conversion_type; + CriSint32 max_picture_size; + CriSint32 average_bitrate; +} CriMvPlyVideoHeader; + +/* サブタイトルヘッダ */ +typedef struct { + CriBool is_subtitle_data; + CriUint32 num_channel; + CriUint64 time_unit; + CriUint32 max_subtitle_size; +} CriMvPlySubtitleHeader; + +/* キューポイントヘッダ */ +typedef struct { + CriBool is_cuepoint_data; + CriUint32 metadata_count; + CriUint32 metadata_size; + CriUint32 num_eventpoint; + CriUint64 time_unit; +} CriMvPlyCuePointHeader; + +/* アルファヘッダ */ +typedef struct { + /* ヘッダ固有 */ + CriUint32 width; + CriUint32 height; + CriUint32 disp_width; + CriUint32 disp_height; + CriUint32 framerate_n; + CriUint32 framerate_d; + CriUint32 total_frames; + + CriMvAlphaType alpha_type; + CriUint32 codec_type; + + CriUint32 metadata_count; + CriUint32 metadata_size; + + CriUint32 pre_padding; + CriUint32 color_conversion_type; + CriSint32 max_picture_size; + CriSint32 average_bitrate; +} CriMvPlyAlphaHeader; + +/* アルファのみのフレーム情報 */ +typedef struct { + CriUint8 *imageptr; /*EN< Pointer to image data */ + /*JP< 画像データのポインタ */ + CriSint32 frame_id; /*EN< Frame ID */ + /*JP< フレーム識別ID */ + CriUint32 width; /*EN< Width of movie frame [pixel] */ + /*JP< ムービの横幅[pixel] */ + CriUint32 height; /*EN< Height of movie frame [pixel] */ + /*JP< ムービの高さ[pixel] */ + CriUint32 disp_width; /*EN< Width of image [pixel] */ + /*JP< 有効な映像の横幅[pixel] */ + CriUint32 disp_height; /*EN< Height of image [pixel] */ + /*JP< 有効な映像の高さ[pixel] */ + CriUint32 pitch; /*EN< Pitch of movie frame [byte]*/ + /*JP< ムービのピッチ[byte] */ + CriUint64 time; /*EN< Frame time ('time / tunit' indicates time in seconds) */ + /*JP< 時刻。time / tunit で秒を表す。 */ + CriUint64 tunit; /*EN< Unit of time measurement */ + /*JP< 時刻単位 */ + CriSint32 frame_id_per_data; /*EN< Frame ID of the movie data */ + /*JP< ムービデータごとのフレーム番号 */ + CriMvAlphaType alpha_type; /*EN< Composite mode */ + /*JP< アルファの合成モード*/ + void *detail_ptr; /* TEMP: for internal use */ + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< 色変換タイプ。 */ +} CriMvAlphaFrameInfo; + +// 内部管理用。ムービ情報をユーザに渡す時はこれとほぼ同じだろうか。 +/* Information of USF File */ +typedef struct { + CriBool is_usf_file; + CriUint32 max_chunk_size; + CriUint32 min_buffer_size; + CriUint32 bitrate; + CriUint32 format_version; + /* Video */ + CriUint32 num_video; + CriMvPlyVideoHeader videohead[CRIMV_MAX_VIDEO_NUM]; + /* Audio */ + CriUint32 num_audio; + CriMvPlyAudioHeader audiohead[CRIMV_MAX_AUDIO_NUM]; + /* Subtitle */ + CriUint32 num_subtitle; + CriMvPlySubtitleHeader subtitlehead; + /* Alpha */ + CriUint32 num_alpha; + CriMvPlyAlphaHeader alphahead[CRIMV_MAX_ALPHA_NUM]; + /* CuePoint */ + CriUint32 num_cuepoint; + CriMvPlyCuePointHeader cuepointhead; +} CriMvPlyHeaderInfo; + +/* Video Elementary Stream */ +typedef struct { + CriUint32 fcid; + CriSint32 track_no; // チャンクのチャネル番号 + void *vdec; +} CriMvPlyVideo; + +typedef struct { + CriUint32 fcid; + CriSint32 track_no; // チャンクのチャネル番号 + void *dec; +} CriMvPlyAlpha; + +/* ムービヘッダを管理するための構造体 */ +typedef struct { + CriMvPlyHeaderInfo info; + CriBool write_new_head_flag; // CRIDが見つかって次のヘッダを書き込む準備ができたか? + CriUint32 num_remaining_adec_head; // 必要な残りのオーディオヘッダの数 + CriUint32 num_remaining_vdec_head; // 必要な残りのビデオのヘッダの数 + CriUint32 num_remaining_subtitle_head; // 必要な残りの字幕のヘッダの数 + CriUint32 num_remaining_alpha_head; // 必要な残りのアルファのヘッダ数 + CriUint32 num_remaining_cuepoint_head; // 必要な残りのキューポイントのヘッダ数 + /* 2010-08-19: TEMP: CONCAT_KAI: Don't refer this member. */ + CriUint64 accumulated_tcount; +} CriMvHeaderInfoContainer; + +typedef struct { + CriBool is_play_audio; + CriUint32 fcid; + CriUint32 track_no; // チャンクのチャネル番号 + void *adec; // 実際のオーディオコーデック + CriUint32 num_channel; // データのチャネル数 + CriUint32 sampling_rate; // サンプリング周波数 + CriUint32 output_buffer_samples; + CriSj sji; // UNI + CriSj sjo[CRIMV_PCM_BUFFER_MAX]; // RBF + CriUint32 sjo_bufsize[CRIMV_PCM_BUFFER_MAX]; + CriBool term_supply; // データ供給終了通知フラグ + CriBool is_working; // コンテンツチャンク処理中 + +#if defined(ENABLE_DYNAMIC_AUDIO_SWITCH) + CriUint32 next_track_no; // ユーザが指定した切替先のトラック番号 + CriUint32 last_track_switch_time; // 切替元のトラックの最後にチャンクをとった時刻 + CriUint32 last_track_switch_tunit; // 上記時刻の単位 (in Hz?) + CriMvPlyAmngTrackState switch_state; // トラック切替による状態 +#endif +} *CriMvPlyAdec, CriMvPlyAdecObj; + +typedef struct { + + CriMvPlyAdec mvply_adecs[NUM_MAX_ADEC]; + CriSint32 num_adecs; + CriUint32 size_smpl; + CriSj sji; + CriUint32 chunk_num_per_server; + + CriBool (*cbfunc_nofify_found_header)(void *usrobj, CriChunk *ckc, CriUint8 chno); + void *usrobj_nofify_found_header; + +} *CriMvPlyAmng, CriMvPlyAmngObj; + + +/* シークブロック情報 */ +typedef struct { + CriSint32 top_frame_id; +} CriMvSeekBlockInfo; + +/* ストリーマ用情報 */ +typedef struct { + CriUint32 max_chunk_size; + CriUint32 average_bitrate; +} CriMvStreamerInfo; + + +/* ハンドル作成用コンフィグ構造体 */ +typedef struct { + CriUint32 readbuffer_size; +} CriMvHandleConfig; + + +/*JP CRI Movie ハンドル */ +/*EN + * A handle for a single movie. If multiple movies are to be played simultaneously, + * create a CriMvPly handle for each movie. + * + * \sa criMvPly_Create(), criMvPly_Destroy() */ +typedef struct { + /*** Member variable is ***/ + CriBool used; + CriMvPlyStatus stat; + CriBool request_stop; + CriBool restrain_supply; + CriBool term_supply; + void *cs_work; + void *cshn; + /* USF Header */ + + CriMvHeaderInfoContainer headinfo_container[CRIMVPLY_HEAD_CONTAINER_NUM]; + Uint16 cur_dechead_idx; + CriUint32 cnt_dechead; /* ヘッダ解析ごとに更新 */ + CriUint32 cnt_concat; /* GetFrameで更新 */ + + CriMvPlyHeaderInfo headinfo; + CriUint32 num_headck; /* ヘッダ解析処理したチャンク数 */ + CriFloat32 def_buffering_time; + CriUint32 def_max_stream; + CriUint32 def_sound_output_buffer_samples; + CriSint32 def_track_play_audio; /* -1 でオーディオ再生無し */ + + /* デリゲートパラメータ構造体 */ + CriSint32 size_dlgparams; + CriUint8 *ptr_dlgparams; + + CriBool is_prepare_work; + CriMvStreamingParameters stmprm; /* ストリーミングパラメータの記録 */ + /* Demultiplexer */ + CriSint32 inputtype; /* ストリーミングかメモリか?メモリ=ユニSJ再生 */ + CriBool is_usf_data; /* 入力ファイルはUSFファイルか? */ + void *demux; /* USFデマルチプレクサハンドル */ + CriUint32 max_demuxout; /* デマルチプレクサ出力の最大種別数 */ + CriUint32 num_demuxout; /* デマルチプレクサ出力に設定済みの種別数 */ + CriSj headanaly_in_sj; // RBF + CriSj headanaly_out_sj; // UNI + CriSj read_sj; // RBF + CriChunk readck; + + CriSj memplay_sj; // UNI (for memory playback) + CriChunk movie_on_mem; /* メモリ指定のムービデータ記憶用(1個) */ + CriUint32 offset_content; /* メモリ指定先頭データのコンテンツ本体までのサイズ */ + + /* === ハンドル作成時に確保 === */ + CriHeap heap_gen; + /* ヘッダ解析用の読み込み領域 */ + CriUint32 headanaly_bufsize; + /* ハンドル内部メモリは最初に10kbyte確保して使いまわす。具体的にはヘッダ解析用。 */ + CriHeap local_heap; /* ハンドル内部専用Heap */ + CriSint32 local_bufsize; /* ハンドル内部専用Heap用のバッファサイズ */ + CriUint8 *local_bufptr; /* ハンドル内部専用Heap用のバッファポインタ */ + /* === メタワークバッファ (ヘッダ解析時に確保) === */ + CriHeap heap_meta; + /* === ワークバッファ作成時に確保 === */ + CriHeap heap_core; + /* 読み込みバッファ */ + CriUint32 size_readbuf_main; + CriUint32 size_readbuf_ext; + /* Video Decoder */ + CriMvPlyVideo video; + CriUint32 framerate_n; + CriUint32 framerate_d; + /* Audio Decoder */ + CriMvPlyAmng audio_mngr; + CriMvPcmFormat pcmfmt; + CriUint32 size_smpl; + CriHeap heap_audio2; + /* Subtitle */ + CriSj sjo_subtitle; + CriSint32 concat_subtitle_cnt; /* 字幕の連結処理回数 */ + CriSint32 ch_subtitle; /* 字幕の連結処理回数 */ + /* Alpha */ + CriMvPlyAlpha alpha; + + /* 折り返しチャンク対応用(使うかどうかに関係なく変数だけは定義する) */ + CriUint32 bufsize_read_main; /* 入力SJのバッファ本体サイズ */ + CriUint32 bufsize_read_ext; /* 入力SJののりしろサイズ */ + CriUint8 *read_sj_bufptr; /* 入力RBSJの先頭バッファアドレス */ + + /* ストリーミングパラメータに入れるという手段もアリかも? */ + CriSint32 seek_frame_id; /* シークしたいフレームID(GOPの途中の可能性あり) */ + CriSint32 video_gop_top_id; /* シーク後のビデオGOP先頭フレームID : 0以下でシーク無し */ + CriSint32 alpha_gop_top_id; /* シーク後のアルファGOP先頭フレームID : 0以下でシーク無し */ + CriBool seek_video_prep_flag; /* シーク再生のビデオ準備完了フラグ(GOP途中まで進んだか?) */ + CriBool seek_alpha_prep_flag; /* シーク再生のアルファ準備完了フラグ(GOP途中まで進んだか?) */ + CriBool seek_audio_prep_flag; /* シーク再生のオーディオ準備完了フラグ(シーク指定時刻まで捨てたか?) */ + + CriSint32 dechdr_stage; /* DECHDRの進み具合 */ + CriSint32 sji_meta_bufsize; /* メタデータ用入力バッファサイズ */ + CriSj sji_meta; /* メタデータ用入力SJ */ + CriUint32 cnt_meta_ck; /* メタデータ用入力SJ */ + void *video_seektbl_ptr; + CriUint32 video_seektbl_size; + CriSint32 video_gop_num; + void *alpha_seektbl_ptr; + CriUint32 alpha_seektbl_size; + CriSint32 alpha_gop_num; + + void *audio_header_ptr[CRIMV_MAX_AUDIO_NUM]; + CriUint16 audio_header_size[CRIMV_MAX_AUDIO_NUM]; + + void *cuepoint_meta_ptr; + CriUint32 cuepoint_meta_size; + CriMvCuePointInfo cuepoint_info; + + CriMvInputBufferInfo ibuf_info; + CriFloat32 reload_sec_threshold; + + CriSint32 num_frames_for_prep; + + /* For Sofdec2 */ + CriHeap heap_playback; + CriMvMetaDataWorkMallocFunc cbfunc_meta_alloc; + CriMvMetaDataWorkFreeFunc cbfunc_meta_free; + void* usrobj_meta_data; + void* meta_data_work_allocated; /* ユーザアロケータで確保されたメタデータワーク */ + void* event_table_work_allocated; /* ユーザアロケータで確保されたイベントテーブル */ + CriMvStreamerInfo streamer_info; + + /* OUTER_FRAMEPOOL_WORK */ + CriMvFramepoolWorkMallocFunc cbfunc_framepool_alloc; + CriMvFramepoolWorkFreeFunc cbfunc_framepool_free; + void* usrobj_framepool; + void* framepool_work_allocated; /* ユーザアロケータで確保されたフレームプールワーク(解放必要) */ + void* framepool_work_set; /* 直接バッファ指定されたフレームプールワーク(解放不要) */ + + /* For Debug */ + volatile CriUint8 end_sequence_info; + CriUint64Adr header_ptr; + CriSint64 header_size; + CriUint64Adr body_ptr; + CriSint64 body_size; + + CriBool sync_flag; + + CriBool error_flag; + +#if defined(XPT_TGT_IOS) + CriChar8 vavfios_filepath[CRIMVPLY_VAVFIOS_MAX_FILEPATH]; +#endif + + /* For Tools */ + void *extended_mvinfo_config; + + /* ハンドル作成コンフィグ関連 */ + CriBool use_hn_config_flag; /* ハンドル作成コンフィグ指定があったかどうか */ + CriMvHandleConfig hn_config; + +} *CriMvPly, CriMvPlyObj; + +/*************************************************************************** + * Function Declaration + ***************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ライブラリ初期化 */ +/* + * \brief ライブラリの初期化 + * \param なし + * \return なし + * \par 説明: + * ライブラリの初期化を行います。
+ * 複数回連続で初期化した場合は、最初の1回のみ初期化処理を実行します。 + */ +/* + * \ingroup MODULE_INIT + * \brief Initialize library + * + * This function initializes the CRI Movie library, including internal audio, + * streaming and video subsystems. This function must be + * called before any other function in this library will work properly. + * This function initializes only the first time it is called; if it is + * called again, it simply increments an internal counter and returns; it + * does not re-initialize, nor does it create an error condition. + * + * Therefore, it is safe to call criMvPly_Initialize() and criMvPly_Finalize() + * at the beginning and end, respectively, within each of the independent + * modules in your program. If you match these functions call for call, + * only the first criMvPly_Initialize() function and the last criMvPly_Finalize() + * functions should have any effect. + * + * \sa criMvPly_Finalize() + */ +void CRIAPI criMvPly_Initialize(void); + +/* ライブラリ終了 */ +/* + * \brief ライブラリ終了 + * \param なし + * \return なし + * \par 説明: + * ライブラリの終了処理を行います。
+ * 複数回初期化をしていた場合は、同じ回数だけ終了処理を実行してください。 + */ +/* + * \ingroup MODULE_INIT + * \brief Finalize library + * + * This function deallocates any resources in use by the library. + * It should be called the same number of times that the criMvPly_Initialize() + * function is called. If the criMvPly_Initialize() function is called n + * times, on the nth time the criMvPly_Finalize() function is called, + * criMvPly_Finalize() releases any resources allocated by CRI Movie. + * + * Therefore, it is safe to call criMvPly_Initialize() and criMvPly_Finalize() + * at the beginning and end, respectively, within each of the independent + * modules in your program. If you match these functions call for call, + * only the first criMvPly_Initialize() function and the last criMvPly_Finalize() + * functions should have any effect. + * + * \sa criMvPly_Initialize() + */ +void CRIAPI criMvPly_Finalize(void); + +/* ハンドル作成 */ +/* + * \brief ハンドル作成 + * \param heap : メモリ確保に使用するHeapハンドル + * \return CriMvPlyハンドル + * \par 説明: + * CRI Movie ハンドルを作成します。
+ * 必要なハンドル管理領域はHeapハンドルを使って自動的に確保します。
+ * 作成直後のハンドル状態はSTOP状態です。 + */ +/* + * \ingroup MODULE_INIT + * \brief Create a handle + * \param heap A valid CriHeap handle + * \return A valid CriMvPly handle, or NULL if the handle cannot be allocated + * + * This function creates a CriMvPly handle in the CRIMVPLY_STATUS_STOP state. + * Memory for the handle is allocated from the CriHeap structure that you provide. + * Any memory allocation failure during this function results in a text error message to output, and the program hangs. + * Make sure to initialize and create your heap with criHeap_Initialize() and + * criHeap_Create() before calling this function. + * + * \sa CriMvPly, CriMvPlyStatus, criHeap_Initialize(), criHeap_Create() + */ +CriMvPly CRIAPI criMvPly_Create(CriHeap heap); + +/* コンフィグ指定のハンドル作成 */ +/* config がNULL指定の場合はコンフィグ指定無しと同様 */ +CriMvPly CRIAPI criMvPly_CreateWithConfig(CriHeap heap, CriMvHandleConfig *config); + +/* ハンドル破棄 */ +/* + * \brief ハンドル破棄 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * CRI Movie ハンドルの破棄を行います。
+ * ハンドル作成時に引数で指定したHeapハンドルを使って、ハンドル管理領域を解放します。
+ * ワークバッファを確保したままの場合は、ワークバッファ確保時に指定したHeapハンドルを使ってワークバッファも解放します。
+ * ハンドルの破棄は、ハンドル状態がSTOPかPLAYENDの時にしか実行できません。 + */ +/* + * \ingroup MODULE_INIT + * \brief Destroy a handle + * \param mvply A valid CriMvPly handle to be destroyed + * + * This function destroys the CriMvPly handle previously created + * with criMvPly_Create(). + * + * You can only destroy the handle if it is in either the CRIMVPLY_STATUS_STOP or the + * the CRIMVPLY_STATUS_PLAYEND states. Attempting to destroy the handle in + * any other state will produce an error message. You can check the status of + * the handle at any time with criMvPly_GetStatus(). + * + * Any work buffers allocated via criMvPly_AllocateWorkBuffer(), if they are + * still associated with the handle, are freed when criMvPly_Destroy() is called. + * + * \sa CriMvPly, CriMvPlyStatus, criMvPly_GetStatus(), criMvPly_AllocateWorkBuffer() + */ +void CRIAPI criMvPly_Destroy(CriMvPly mvply); + +/* ストリーミングパラメータの取得 */ +/* + * \brief ストリーミングパラメータの取得 + * \param mvply : CRI Movie ハンドル + * \param stmprm : ストリーミングパラメータ + * \return なし + * \par 説明: + * ヘッダ解析の結果をもとに、ムービ再生に必要なストリーミングパラメータを取得します。
+ * ハンドル状態がWAIT_PREPになると取得できるようになります。
+ * このパラメータをもとにcriMvPly_AllocateWorkBuffer関数を呼び出すことができます。
+ * 必要ならばこのパラメータの値を変更して、例えば音ありムービで音を再生しない、といったことも可能です。
+ */ +/* + * \ingroup MODULE_BUFFER + * \brief Get streaming parameters + * \param mvply A valid CriMvPly handle + * \param stmprm An empty CriMvStreamingParameters structure to be filled with data + * + * This function permits you to get detailed information about the stream and + * dynamically allocate resources just before the video and audio sequence + * begins playback. + * + * This function does nothing if the current state of the CriMvPly handle is + * CRIMVPLY_STATUS_DECHDR or CRIMVPLY_STATUS_STOP. The only useful state in + * which to call criMvPly_GetStreamingParameters() is the CRIMVPLY_WAIT_PREP + * status. When the CriMvPly handle is in the CRIMVPLY_WAIT_PREP status, + * calling this function will cause the CriMvStreamingParameters field to be + * filled with data. + * + * Some of the CriMvStreamingParameters, such as buffering time and the + * maximum number of files to read, are copied from the CriMvPly structure. + * However, maximum bitrate, video size, audio stream rate and channel + * info are calculated from the incoming stream. + * + * After calling criMvPly_GetStreamingParameters(), you can programmatically + * override any of the fields in the CriMvStreamingParameters struct yourself + * before calling criMvPly_AllocateWorkBuffer() with it. For example, you might + * need to read a stream containing both audio and video, but only output the + * video from the stream. In this case you could allocate trivial audio buffers + * for output by modifying the CriMvStreamingParameters struct accordingly after + * calling this function. + * + * \sa criMvPly_AllocateWorkBuffer(), CriMvPly, CriMvStreamingParameters + */ + void CRIAPI criMvPly_GetStreamingParameters(CriMvPly mvply, CriMvStreamingParameters *stmprm); + +/* ワークバッファの確保 */ +/* + * \brief ワークバッファの確保 + * \param mvply : CRI Movie ハンドル + * \param heap : + * \param stmprm : ストリーミングパラメータ + * \return なし + * \par 説明: + * 引数のHeapハンドルを使って、読み込みバッファやビデオ/オーディオのワークバッファを確保します。
+ * この関数を呼び出し可能なのは、STOP状態かWAIT_PREP状態の時のみです。
+ * 同じハンドルに対して2度呼び出すと、1度目のワークバッファを全て解放してから、改めてワークバッファを確保します。
+ * criMvPly_Start関数よりも先にワークバッファを確保しておくこともできます。 + */ +/* + * \ingroup MODULE_BUFFER + * \brief Allocate internal streaming work buffers + * \param mvply A CriMvPly handle + * \param heap A CriHeap handle + * \param stmprm An initialized CriMvStreamingParameters structure + * + * This function allocates internal streaming buffers for the CriMvPly movie + * player from the CriHeap. The amount of memory required is based + * on the maximum bitrate of the stream, the requested buffering time, the + * maximum chunk size, and the height and width of the incoming video frame. + * However, a small amount of memory is allocated for the + * video and audio decoders from the CriHeap as well. + * + * The CriHeap handle passed as a parameter to this function need not + * be the same CriHeap handle you passed to the criMvPly_Create() function. + * You may prefer to use either one or two heaps. + * + * This function can be called only if the CriMvPly handle is in the + * CRIMVPLY_STATUS_STOP or the CRIMVPLY_STATUS_WAIT_PREP status. Calling + * this function any other time will produce an error message. + * + * If this function is called twice without calling criMvPly_FreeWorkBuffer(), + * it releases the previously allocated buffers before allocating them again. + * + * This function must be called sometime before criMvPly_Start(). + * + * \if ps2 + * \par PS2 only: + * The PS2 implementation of this function additionally allocates buffers for + * internal DMA tags. If these allocations fail due to lack of memory, the + * library will hang. + * \endif + * + * \sa CriMvPly, CriHeap, CriMvPlyStatus, CriMvStreamingParameters, criMvPly_FreeWorkBuffer(), + * criMvPly_Start() + */ +CriBool CRIAPI criMvPly_AllocateWorkBuffer(CriMvPly mvply, CriHeap heap, CriMvStreamingParameters *stmprm); + +/* ワークバッファの解放 */ +/* + * \brief ワークバッファの解放 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * criMvPly_AllocateWorkBuffer関数で確保したワークバッファを全て解放します。
+ * この関数を呼び出し可能なのは、STOP/WAIT_PREP/PLAYEND状態の時のみです。
+ * CRI Movie Ver.0.60 では未実装です。 + */ +/* + * \ingroup MODULE_BUFFER + * \brief Release streaming work buffer + * \param mvply A valid CriMvPly handle + * + * This function releases streaming work buffers allocated from the CriHeap + * previously associated with criMvPly_AllocateWorkBuffer(). + * This function should only be called at CRIMVPLY_STATUS_STOP, + * CRIMVPLY_STATUS_WAIT_PREP or CRIMVPLY_STATUS_PLAYEND states. However, this + * function does not verify the current stream status before releasing + * all the buffers; it merely deallocates them. Expect interesting crashes + * if you call this function while playing a movie. + * + * You can verify the current CriMvPly handle status with criMvPly_GetStatus() if + * necessary. + * + */ +void CRIAPI criMvPly_FreeWorkBuffer(CriMvPly mvply); + +/* 再生するオーディオチャネルの設定 */ +/* + * \brief 再生するオーディオチャネルの設定 + * \param mvply : CRI Movie ハンドル + * \param ch : オーディオチャネル番号 + * \return なし + * \par 説明: + * CriMvStreamingParameters構造体のメンバ track_play_audioのデフォルト値を設定します。
+ * criMvPly_GetStreamingParameters関数でCriMvStreamingParameters構造体を取得したときにこの値が格納されます。
+ * 何も設定していない場合、buffering_timeには0が入います。 + * -1を指定するとオーディオを再生しない設定になります。 + */ +void CRIAPI criMvPly_SetAudioTrack(CriMvPly mvply, CriSint32 track); + +/* バッファリング時間(単位[sec])の設定 */ +/* + * \brief バッファリング時間(単位[sec])の設定 + * \param mvply : CRI Movie ハンドル + * \param time : バッファリング時間 + * \return なし + * \par 説明: + * CriMvStreamingParameters構造体のメンバbuffering_timeのデフォルト値を設定します。
+ * criMvPly_GetStreamingParameters関数で CriMvStreamingParameters構造体を取得したときにこの値が格納されます。
+ * 何も設定していない場合、buffering_timeには1.0秒が入っています。 + */ +/* + * \ingroup MODULE_BUFFER + * \brief Set default buffering time (unit[sec]) + * \param mvply A valid CriMvPly handle + * \param time Buffering time in seconds + * + * This function tells the CriMvPly handle how much time of the stream to buffer in + * memory. Buffering is necessary to cover seeks, error retries, latency and + * other various hiccups in most data sources. + * + * This value is stored in the buffering_time field of the CriMvStreamingParameters + * struct. It is set to a default of 1.0 seconds when the CriMvPly handle is created. + * This is typically safe for most DVD type file systems. + * + * \sa CriMvPly, CriMvStreamingParameters + */ +//void CRIAPI criMvPly_SetBufferingTime(CriMvPly mvply, CriFloat32 time); + +/* 同時読み込みファイル数の設定 */ +/* + * \brief 同時読み込みファイル数の設定 + * \param mvply : CRI Movie ハンドル + * \param max_stm : 同時読み込みファイル数 + * \return なし + * \par 説明: + * CriMvStreamingParameters構造体のメンバmax_simultaneous_read_filesのデフォルト値を設定します。
+ * criMvPly_GetStreamingParameters関数で CriMvStreamingParameters構造体を取得したときにこの値が格納されます。
+ * 何も設定していない場合、max_simultaneous_read_filesには1が入っています。 + */ +/* + * \ingroup MODULE_BUFFER + * \brief Set maximum number of simultaneous streams + * \param mvply A valid CriMvPly handle + * \param max_stm The maximum number of simultaneous streams + * + * This function sets the default value of the "max_simultaneous_read_files" field of + * the CriMvStreamingParameters struct. Currently, setting this value has no effect. + */ +//void CRIAPI criMvPly_SetMaxSimultaneousStreams(CriMvPly mvply, CriUint32 max_stm); + +/* サウンド出力バッファサンプル数の設定 */ +/* + * \brief GetWave16で要求する最大サンプル数の設定 + * \param mvply : CRI Movie ハンドル + * \param max_smpl : 最大サンプル数 + * \return なし + * \par 説明: + * CriMvAudioParameters構造体のメンバoutput_buffer_samplesのデフォルト値を設定します。
+ * criMvPly_GetStreamingParameters関数で CriMvStreamingParameters構造体を取得したときにこの値が格納されます。
+ * 何も設定していない場合、output_buffer_samplesには16*1024が入っています。 + */ +/* + * \ingroup MODULE_AUDIO + * \brief Set default sound output buffer samples + * \param mvply A valid CriMvPly handle + * \param smpls : sound output buffer samples + * + * This function sets the default value of the "output_buffer_samples" field in the + * CriMvAudioParameters struct. The default value is 16384, which is set when + * criMvPly_Create() is called. + * + * This function only has an effect if it is called before the + * criMvPly_AllocateWorkBuffer() function is called, since this is when the audio + * output buffer is allocated. + * + * \sa CriMvAudioParameters, criMvPly_Create(), criMvPly_AllocateWorkBuffer(), + * criMvPly_GetWave16() + */ +//void criMvPly_SetMaxSamplesOfGetWave16(CriMvPly mvply, CriUint32 max_smpl); +void CRIAPI criMvPly_SetSoundOutputBufferSamples(CriMvPly mvply, CriUint32 smpls); + +/* ハンドル状態の取得 */ +/* + * \brief ハンドル状態の取得 + * \param mvply : CRI Movie ハンドル + * \return ハンドル状態 + * \par 説明: + * ハンドル状態を取得します。 + */ +/* + * \ingroup MODULE_STATE + * \brief Get the handle status + * \param mvply A valid CriMvPly handle + * \return One of the CriMvPlyStatus enum values + * + * This function gets the current status of the CRI Movie handle. Check the + * following link for possible return values. + * + * \sa CriMvPlyStatus + */ +CriMvPlyStatus CRIAPI criMvPly_GetStatus(CriMvPly mvply); + +/* WAIT状態から次の状態への遷移通知 */ +/* + * \brief WAIT状態から次の状態への遷移通知 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * ハンドル状態をWAIT_**** 状態から次の状態に遷移させます。状態に応じて次のように使用します。
+ * ・WAIT_PREP 状態 : criMvPly_AllocateWorkBuffer関数でワークを確保しおわったら呼び出してください。
+ * ・WAIT_PLAYING 状態 : ビデオフレーム、オーディオデータを取得して表示・出力の準備ができたら、 + * 出力を開始して、本関数を呼び出してください。
+ * ・WAIT_PLAYEND 状態 : 最後のビデオフレームの表示、最後のオーディオデータの出力が終了したら呼び出してください。
+ * ・WAIT_STOP 状態 : ビデオやオーディオの出力が停止してもいい状態になったら、呼び出してください。
+ * 本関数を呼び出すと各状態は即座に次の状態に遷移します。
+ * 本関数を WAIT_**** 以外の状態で呼び出しても、状態は何も変わりません。 + */ +/* + * \ingroup MODULE_STATE + * \brief Notify transition from WAIT status + * \param mvply A valid CriMvPly handle + * + * This function notifies the CriMvPly handle that your application is ready to + * go from the current WAIT state to the next state. There are exactly four states + * in which it is appropriate to call this function: + * + * - CRIMVPLY_STATUS_WAIT_PREP After your application has allocated buffers with + * criMvPly_AllocateWorkBuffer() + * - CRIMVPLY_STATUS_WAIT_PLAYING After your application has prerolled stream data (if + * necessary) + * - CRIMVPLY_STATUS_WAIT_PLAYEND After your application has displayed the last frames of audio and + * video from the stream + * - CRIMVPLY_STATUS_WAIT_STOP After your application suspends playback from the stream + * + * You can check the current status of the CriMvPly handle by calling the criMvPly_GetStatus() + * function. This function has no effect if called in states other than those listed above. + * + * \sa CriMvPly, CriMvPlyStatus + */ +void CRIAPI criMvPly_IncrementState(CriMvPly mvply); + +/* 状態の更新 */ +/* + * \brief CriMvPlyモジュールのサーバ関数 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * 主にデマルチプレクサ内部のデータの更新を行います。
+ * 本関数はアプリケーションのメインスレッド側でで毎回呼び出すようにしてください。
+ */ +void CRIAPI criMvPly_Update(CriMvPly mvply); + +/* 再生開始 */ +/* + * \brief 再生開始 + * \param mvply : CRI Movie ハンドル + * \return 再生開始できた場合はCRI_TRUE, 失敗した場合はCRI_FALSE + * \par 説明: + * 再生のための処理を開始します。
+ * 本関数呼出し後、ハンドル状態はDECHDRに遷移します。
+ */ +/* + * \ingroup MODULE_STATE + * \brief Start of playback processing + * \param mvply A valid CriMvPly handle + * + * This function initiates playback processing. This function should be called + * after the CriMvPly handle is created and the data source has been opened, + * but before the work buffers are allocated with criMvPly_AllocateWorkBuffer(). + * This function sets the current status of the CriMvPly handle to + * CRIMVPLY_STATUS_DECHDR, which prepares it to decode the header information + * from the data source. + * + * \sa CriMvPly, CriMvPlyStatus, criMvPly_AllocateWorkBuffer() + */ +CriBool CRIAPI criMvPly_Start(CriMvPly mvply); + +/* 再生停止リクエスト(即時復帰) */ +/* + * \brief 再生停止リクエスト(即時復帰) + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * 再生停止のリクエストを発行して即時復帰します。
+ * 本関数呼出し後、ハンドル状態はSTOP_PROCESSING状態に遷移します。
+ * 停止のための処理が終わると、ハンドル状態がWAIT_STOPに遷移します。
+ * WAIT_STOP状態になったら、criMvPly_IncrementState関数でSTOP状態に遷移させて、 + * アプリケーションの停止処理を行ってください。 + */ +/* + * \ingroup MODULE_STATE + * \brief Non-blocking request to stop playback + * \param mvply A currently playing CriMvPly handle + * + * This function records a request to terminate playback. Termination of + * playback is not synchronous to this function; this function sets the current + * state of the CriMvPly handle to CRIMVPLY_STATUS_STOP_PROCESSING. After + * movie processing is halted, the state of the handle transitions to + * CRIMWPLY_STATUS_WAIT_STOP. + * + * This function is useful for prematurely terminating a movie, e.g. "press + * X to skip this movie". + * + * Video frames will keep being delivered until you detect a CRIMVPLY_STATUS_WAIT_STOP + * state in the CriMvPly handle, and then call criMvPly_IncrementState to transition + * back to the CRIMVPLY_STATUS_STOP state. + * + * \note Pausing is not accomplished through this function. The system clock, including + * whether or not to pause or advance frames, is controlled entirely through user + * code. So the effect of "pausing" a CriMvPly handle can be accomplished by simply + * not updating your system clock as long as your pause is in effect. + * + * \sa CriMvPly, CriMvPlyStatus + */ +void CRIAPI criMvPly_Stop(CriMvPly mvply); + +/* サーバ処理(ハンドル指定) */ +/* + * \brief サーバ処理(ハンドル指定) + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * CRI Movie ハンドルを指定してサーバ処理を実行します。
+ * 各WAIT_**** 状態への状態遷移はサーバ関数内で実行されます。 + */ +/* + * \ingroup MODULE_VIDEO + * \brief Execute heartbeat functions for a handle + * \param mvply A valid CriMvPly handle + * + * This function executes heartbeat functions for the specified CriMvPly handle only, + * including handoff and parsing of input buffers and audio decoding. Additionally, + * it checks for buffer situations in which the CriMvPly handle should transition to + * one of the four WAIT states of CriMvPlyStatus, and it makes these transitions if + * necessary. + * + * However, video decoding does NOT occur in criMvPly_Execute(). + * + * Expect that criMvPly_Execute() will take a relatively low CPU load. Typically, + * this function should be called on every vertical blank. However, it may be called + * more frequently in a CriMvPly wait state, in conjunction with criMvPly_IncrementState(), + * in order to "force" a transition into the next state without waiting for + * another vertical blank. This type of transition is not generically + * necessary. + * + * \sa CriMvPly, CriMvPlyStatus, criMvPly_ExecuteAll() + */ +void CRIAPI criMvPly_Execute(CriMvPly mvply); + +/* ファイル読み込みバッファの空きチャンク取得 */ +/* + * \brief ファイル読み込みバッファの空きチャンク取得 + * \param mvply : CRI Movie ハンドル + * \param ck : チャンク + * \return なし + * \par 説明: + * ファイル読み込みバッファの空き領域を取得します。
+ * 取得した空き領域(チャンクと呼びます)は、データ書き込みを通知するさいに + * そのまま使用しますので、アプリケーションで記憶してください。
+ * 1度に取得できるチャンクは1つのみです。
+ * チャンクが取得できたか否かは、チャンクのサイズで判定できます。
+ * データの書き込みが終わったら、criMvPly_PutInputChunk関数で書き込みサイズを通知してください。
+ */ +/* + * \ingroup MODULE_SUPPLY + * \brief Get a free chunk from file reading buffer + * \param mvply A valid CriMvPly handle + * \param ck A CriChunk structure to be filled with data by this function + * + * This function selects an empty internal buffer for your data source to read its data into. + * An area of this type is referred to as a "chunk." + * After calling this function, the ck->data and ck->size + * fields will provide a valid pointer and size, respectively, that your data + * source should copy its data into. + * If no buffers can internally be allocated, this function will return 0 as the + * ck->size field. If this occurs, your program should choke input until a free + * buffer can be allocated. + * Typical data sources are native file reading, sequential memory access, or + * playback from a network source. + * The ck->size field is dynamically calculated when criMvPly_AllocateWorkBuffer() + * is called; it is calculated based on expected data rate and video resolutions + * embedded in the stream file. + * + * After you receive a valid chunk from criMvPly_GetInputChunk(), + * you can fill the provided chunk up to the ck->size limit. After you + * fill the chunk with valid data, call the criMvPly_PutInputChunk() function + * to queue the data for processing. The functions criMvPly_GetInputChunk() and + * criMvPly_PutInputChunk() should be called in equal pairs; calling these + * functions out of order will produce odd results. No dynamic chunk reordering + * is permitted; serial calls with out-of-order chunks will be + * flagged at run-time as an error. + * + * This function will only return a valid chunk if the CriMvPly handle is in + * one of two playback states: CRIMVPLY_STATUS_PLAY or CRIMVPLY_STATUS_DECHDR. + * You can verify the current playback state with criMvPly_GetStatus(). + * + * \sa criMvPly_GetStatus(), criMvPly_PutInputChunk(), criMvPly_AllocateWorkBuffer(), + * CriChunk, CriMvPlyStatus + */ +void CRIAPI criMvPly_GetInputChunk(CriMvPly mvply, CriChunk *ck); + +/* ファイル読み込みバッファへのデータ書き込み通知 */ +/* + * \brief ファイル読み込みバッファへのデータ書き込み通知 + * \param mvply : CRI Movie ハンドル + * \param ck : + * \param inputsize : + * \return なし + * \par 説明: + * criMvPly_GetInputChunk関数で取得した空き領域(チャンクと呼びます)に + * データを書き込み終わったら、引数inputsizeにデータサイズを入れて本関数を呼び出してください。
+ * その際、チャンクは criMvPly_GetInputChunk関数で取得したものと同じチャンクを必ず指定してください。 + */ +/* + * \ingroup MODULE_SUPPLY + * \brief Put a data chunk into file read buffer + * \param mvply A valid CriMvPly handle + * \param ck A CriChunk structure containing source data + * \param inputsize The number of bytes actually supplied + * + * This function informs the CriMvPly handle that the CriChunk structure + * now contains valid data from the data source. Typically, you would call + * this function after your asynchronous file read reports that the buffer is + * full of data. + * + * The inputsize field should contain the number of bytes actually provided. + * This value can be less than or equal to ck->size. In an end-of-file condition, + * be sure to supply the actual number of bytes remaining in the file, and not + * merely the size of the input buffer, to criMvPly_PutInputChunk(). + * Do not modify the contents of the CriChunk after calling this function; + * instead, call criMvPly_GetInputChunk() to get a new chunk for further input. + * + * This function invalidates the CriChunk provided if the function is called + * while the CriMvPly handle is in the CRIMVPLY_STATUS_STOP, the + * CRIMVPLY_STATUS_WAIT_PREP, or the CRIMVPLY_STATUS_STOP_PROCESSING state. + * You can verify the current playback state with criMvPly_GetStatus(). + * + * After you receive a valid chunk from criMvPly_GetInputChunk(), + * you can fill the provided chunk up to the ck->size limit. After you call + * fill the chunk with valid data, call the criMvPly_PutInputChunk() function + * to queue the data for processing. The function criMvPly_GetInputChunk() and + * criMvPly_PutInputChunk() should be called in equal pairs; calling these + * functions out of order will produce odd results. No dynamic chunk reordering + * is permitted; serial calls with out-of-order chunks will be + * flagged at run-time as an error. + * + * After putting the final chunk of data in the stream, call + * criMvPly_TerminateSupply() to indicate that an end-of-file condition exists. + * + * \sa criMvPly_GetStatus(), criMvPly_GetInputChunk(), criMvPly_AllocateWorkBuffer(), + * criMvPly_TerminateSupply(), CriChunk, CriMvPlyStatus + */ +void CRIAPI criMvPly_PutInputChunk(CriMvPly mvply, CriChunk *ck, CriUint32 inputsize); + +/* ファイル読み込み終了の通知 */ +/* + * \brief ファイル読み込み終了の通知 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * 再生したい全てのデータを読み込んで、 criMvPly_PutInputChunk関数で通知し終わったら、 + * 本関数でファイル読み込み終了の通知を必ず行ってください。
+ * 終了を通知された時点で読み込みバッファに書き込まれた全てのデータをデコードし終わると、 + * ハンドル状態はWAIT_PLAYENDに遷移します。
+ * 本関数を呼び出さない限り、WAIT_PLAYEND状態になることはありません。 + */ +/* + * \ingroup MODULE_SUPPLY + * \brief Notify end of reading data + * \param mvply A valid CriMvPly structure + * + * After you put all the source data into the CriMvPly handle with + * criMvPly_PutInputChunk(), indicate the end of the movie file by calling + * criMvPly_TerminateSupply(). After calling this function, the CriMvPly + * handle's status is changed by the library to CRIMVPLY_STATUS_WAIT_PLAYEND + * and the library completes processing of whatever frames it has internally + * buffered. + * + * If you do not call this function, the CriMvPly handle will never transition + * to the CRIMVPLY_STATUS_WAIT_PLAYEND state, making teardown impossible. + * + * \sa criMvPly_PutInputChunk(), CriMvPly, CriMvPlyStatus + */ +void CRIAPI criMvPly_TerminateSupply(CriMvPly mvply); + +#if 0//defined(XPT_TGT_EE) +/* RGB32フォーマットのビデオフレームの取得 */ +/* + * \if ps2 + * \brief RGB32フォーマットのビデオフレームの取得 + * \param mvply : CRI Movie ハンドル + * \param imagebuf : ビデオフレームバッファ + * \param bufsize : バッファサイズ + * \param frameinfo : フレーム情報 + * \return 取得できた場合はTRUE, できなかった場合はFALSE + * \par 説明: + * 引数で指定したバッファに、PS2のマクロブロック並びRGBA32フォーマットでフレームを取得します。
+ * 引数CriMvFrameInfo構造体には、取得したフレームについての情報が格納されます。
+ * フレームが取得できるのは、ハンドル状態がWAIT_PLAYING/PLAYINGの時のみです。
+ * それ以外の状態で呼び出す、または入力データ不足の場合には、本関数はフレームの取得に失敗し、即座に復帰します。
+ * フレームが取得できなかった場合は、関数値でFALSEが返ります。
+ * 実際のビデオデコード処理も本関数内で動くため、フレーム取得できる場合には、処理の重い関数となります。 + * \endif + */ +/* + * \if ps2 + * \ingroup MODULE_VIDEO + * \brief Get a video frame in PS2 macroblock RGB32 format + * \param mvply A valid CriMvPly handle + * \param imagebuf a pointer to the video buffer in memory to receive the frame + * \param bufsize video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * The format of this buffer is specific to the PS2. This function will only return + * a valid frame if the CriMvPly handle is in the CRIMVPLY_STATUS_WAIT_PLAYING or the + * CRIMVPLY_STATUS_PLAYING state. + * + * This function is an EE-intensive activity, and the amount of time required + * is variable, depending on the complexity and size of the video frame being decoded. + * Therefore the preferred method of calling this function is in a low priority thread, + * separate from your I/O, buffer management, and criMvPly_Execute() routines. + * + * If this function returns true, the preferred display time of the video frame is calculated + * as: + * + * \code + * frameinfo.time / frameinfo.tunit + * \endcode + * + * Humans notice audio stuttering much more readily than a dropped video frame during + * a video decode process. If the frame reported by criMvPly_GetFrameRGBA32_PS2() + * arrives after your system clock says the frame should be displayed, you should + * simply drop the frame without bothering to DMA it to video memory. + * + * Here is an example showing how to drop frames in this case: + * + * \dontinclude crimvt01_simple_playback_ps2.c + * \skip Get video frame + * \until *tutor_update_video_frame_on_display_time* + * + * It is not preferred, but it is possible, to call this function in a single-threaded + * playback model. In this case, it is important to allocate more heap space + * and service the CriMvPly handle with criMvPly_Execute() or criMvPly_ExecuteAll() + * frequently, as well as criMvPly_GetWave16() frequently. This helps to cover + * for the case where other I/O needs to occur when a frame is currently being decoded by + * criMvPly_GetFrameRGBA32_PS2(). + * + * \image html crimvply_getframergba32_ps2.png The DMA reordering step on PS2 + * + * In order to get acceptable performance on the PS2, a macroblock reordering step + * must take place during the DMA transfer from EE RAM to video RAM. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameRGBA32_PS2(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 bufsize, CriMvFrameInfo *frameinfo); + +CriBool CRIAPI criMvPly_DecodeFrameRGBA32_PS2(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +#endif + +#if defined(XPT_TGT_PC) || defined(XPT_TGT_XBOX360) || defined(XPT_TGT_WII) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) +/* + * \if pc + * \ingroup MODULE_VIDEO + * \brief Get a video frame in YUV422 format + * \param mvply A valid CriMvPly handle + * \param imagebuf A pointer to the video buffer in memory to receive the frame + * \param pitch Number of bytes in one row of the video buffer + * \param bufsize Video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * + * This function is a CPU-intensive activity, and the amount of time required + * is variable, depending on the complexity and size of the video frame being decoded. + * Therefore the preferred method of calling this function is in a low priority thread, + * separate from your I/O, buffer management, and criMvPly_Execute() routines. + * + * If this function returns true, the preferred display time of the video frame is calculated + * as: + * + * \code + * frameinfo.time / frameinfo.tunit + * \endcode + * + * It is not preferred, but it is possible, to call this function in a single-threaded + * playback model. In this case, it is important to allocate more heap space + * and service the CriMvPly handle with criMvPly_Execute() or criMvPly_ExecuteAll() + * frequently, as well as criMvPly_GetWave16() frequently. + * + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameYUV422(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +#endif + +/* 16bit WAVEフォーマットのオーディオデータ取得 */ +/* + * \brief 16bit WAVEフォーマットのオーディオデータ取得 + * \param mvply : CRI Movie ハンドル + * \param nch : チャネル数 + * \param waveptr : オーディオデータバッファ + * \param wavesmpl : 要求サンプル数(<バッファサイズ) + * \param waveinfo : 16bit Waveform 情報 + * \return 取得できたサンプル数 + * \par 説明: + * 16bitのWAVEフォーマットでオーディオデータを取得します。引数waveptrには、nch分のバッファポインタを格納した + * 配列を指定してください。
+ * 引数CriMvWaveInfo構造体には、取得したオーディオデータについての情報が格納されます。
+ * 入力データ不足などで要求されたサンプル数のデコードができない場合もあります。
+ * (未実装機能) 本関数の処理が重くなってでも、なるべく要求された多くのオーディオデータを取得するモード。 + */ +/* + * \ingroup MODULE_AUDIO + * \brief Get 16bit wave audio data + * \param mvply A currently playing CriMvPly handle + * \param nch The number of audio channels to get in this call + * \param waveptr An array of audio data buffers to copy audio data into + * \param wavesmpl The number of requested wave data samples (must be less than buffer size) + * \param waveinfo A structure filled by this function with info about this wave + * \return The number of wave data samples actually copied into the buffer + * + * This function copies currently decoding audio data into your output buffer + * for you to send to the audio output. The output format is a sixteen-bit PCM + * format. The data provided is "current", e.g. you should try to minimize latency. + * while delivering the audio data to the output device. + * + * This function will return an empty audio buffer if the input to the CriMvPly + * handle is starving for data, or if criMvPly_Execute() or criMvPly_ExecuteAll() + * has not been called recently. + * + * Note that this function actually copies data. However, the expected bandwidth + * for moving audio data in memory is minimal -- about 176400 bytes per second for + * a stereo stream, which is typically a fraction of 1% of the bandwidth available + * on modern game systems. + * + * For debugging tips on stuttering, see \ref crim_section_stuttering . + */ +CriUint32 CRIAPI criMvPly_GetWave16(CriMvPly mvply, CriUint32 nch, CriSint16 *waveptr[], + CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); +CriUint32 CRIAPI criMvPly_GetWave32(CriMvPly mvply, CriUint32 nch, CriFloat32 *waveptr[], + CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); + + +#if defined(XPT_TGT_EE) +/* スクラッチパッドRAM使用設定 */ +/* スクラッチパッドRAMの使用設定(ハンドル作成前に呼び出すこと) */ +/* + * \brief スクラッチパッドRAM使用設定 + * \param sw : + * \return なし + * \par 説明: + * スクラッチパッドRAMの使用設定を行います。
+ * デフォルトはOFFです。 + */ +/* + * \if ps2 + * \ingroup MODULE_INIT + * \brief Enable or disable PS2 scratch pad (SPRAM) usage + * \param sw : ON to enable scratch pad use, OFF to disable + * + * This function determines whether the video decode step uses the PS2 + * SPRAM memory area for its work. The performance of this library is + * increased by around 30% when using SPRAM; however, this use might + * conflict with graphics engines that depend on exclusive access to SPRAM. + * However, on the PS2, the video decode step occurs synchronously to the + * criMvPly_GetFrameRGBA32_PS2() function, so you can take appropriate external + * locking measures to intelligently synchronize SPRAM utilization. + * The value set by criMvPly_SetUseScratchPadRAM_PS2() is internally checked + * exactly once, during the criMvPly_Create() step; calling this function + * after criMvPly_Create() has no effect. The default setting for this + * function is OFF. + * \endif + */ +void CRIAPI criMvPly_SetUseScratchPadRAM_PS2(CriBool sw); +#endif + + +/* メモリからの再生開始 */ +/* + * \brief メモリからの再生開始 + * \param mvply : CRI Movie ハンドル + * \param memptr : メモリ上のムービデータの先頭アドレス + * \param memsize : メモリ上のムービデータのサイズ + * \return なし + * \par 説明: + * メモリからのムービ再生を開始します。
+ * 本関数の呼び出し前に、あらかじめムービデータの全てをメモリ上に読み込んでおいてください。 + */ +/* + * \ingroup MODULE_STATE + * \brief Start playback from movie file on memory + * \param mvply A currently playing CriMvPly handle + * \param memptr A address of movie file + * \param memsize The size of movie file + * + * Start playback from memory.
+ * Please read movie file to memory before playback. + */ +void CRIAPI criMvPly_StartMemory(CriMvPly mvply, CriUint8* memptr, CriUint32 memsize); + + +/* + * YUV個別バッファへのフレーム取得 + */ +/* + * \if xbox360 + * \ingroup MODULE_VIDEO + * \brief Get a video frame to Y,U,V independently texture buffers + * \param mvply A valid CriMvPly handle + * \param yuvbuffers Information about Y,U,V independently texture buffers + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the Y,U,V texture buffers. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameYUVBuffers(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, CriMvFrameInfo *frameinfo); + + +/* + * ビデオのデコード + */ +/* + * \ingroup MODULE_VIDEO + * \param mvply The movie player handle + * \return returns the number of decoded frames + * + */ +CriUint32 CRIAPI criMvPly_DecodeVideo(CriMvPly mvply); + +/* + * ヘッダのデコード + */ +/* + * + * \ingroup MODULE_VIDEO + * \param mvply The movie player handle + * + */ +void CRIAPI criMvPly_DecodeHeader(CriMvPly mvply); + +/* + * デコードスキップ指示 + * \par 説明: + * この関数を実行した回数だけ、その後のデコード時に自動的に1枚Bピクチャをスキップする。
+ * スキップ指示を出した次のフレームからは、実際のスキップが実行されていなくても + * 表示時刻はスキップしたものとして補正される。 + */ +/* + * \ingroup MODULE_VIDEO + * \param mvply The movie player handle + * \return returns the number of decoded frames + * + * After calling SkipFrame function, Decoding function skip B-picture. + * To avoid that application judge continuous wrong skip, After calling + * SkipFrame function, next frame time will be adjusted. + */ +void CRIAPI criMvPly_SkipFrame(CriMvPly mvply); + + +#if 0 +/* + * YUVA8フォーマットのフレーム取得 + */ +/* + * \if ps3 + * \ingroup MODULE_VIDEO + * \brief Get a video frame in YUVA8 format. + * \param mvply A valid CriMvPly handle + * \param imagebuf A pointer to the video buffer in memory to receive the frame + * \param pitch Number of bytes in one row of the video buffer + * \param bufsize Video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameYUVA8_PS3(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +#endif + +/* + * ARGB8888フォーマットでフレーム取得 + */ +/* + * \if ps3 + * \ingroup MODULE_VIDEO + * \brief Get a video frame in ARGB8888 format. + * \param mvply A valid CriMvPly handle + * \param imagebuf A pointer to the video buffer in memory to receive the frame + * \param pitch Number of bytes in one row of the video buffer + * \param bufsize Video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameARGB8888(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +void CRIAPI criMvPly_InitializeFrameARGB8888(void); + + +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) +/* + * RGB565フォーマットでフレーム取得 + */ +/* + * \ingroup MODULE_VIDEO + * \brief Get a video frame in RGB565 format + */ +CriBool CRIAPI criMvPly_GetFrameRGB565(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +void CRIAPI criMvPly_InitializeFrameRGB565(void); +#endif + +/* + * 次のフレームの情報だけ取得する + */ +/* + * \ingroup MODULE_VIDEO + * \brief Get a information of next video frame (without actual video frame). + */ +CriUint8* CRIAPI criMvPly_GetNextFrameInfo(CriMvPly mvply, CriMvFrameInfo *frameinfo); + +/* + * 次のフレームを捨てる + */ +CriBool CRIAPI criMvPly_DiscardNextFrame(CriMvPly mvply, CriMvFrameInfo *frameinfo); + +/* + * 再生準備完了状態(PREPからWAIT_PLAYING)になるまでに貯金するフレーム数の指定 + * この関数を呼び出さなければ、貯金フレーム数 = フレームプール数 + */ +void CRIAPI criMvPly_SetNumberOfFramesForPrep(CriMvPly mvply, CriSint32 nframes); + +/* + * For Debug use. + */ +void CRIAPI criMvPly_SetSeekPosition(CriMvPly mvply, CriSint32 seek_frame_id, CriSint32 video_gop_top_id); +void CRIAPI criMvPly_SetSeekAlphaPosition(CriMvPly mvply, CriSint32 alpha_gop_top_id); +void CRIAPI criMvPly_CalcSeekPosition(CriMvPly mvply, void *seektbl_ptr, CriUint32 seektbl_size, Sint32 frame_id, Uint64 *offset, Sint32 *gop_top_id); + +/* for specific use */ +/* ボディアドレスの設定 */ +void CRIAPI criMvPly_SetBodyData(CriMvPly mvply, const CriUint64Adr body_ptr, CriSint64 body_size); + +/* 入力SJおよびバッファサイズの取得(バッファサイズ、リロードサイズはNULL指定で省略) */ +CriSj CRIAPI criMvPly_GetInputSj(CriMvPly mvply, CriUint32 *buffer_size, CriUint32 *reload_threshold); + +/* 名前&タイプ指定によるイベントポイント情報の取得 */ +//Bool criMvPly_SearchEventPointByName(CriMvPly mvply, Char8 *cue_name, Sint32 type, CriMvEventPoint *eventinfo); +/* イベントポイント情報からフレームIDへの変換 */ +//Sint32 criMvPly_CalcFrameIdFromCuePoint(CriMvPly mvply, CriMvEventPoint *eventinfo); + +CriBool CRIAPI criMvPly_AttachSubAudio(CriMvPly mvply, CriHeap heap, CriUint32 track); +CriUint32 CRIAPI criMvPly_GetSubAudioWave16(CriMvPly mvply, CriUint32 nch, CriSint16 *waveptr[], CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); +CriUint32 CRIAPI criMvPly_GetSubAudioWave32(CriMvPly mvply, CriUint32 nch, CriFloat32 *waveptr[], CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); +void CRIAPI criMvPly_DetachSubAudio(CriMvPly mvply); + +void CRIAPI criMvPly_GetSubtitle(CriMvPly mvply, CriUint8 *bufptr, CriUint32 bufsize, CriMvSubtitleInfo *info); +void CRIAPI criMvPly_GetNextSubtitleInfo(CriMvPly mvply, CriMvSubtitleInfo *info); + +/* 入力バッファのデータ量を見る[byte] */ +CriUint32 CRIAPI criMvPly_PeekInputBufferData(CriMvPly mvply); +/* メモリ上のムービを入力SJに追加する */ +void CRIAPI criMvPly_AddInputMemory(CriMvPly mvply, CriUint8* memptr, CriUint32 memsize); + + +/* 取得できるオーディオデータのサンプル数を調べる */ +CriUint32 CRIAPI criMvPly_GetDataSizeMainAudio(CriMvPly mvply, CriUint32 nch); +/* 取得できるオーディオデータのサンプル数を調べる */ +CriUint32 CRIAPI criMvPly_GetDataSizeSubAudio(CriMvPly mvply, CriUint32 nch); + +/* メインのオーディオの再生が終了しているかどうかを調べる */ +CriBool CRIAPI criMvPly_IsEndMainAudioPlayback(CriMvPly mvply); +/* サブのオーディオの再生が終了しているかどうかを調べる */ +CriBool CRIAPI criMvPly_IsEndSubAudioPlayback(CriMvPly mvply); + +/* メインオーディオが活動中かどうかを調べる (デコード中かつ出力バッファがある状態) */ +CriBool CRIAPI criMvPly_IsActiveMainAudioPlayback(CriMvPly mvply); + +/* ワーク確保前に設定変更すること */ +void CRIAPI criMvPly_SetPcmFormat(CriMvPly mvply, CriMvPcmFormat pcmfmt); + +#if defined(XPT_TGT_PC) +/* [PC] マルチプロセッサの指定 */ +//void CRIAPI criMvPly_SetProcessorParameters_PC(CriMvPly mvply, Sint32 thread_num, Uint32 *affinity_masks, Sint32 *priorities); +#endif + +#if defined(XPT_TGT_XBOX360) +/* [Xbox360] マルチプロセッサの指定 */ +void CRIAPI criMvPly_SetProcessorParameters_XBOX360(CriMvPly mvply, Sint32 thread_num, CriUint32 processor_mask, CriSint32 *priorities); +#endif + +#if defined(XPT_TGT_PS3PPU) +/* [PS3] SPURSの指定 */ +void CRIAPI criMvPly_SetupSpursParameters_PS3(const CriMvProcessorParameters_PS3 *processor_param); + /* [PS3] SPUスレッドによるマルチプロセッサの指定 */ +void CRIAPI criMvPly_SetupSpuThreadParameters_PS3(const CriMvSpuThreadParameters_PS3 *spu_thread_param); +void CRIAPI criMvPly_SetGraphicEnv(CriMvGraphicEnv env); +CriMvGraphicEnv CRIAPI criMvPly_GetGraphicEnv(void); +#endif + +/* フレームプール情報の取得 */ +void CRIAPI criMvPly_GetFramePoolInfo(CriMvPly mvply, CriSint32 *num_input, CriUint32* num_data, CriUint32* num_ref, CriUint32* num_hold, CriUint32* num_free); + +/* 再生中でも字幕チャネルを切り替える */ +void CRIAPI criMvPly_SetSubtitleChannel(CriMvPly mvply, CriSint32 chno); + +/* ポインタだけ取得してフレームプール内のバッファをロックする */ +CriBool CRIAPI criMvPly_LockFrameBuffer(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, CriMvFrameInfo *frameinfo); +/* ロックしていたフレームプールを解放する */ +CriBool CRIAPI criMvPly_UnlockFrameBuffer(CriMvPly mvply, CriMvFrameInfo *frameinfo); + +/* + * For Sofdec2 + */ +CriMvPly CRIAPI criMvPly_CreateWithWork(void *work, CriSint32 size, CriMvHandleConfig *config); +CriSint32 CRIAPI criMvPly_CalcHandleWorkSize(CriMvHandleConfig *config); +CriSint32 CRIAPI criMvPly_CalcPlaybackWorkSize(CriMvPly mvply, CriMvStreamingParameters *stmprm); +CriBool CRIAPI criMvPly_AllocateWorkBufferWithWork(CriMvPly mvply, void *work ,Sint32 work_size, CriMvStreamingParameters *stmprm); +void CRIAPI criMvPly_SetMetaDataWorkAllocator(CriMvPly mvply, CriMvMetaDataWorkMallocFunc allocfunc, CriMvMetaDataWorkFreeFunc freefunc, void *usrobj, CriMvMetaFlag meta_flag); +CriSint32 criMvPly_CalcSubAudioWorkSize(CriMvPly mvply, const CriMvAudioParameters *aprm); +CriBool criMvPly_CopyFrameYUVBuffers(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, + const CriMvFrameInfo *frameinfo,const CriMvAlphaFrameInfo *alpha_frameinfo); +CriBool criMvPly_CopyFrameARGB8888Buffer(CriMvPly mvply, CriUint8 *dst_buf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *src_bufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf); +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) || defined(XPT_TGT_TRGP6K) +CriBool criMvPly_CopyFrameRGB565Buffer(CriMvPly mvply, CriUint8 *dst_buf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *src_bufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf); +#endif +CriBool criMvPly_LockAlphaFrameBuffer(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, CriMvAlphaFrameInfo *alpha_frameinfo); +CriBool criMvPly_UnlockAlphaFrameBuffer(CriMvPly mvply, CriMvAlphaFrameInfo *alpha_frameinfo); +CriSint32 criMvPly_GetNumPictureData(CriMvPly mvply); +const CriMvPlyHeaderInfo* criMvPly_GetCurrentStreamInfo(CriMvPly mvply); +/* for debug */ +CriBool CRIAPI criMvPly_GetAlphaFrame(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriMvAlphaFrameInfo *alpha_frameinfo); + +/* OUTER_FRAMEPOOL_WORK */ +/* フレームプール用ワーク計算。ハンドルはNULL指定OK。 */ +CriSint32 criMvPly_CalcFramepoolWorkSize(CriMvPly mvply, const CriMvStreamingParameters *stmprm); +/* フレームプール用ワーク設定 */ +void criMvPly_SetFramepoolWork(CriMvPly mvply, void *work, CriSint32 work_size); +/* フレームプール用ワークアロケータ設定 */ +void criMvPly_SetFramepoolWorkAllocator(CriMvPly mvply, CriMvFramepoolWorkMallocFunc allocfunc, CriMvFramepoolWorkFreeFunc freefunc, void *usrobj); + +/* シークブロック情報の取得 */ +/* <入力> + * - seektbl_ptr : UTFアドレス + * - seektbl_size : UTFサイズ + * - num_seekblock : 出力配列の要素数 + * <出力> + * - blockinfo : シークブロック情報配列へのポインタ(num_seekblock分の領域を確保して渡すこと) + */ +void criMvPly_GetSeekBlockInfo(CriMvPly mvply, void *seektbl_ptr, CriUint32 seektbl_size, CriSint32 num_seekblock, CriMvSeekBlockInfo *blockinfo); + +/* フレームレートの強制指定 */ +void criMvPly_SetVideoFramerate(CriMvPly mvply, CriUint32 framerate_n, CriUint32 framerate_d); + +/* 同期有無の設定 */ +void criMvPly_SetSyncFlag(CriMvPly mvply, CriBool sync_flag); + +/* 再生可能かの問い合わせ */ +CriBool criMvPly_IsPlayable(CriMvPly mvply, const CriMvStreamingParameters *stmprm); + + + +#ifdef __cplusplus +} +#endif + +#endif /* CRI_MOVIE_CORE_H_INCLUDED */ diff --git a/3rdParty/cri/PS4/include/cri_movie_ps4.h b/3rdParty/cri/PS4/include/cri_movie_ps4.h new file mode 100644 index 00000000..95e804e6 --- /dev/null +++ b/3rdParty/cri/PS4/include/cri_movie_ps4.h @@ -0,0 +1,94 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2013 CRI Middleware Co., Ltd. + * + * Library : CRI Movie + * Module : Library User's Header + * File : cri_movie_ps4.h + * Date : 2013-11-25 + * + ****************************************************************************/ +/*! + * \file cri_movie_ps4.h + */ +#ifndef CRI_MOVIE_PS4_H_INCLUDED /* Re-definition prevention */ +#define CRI_MOVIE_PS4_H_INCLUDED + +/*************************************************************************** + * Include file + ***************************************************************************/ +#include + +#include +#include + +/*************************************************************************** + * Variable Declaration + ***************************************************************************/ +namespace CriMv { + extern CriError ErrorContainer; +} + +/*************************************************************************** + * Prototype Functions + ***************************************************************************/ +namespace CriMv { + /*EN + * \ingroup MODULE_OPTION + * \brief Set processor parameters for decoding (Library Global) + * + * \param num_threads Number of additional threads for load distribution in decoding (Maximum 5 threads) + * \param affinity_mask Pointer to an array of thread affinity masks for each thread specified with num_threads. + * \param priorities Pointer to an array of thread priority for each thread specified with num_threads. + * \param err Optional error code + * + * This function sets the processor parameters for decoding as default setting of library global. + * Use it when you want to change processors or thread priority for decoding load distribution. + * + * If this function is called, it must be called before library initialization. + * + * On initialization, CRI Movie prepares 5 worker threads for distributed decoding.
+ * + * \a num_threads specifies how many worker threads CRI Movie should use.
+ * \a affinity_mask is an array of affinity masks for the worker threads. This array must have + * \a num_threads many elements. + * \a priorities is an array of thread priority for the worker threads. This array must have + * \a num_threads many elements. + * The format of \a affinity_mask and \a priorities is same as for the value passed to the OS standard API.
+ * + * If this function is not called, 5 distributed decoding threads will run in parallel by default. + * Also, processor assignment of the decoding threads is handled by the operating system, and their + * priority will be 725 (below main thread). + */ + /*JP + * \ingroup MODULE_OPTION + * \brief デコード処理に使う追加プロセッサ設定(ライブラリ全体) + * \param num_threads 負荷分散デコード用に使用する追加スレッドの数 (最大5つ) + * \param affinity_masks スレッドアフィニティマスクの配列へのポインタ。num_threadsで指定したスレッドごとのマスク値。 + * \param priorities 追加スレッドの優先度配列へのポインタ。 + * \param err エラー情報(省略可) + * + * デコード処理を分散して処理するためのプロセッサをライブラリ全体に指定します。 + * デコード処理に行うプロセッサやスレッド優先度を変更したい場合に使用してください。 + * 本関数はライブラリ初期化前に呼び出す必要があります。 + * + * CRI Movieは初期化の際に5つの分散デコード用のワーカースレッドを用意します。 + * num_threads引数で、そのうちのいくつのスレッドを実際に使用するかを指定できます。 + * アプリケーションから明示的にプロセッサ割り当てを行いたい場合、個々のスレッドに対して + * アフィニティマスクとスレッド優先度を設定してください。 + * アフィニティマスクとスレッド優先度の値は、OS標準関数の引数と同じ書式です。 + * + * この関数を呼ばなかった場合、5つのスレッドで並列デコードを行います。 + * デコードスレッドのプロセッサは割り当ては全てOS任せで、優先度は725(メインスレッドより下)になります。 + */ + void SetUsableProcessors_PS4( + CriSint32 num_threads, + const SceKernelCpumask *affinity_masks, + const int *priorities, + CriError &err = CriMv::ErrorContainer); +} + + +#endif /* CRI_MOVIE_PS4_H_INCLUDED */ diff --git a/3rdParty/cri/PS4/include/cri_sj.h b/3rdParty/cri/PS4/include/cri_sj.h new file mode 100644 index 00000000..28b29424 --- /dev/null +++ b/3rdParty/cri/PS4/include/cri_sj.h @@ -0,0 +1,189 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2006-2010 CRI Middleware Co., Ltd. + * + ****************************************************************************/ + +#ifndef _CRI_SJ_H_INCLUDED +#define _CRI_SJ_H_INCLUDED +/**************************************************************************** + * * + * CRI Stream Joint "CriSj" Library * + * * + * 2005-06-21 written by M.Oshimi * + * * + ****************************************************************************/ + +/**************************************************************************** + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" +#include "cri_heap.h" + +/**************************************************************************** + * MACRO CONSTANT * + ****************************************************************************/ + +/* Version number of CriSj */ +#define CRISJ_NAME_STRINGS "CRI Stream Joint" +#define CRISJ_VERSION_STRINGS "1.01.00" + +#define CRISJUNI_MAX_LINE (4) +#define CRICHUNK_MAX_SIZE (0xffffffff) + +/*********************************************************************** + * Process MACRO + ***********************************************************************/ + +/**************************************************************************** + * Data type declaration * + ****************************************************************************/ + +/* ストリームライン */ +typedef enum { + CRISJ_LINE_FREE = (0), + CRISJ_LINE_DATA = (1), + CRISJ_LINE_HOLD = (2), + CRISJ_LINE_EXTRA = (3), + /* enum be 4bytes */ + CRISJ_LINE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriSjLine; + +/* チャンク */ +#ifndef TYPEDEF_CRICHUNK +#define TYPEDEF_CRICHUNK +typedef struct { + CriUint8 *data; /* データ */ + CriUint32 size; /* バイト数 */ +} CriChunk; +#endif + +/* CriSjハンドル */ +/* CriSj handle */ +typedef struct { + struct _crisj_function_table *vtbl; + const CriChar8 *name; +} CriSjObj, *CriSj; + +typedef struct _crisj_function_table { + /* ハンドルの消去 */ + void (*Destroy)(CriSj sj); + /* リセット */ + void (*Reset)(CriSj sj); + /* チャンクの取得 (FIFOの先頭から取得) */ + void (*GetChunk)(CriSj sj, CriSjLine id, CriUint32 nbyte, CriChunk *ck); + /* チャンクを戻す (FIFOの先頭に挿入) */ + void (*UngetChunk)(CriSj sj, CriSjLine id, CriChunk *ck); + /* チャンクを挿入 (FIFOの最後に挿入) */ + void (*PutChunk)(CriSj sj, CriSjLine id, CriChunk *ck); + /* ラインから取得できる総バイト数の取得 */ + CriUint32 (*GetTotalSize)(CriSj sj, CriSjLine id); +} CriSjVirtualFunctionTable; + +typedef enum { + CRISJ_UNIMODE_SEPARATE = (0), + CRISJ_UNIMODE_JOIN = (1), + /* enum be 4bytes */ + CRISJ_UNIMODE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriSjUniversalMode; + + +typedef struct CriSjRbfConfig { + CriBool use_cs; + CriUint32 buffer_size; + CriUint32 extra_size; + CriUint32 alignment; + const CriChar8 *buffer_name; +} CriSjRbfConfig; + +typedef struct CriSjMemConfig { + CriBool use_cs; + CriUint8 *data; + CriUint32 data_size; +} CriSjMemConfig; + +typedef struct CriSjUniConfig { + CriBool use_cs; + CriSjUniversalMode mode; + CriUint32 num_chunks; +} CriSjUniConfig; + +/**************************************************************************** + * Function Declaration * + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* リングバッファ型SJの作成 */ +CriSint32 CRIAPI criSjRbf_CalculateWorkSize(const CriSjRbfConfig* config); +CriSj CRIAPI criSjRbf_Create(const CriSjRbfConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjRbf_CreateByHeap(const CriSjRbfConfig *config, CriHeap heap, CriHeapType heap_type); + +/* 常駐メモリ型SJの作成 */ +CriSint32 CRIAPI criSjMem_CalculateWorkSize(const CriSjMemConfig* config); +CriSj CRIAPI criSjMem_Create(const CriSjMemConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjMem_CreateByHeap(const CriSjMemConfig *config, CriHeap heap, CriHeapType heap_type); + +/* ユニバーサルSJの作成 */ +CriSint32 CRIAPI criSjUni_CalculateWorkSize(const CriSjUniConfig* config); +CriSj CRIAPI criSjUni_Create(const CriSjUniConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjUni_CreateByHeap(const CriSjUniConfig *config, CriHeap heap, CriHeapType heap_type); +/* チェインプール数の取得 */ +CriSint32 CRIAPI criSjUni_GetNumChainPool(CriSj sj); + +void CRIAPI criSj_Destroy(CriSj sj); +void CRIAPI criSj_Reset(CriSj sj); +void CRIAPI criSj_GetChunk(CriSj sj, CriSjLine line, CriUint32 nbyte, CriChunk *ck); +void CRIAPI criSj_UngetChunk(CriSj sj, CriSjLine line, CriChunk *ck); +void CRIAPI criSj_PutChunk(CriSj sj, CriSjLine line, CriChunk *ck); +CriUint32 CRIAPI criSj_GetTotalSize(CriSj sj, CriSjLine line); +void CRIAPI criSj_SplitChunk(CriChunk *ck, CriUint32 nbyte, CriChunk *ck1, CriChunk *ck2); + +/*** +* New APIs +***/ + +CriUint32 CRIAPI criSj_GetInputFreeSize(CriSj sj); +void CRIAPI criSj_GetInputChunk(CriSj sj, CriChunk *ck); +void CRIAPI criSj_PutInputChunk(CriSj sj, CriChunk *ck, CriUint32 input_size); +CriUint32 CRIAPI criSj_GetOutputDataSize(CriSj sj); +void CRIAPI criSj_GetOutputChunk(CriSj sj, CriChunk *ck); +void CRIAPI criSj_PutOutputChunk(CriSj sj, CriChunk *ck, CriUint32 output_size); + +CriUint32 CRIAPI criSj_PutOutputChunk2(CriSj sj, CriChunk *ck1, CriChunk *ck2, CriUint32 output_size); + + +/*** +* Old Interface (for compatibility) +***/ +typedef struct _CriSjConfig { + CriBool use_cs; + CriHeapType heap_type; +} CriSjConfig; + +CriSj CRIAPI criSj_CreateRingBuffer(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align); +CriSj CRIAPI criSj_CreateNamedRingBuffer(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriChar8 *bname); +CriSj CRIAPI criSj_CreateRingBufferWithConfig(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriSjConfig *config); +CriSj CRIAPI criSj_CreateNamedRingBufferWithConfig(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriChar8 *bname, const CriSjConfig *config); +CriSint32 CRIAPI criSjRbf_GetRequiredMemorySizeWithConfig(CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriSjConfig *config); + +CriSj CRIAPI criSj_CreateMemory(CriHeap heap, CriUint8 *data, CriUint32 dtsize, CriUint32 align); +CriSj CRIAPI criSj_CreateMemoryWithConfig(CriHeap heap, CriUint8 *data, CriUint32 dtsize, CriUint32 align, const CriSjConfig *config); +CriSint32 CRIAPI criSjMem_GetRequiredMemorySizeWithConfig(CriUint32 align, const CriSjConfig *config); + +CriSj CRIAPI criSj_CreateUniversal(CriHeap heap, CriSjUniversalMode mode, CriUint32 nchunk); +CriSj CRIAPI criSj_CreateUniversalWithConfig(CriHeap heap, CriSjUniversalMode mode, CriUint32 nchunk, const CriSjConfig *config); +CriSint32 CRIAPI criSjUni_GetRequiredMemorySizeWithConfig(CriSjUniversalMode mode, CriUint32 nchunk, const CriSjConfig *config); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif + +/* end of file */ diff --git a/3rdParty/cri/PS4/include/cri_xpt.h b/3rdParty/cri/PS4/include/cri_xpt.h new file mode 100644 index 00000000..57fafec1 --- /dev/null +++ b/3rdParty/cri/PS4/include/cri_xpt.h @@ -0,0 +1,27 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2012 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header for PS4 + * File : cri_xpt.h + * Date : 2012-10-04 + * Version : 1.00 + * + ****************************************************************************/ +#ifndef CRI_INCL_CRI_XPT_H +#define CRI_INCL_CRI_XPT_H + +#define XPT_TGT_PS4 +#define XPT_CCS_LEND +#define XPT_DISABLE_FSV1API +#define CRI_TARGET_STR "PS4" + + +#include "cri_xpts_ps4.h" +#include "cri_xpt_post.h" + +#endif /* CRI_INCL_CRI_XPT_H */ +/* End Of File */ diff --git a/3rdParty/cri/PS4/include/cri_xpt_post.h b/3rdParty/cri/PS4/include/cri_xpt_post.h new file mode 100644 index 00000000..7cc8341a --- /dev/null +++ b/3rdParty/cri/PS4/include/cri_xpt_post.h @@ -0,0 +1,256 @@ +/***************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 1998-2012 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header / Post-Process + * File : cri_xpt_post.h + * Date : 2012-05-15 + * Version : 2.07 + * + *****************************************************************************/ +#ifndef CRI_INCL_CRI_XPT_POST_H +#define CRI_INCL_CRI_XPT_POST_H + + +/***************************************************************************** + * マクロ定義 + * Macro definition + *****************************************************************************/ + +/* コンパイル時の静的アサート + * C++ BoostのSTATIC_ASSERTと同等の機能をC言語で実装する。 + * 条件が真であることを検証する。偽の場合はコンパイルエラーを起こして、コン + * パイルを停止させる。 + * Static Asart when compiling + * This function is equal to STATIC_ASSERT of C++ Boost, and is imprementated + * by C language. If the condition is false, a compiler error is caused and + * it stop compiling. + */ +#define XPT_STATIC_ASSERT(cond) extern int xpt_static_assert_array[(cond)?1:-1] + + +/***************************************************************************** + * コンパイルオプションの検証 + * Compiler option test + *****************************************************************************/ + +/* enum型の検証 + *  enum型がint型に整合することを検証する。 + *  適切なエラーメッセージを表示したいので、可能ならコンパイルオプションによる + *  チェックを行う。不可能な場合、汎用的な静的アサートによるチェックが働く。 + * Enum type test + * It is verified that the enum type adjusts to the int type. + * To display an appropriate error message, it checks the compiler option + * if possible. General static asart test works if it is impossible. + */ +#if defined(__MWERKS__) /* CodeWarrior */ + //#if !__option(enumsalwaysint) + // #error ERROR cri_xpt_post.h : Compiler option 'Enums Always Int' should be ON. + //#endif +#elif defined(__GNUC__) + //#if Compiler option -fshort-enums is used + // #error ERROR cri_xpt_post.h : Compiler option '-fshort-enums' should not be used. + //#endif +#endif +//typedef enum {XPT_TEST_ENUM_0, XPT_TEST_ENUM_1, XPT_TEST_ENUM_2} XptTestEnum; +//XPT_STATIC_ASSERT(sizeof(XptTestEnum) == sizeof(Uint32)); /* enum should be 4byte. */ + +/***************************************************************************** + * 定数マクロ + * Macros of constant value + *****************************************************************************/ + +/* NULL ポインタ型 */ +#if !defined(CRI_NULL) +#ifdef __cplusplus +#define CRI_NULL (0) +#else +#define CRI_NULL ((void *)0) +#endif +#endif + +/* 論理定数1(偽、真) */ +#if !defined(CRI_FALSE) +#define CRI_FALSE (0) +#endif +#if !defined(CRI_TRUE) +#define CRI_TRUE (1) +#endif + +/* 論理定数2(スイッチ) */ +#if !defined(CRI_OFF) +#define CRI_OFF (0) +#endif +#if !defined(CRI_ON) +#define CRI_ON (1) +#endif + +/* 結果判定の定数(成功、失敗) */ +#if !defined(CRI_OK) +#define CRI_OK (0) /* 成功 */ +#endif +#if !defined(CRI_NG) +#define CRI_NG (-1) /* 失敗 */ +#endif + +/***************************************************************************** + * ポインタまたは64ビットアドレスを格納できる整数型 + * 備考: ポインタ32bitかつROMアドレス空間64bitの環境で、両者を透過的に扱える。 + * The integer type which can hold an pointer or an address up to 64 bits. + * NOTE: In the environment of pointer 32bit and ROM address space 64bit, + * this type can treat both transparently. + *****************************************************************************/ + +#if !defined(_TYPEDEF_CriUint64Adr) +#define _TYPEDEF_CriUint64Adr +typedef CriUint64 CriUint64Adr; /* ポインタまたは64ビットアドレスを格納できる整数型 */ +#endif + +#if !defined(CRI_PTR_TO_UINT64ADR) +#define CRI_PTR_TO_UINT64ADR(ptr) ((CriUint64Adr)(ptr)) /* Convert pointer to CriUint64Adr */ +#endif + +#if !defined(CRI_UINT64ADR_TO_PTR) +#define CRI_UINT64ADR_TO_PTR(uint64adr) ((void *)(CriUintPtr)(uint64adr)) /* Convert CriUint64Adr to pointer */ +#endif + +#if !defined(CRI_XPT_DISABLE_UNPREFIXED_TYPE) + +/***************************************************************************** + * 互換性維持のための定数マクロ + * Macros for compatibility with old version + *****************************************************************************/ + +/* NULL ポインタ型 */ +#if !defined(NULL) +#define NULL (CRI_NULL) +#endif + +/* 論理定数1(偽、真) */ +#if !defined(FALSE) +#define FALSE (CRI_FALSE) +#endif +#if !defined(TRUE) +#define TRUE (CRI_TRUE) +#endif + +/* 論理定数2(スイッチ) */ +#if !defined(OFF) +#define OFF (CRI_OFF) +#endif +#if !defined(ON) +#define ON (CRI_ON) +#endif + +/* 結果判定の定数(成功、失敗) */ +#if !defined(OK) +#define OK (CRI_OK) +#endif +#if !defined(NG) +#define NG (CRI_NG) +#endif + +/***************************************************************************** + * 互換性維持のためのデータ型宣言 + * Types for compatibility with old version + *****************************************************************************/ + +#if !defined(_TYPEDEF_Uint8) +#define _TYPEDEF_Uint8 +typedef CriUint8 Uint8; /* 符号なし1バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Sint8) +#define _TYPEDEF_Sint8 +typedef CriSint8 Sint8; /* 符号つき1バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Uint16) +#define _TYPEDEF_Uint16 +typedef CriUint16 Uint16; /* 符号なし2バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Sint16) +#define _TYPEDEF_Sint16 +typedef CriSint16 Sint16; /* 符号つき2バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Uint32) +#define _TYPEDEF_Uint32 +typedef CriUint32 Uint32; /* 符号なし4バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Sint32) +#define _TYPEDEF_Sint32 +typedef CriSint32 Sint32; /* 符号つき4バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Uint64) +#define _TYPEDEF_Uint64 +typedef CriUint64 Uint64; /* 符号なし8バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Sint64) +#define _TYPEDEF_Sint64 +typedef CriSint64 Sint64; /* 符号つき8バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Uint128) +#define _TYPEDEF_Uint128 +typedef CriUint128 Uint128; /* 符号なし16バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Sint128) +#define _TYPEDEF_Sint128 +typedef CriSint128 Sint128; /* 符号つき16バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Float16) +#define _TYPEDEF_Float16 +typedef CriFloat16 Float16; /* 2バイト実数 */ +#endif + +#if !defined(_TYPEDEF_Float32) +#define _TYPEDEF_Float32 +typedef CriFloat32 Float32; /* 4バイト実数 */ +#endif + +#if !defined(_TYPEDEF_Float64) +#define _TYPEDEF_Float64 +typedef CriFloat64 Float64; /* 8バイト実数 */ +#endif + +#if !defined(_TYPEDEF_Fixed32) +#define _TYPEDEF_Fixed32 +typedef CriFixed32 Fixed32; /* 固定小数点32ビット */ +#endif + +/* X11 API(xtrapproto.h)との競合回避用 */ +#if !defined(_TYPEDEF_Bool) && !defined(Bool) +#define _TYPEDEF_Bool +typedef CriBool Bool; /* 論理型(論理定数を値にとる) */ +#endif + +#if !defined(_TYPEDEF_Char8) +#define _TYPEDEF_Char8 +typedef CriChar8 Char8; /* 文字型 */ +#endif + +#if !defined(_TYPEDEF_SintPtr) +#define _TYPEDEF_SintPtr +typedef CriSintPtr SintPtr; +#endif + +#if !defined(_TYPEDEF_UintPtr) +#define _TYPEDEF_UintPtr +typedef CriUintPtr UintPtr; +#endif + +#endif /* CRI_XPT_DISABLE_UNPREFIXED_TYPE */ + +#endif /* CRI_INCL_CRI_XPT_POST_H */ + +/* end of file */ diff --git a/3rdParty/cri/PS4/include/cri_xpts_ps4.h b/3rdParty/cri/PS4/include/cri_xpts_ps4.h new file mode 100644 index 00000000..919ae0f6 --- /dev/null +++ b/3rdParty/cri/PS4/include/cri_xpts_ps4.h @@ -0,0 +1,133 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 1998-2012 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header for PS4 + * File : cri_xpts_ps4.h + * Date : 2012-10-04 + * Version : 2.01 + * + ****************************************************************************/ + +#if !defined(CRI_INCL_CRI_XPTS_PS4_H) +#define CRI_INCL_CRI_XPTS_PS4_H + +/***************************************************************************** + * 基本データ型宣言 + *****************************************************************************/ + +#if !defined(_TYPEDEF_CriUint8) +#define _TYPEDEF_CriUint8 +typedef unsigned char CriUint8; /* 符号なし1バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriSint8) +#define _TYPEDEF_CriSint8 +typedef signed char CriSint8; /* 符号つき1バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriUint16) +#define _TYPEDEF_CriUint16 +typedef unsigned short CriUint16; /* 符号なし2バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriSint16) +#define _TYPEDEF_CriSint16 +typedef signed short CriSint16; /* 符号つき2バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriUint32) +#define _TYPEDEF_CriUint32 +typedef unsigned int CriUint32; /* 符号なし4バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriSint32) +#define _TYPEDEF_CriSint32 +typedef signed int CriSint32; /* 符号つき4バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriUint64) +#define _TYPEDEF_CriUint64 +typedef unsigned long CriUint64; /* 符号なし8バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriSint64) +#define _TYPEDEF_CriSint64 +typedef signed long CriSint64; /* 符号つき8バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriUint128) +#define _TYPEDEF_CriUint128 +//typedef unsigned __int128 CriUint128; /* 符号なし16バイト整数 */ +typedef struct { /* 符号なし16バイト整数 */ + CriUint64 h; /* 上位64ビット */ + CriUint64 l; /* 下位64ビット */ +} CriUint128; +#endif + +#if !defined(_TYPEDEF_CriSint128) +#define _TYPEDEF_CriSint128 +//typedef signed __int128 CriSint128; /* 符号つき16バイト整数 */ +typedef struct { /* 符号つき16バイト整数 */ + CriSint64 h; /* 上位64ビット */ + CriUint64 l; /* 下位64ビット */ +} CriSint128; +#endif + +#if !defined(_TYPEDEF_CriFloat16) +#define _TYPEDEF_CriFloat16 +typedef signed short CriFloat16; /* 2バイト実数 */ +#endif + +#if !defined(_TYPEDEF_CriFloat32) +#define _TYPEDEF_CriFloat32 +typedef float CriFloat32; /* 4バイト実数 */ +#endif + +#if !defined(_TYPEDEF_CriFloat64) +#define _TYPEDEF_CriFloat64 +typedef double CriFloat64; /* 8バイト実数 */ +#endif + +#if !defined(_TYPEDEF_CriFixed32) +#define _TYPEDEF_CriFixed32 +typedef signed int CriFixed32; /* 固定小数点32ビット */ +#endif + +#if !defined(_TYPEDEF_CriBool) +#define _TYPEDEF_CriBool +typedef CriSint32 CriBool; /* 論理型(論理定数を値にとる) */ +#endif + +#if !defined(_TYPEDEF_CriChar8) +#define _TYPEDEF_CriChar8 +typedef char CriChar8; /* 文字型 */ +#endif + +/***************************************************************************** + * ポインタを格納可能な整数型 + *****************************************************************************/ +#if !defined(_TYPEDEF_CriSintPtr) +#define _TYPEDEF_CriSintPtr +typedef signed long CriSintPtr; // 8 bytes pointer +#endif + +#if !defined(_TYPEDEF_CriUintPtr) +#define _TYPEDEF_CriUintPtr +typedef unsigned long CriUintPtr; // 8 bytes pointer +#endif + +/***************************************************************************** + * 呼び出し規約 + *****************************************************************************/ + +#if !defined(CRIAPI) +#define CRIAPI +#endif + +#endif /* CRI_INCL_CRI_XPTS_PS4_H */ + +/* end of file */ diff --git a/3rdParty/cri/XboxOne/include/cri_allocator.h b/3rdParty/cri/XboxOne/include/cri_allocator.h new file mode 100644 index 00000000..e3c18997 --- /dev/null +++ b/3rdParty/cri/XboxOne/include/cri_allocator.h @@ -0,0 +1,63 @@ +#ifndef _CRI_ALLOCATOR_H_INCLUDED +#define _CRI_ALLOCATOR_H_INCLUDED +/**************************************************************************** + * * + * CRI Allocator * + * * + * 2006-01-05 written by M.Oshimi * + * * + ****************************************************************************/ + +/**************************************************************************** + * Include file + ****************************************************************************/ +#include +#include "cri_xpt.h" +#include "cri_heap.h" + +/**************************************************************************** + * Macro Constants + ****************************************************************************/ +#if defined(XPT_UNSUPPORT_CPLUSPLUS_THROW) +#define CRI_ALLOCATOR_CPLUSPLUS_THROW +#else +#define CRI_ALLOCATOR_CPLUSPLUS_THROW throw() +#endif + +/**************************************************************************** + * Class Declaration + ****************************************************************************/ +#ifdef __cplusplus + +class CriAllocator +{ +public: + static const CriSint32 DEFAULT_ALIGNMENT = CRIHEAP_DEFAULT_MEM_ALIGN; + + + static void* CRIAPI operator new(size_t size, CriHeap heap) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, CriHeapType heap_type) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, const CriChar8 *name, CriUint32 align=DEFAULT_ALIGNMENT) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, CriHeapType heap_type, const CriChar8 *name, CriUint32 align=DEFAULT_ALIGNMENT) CRI_ALLOCATOR_CPLUSPLUS_THROW; + + static void CRIAPI operator delete(void *p, size_t size); + + static void* CRIAPI operator new(size_t size, void *work, CriSint32 wksize) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, void *work, CriSint32 wksize) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, void *work, CriSint32 wksize, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, void *work, CriSint32 wksize, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + +#if !defined(XPT_TGT_BCB) + static void CRIAPI operator delete(void *p, CriHeap heap) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, CriHeapType heap_type) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, const CriChar8 *name, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, CriHeapType heap_type, const CriChar8 *name, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; +#endif + + static CriSint32 GetWorstExtraSize(CriUint32 align); +}; +#endif // _CRI_ALLOCATOR_H_INCLUDED + +#endif /* end of __cplusplus */ + +/* --- end of file --- */ diff --git a/3rdParty/cri/XboxOne/include/cri_error.h b/3rdParty/cri/XboxOne/include/cri_error.h new file mode 100644 index 00000000..6152a7b5 --- /dev/null +++ b/3rdParty/cri/XboxOne/include/cri_error.h @@ -0,0 +1,368 @@ +#ifndef _CRI_ERROR_H_INCLUDED +#define _CRI_ERROR_H_INCLUDED +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2006-2009 CRI Middleware Co., Ltd. + * + * Library : CRI Error + * Module : + * File : cri_error.h + * + ****************************************************************************/ +/*! + * \file cri_error.h + */ +/*JP + * \addtogroup CRI_ERROR G[nhOp֐Q + * @{ + */ +/*EN + * \addtogroup CRI_ERROR Functions for error handling + * @{ + */ + +/**************************************************************************** + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" + +/**************************************************************************** + * MACRO CONSTANT * + ****************************************************************************/ + +/* o[Wԍ */ +/* Version number */ +#define CRIERROR_VER_NAME "CRI Error" +#define CRIERROR_VER_NUM "1.04.00" +#define CRIERROR_VER_OPTION + +/*JP + * \brief G[R[h + */ +/*EN + * \brief Error codes + */ +typedef enum { + CRIERR_OK = 0, /*JP< I */ + /*EN< Succeeded */ + CRIERR_NG = -1, /*JP< G[ */ + /*EN< Error occurred */ + CRIERR_INVALID_PARAMETER = -2, /*JP< s */ + /*EN< Invalid argument */ + CRIERR_FAILED_TO_ALLOCATE_MEMORY = -3, /*JP< ̊mۂɎs */ + /*EN< Failed to allocate memory */ + CRIERR_UNSAFE_FUNCTION_CALL = -4, /*JP< XbhZ[t֐̕s */ + /*EN< Parallel execution of thread-unsafe function */ + CRIERR_FUNCTION_NOT_IMPLEMENTED = -5, /*JP< ֐̎s */ + /*EN< Function not implemented */ + CRIERR_LIBRARY_NOT_INITIALIZED = -6, /*JP< Cu */ + /*EN< Library not initialized */ + /* enum be 4bytes */ + CRIERR_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriError; + +/*JP + * \brief G[ʒmx + */ +/*EN + * \brief Error notification level + */ +typedef enum { + CRIERR_NOTIFY_ALL = 0, /*JP< SẴG[ʒm */ + /*EN< Notify all errors */ + CRIERR_NOTIFY_FATAL = 1, /*JP< G[̂ݒʒmix͖j */ + /*EN< Notify error (Disregards warning) */ + /* enum be 4bytes */ + CRIERR_NOTIFY_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriErrorNotificationLevel; + +/* G[x */ +/* Error level */ +typedef enum { + CRIERR_LEVEL_ERROR = 0, + CRIERR_LEVEL_WARNING = 1, + /* enum be 4bytes */ + CRIERR_LEVEL_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriErrorLevel; + +/**************************************************************************** + * PROCESS MACRO * + ****************************************************************************/ + +#if defined(CRIERROR_SIMPLIFY) + /* G[̒ʒm */ + /* Notification of Error */ + #define criErr_NotifyError(id, msg) criErr_NotifyErrorSimple() + #define criErr_NotifyError1(id, msg, p1) criErr_NotifyErrorSimple() + #define criErr_NotifyError2(id, msg, p1, p2) criErr_NotifyErrorSimple() + #define criErr_NotifyErrorPrmArray(id, msg, p1, p2, pa) criErr_NotifyErrorSimple() + #define criErr_NotifyErrorGeneric(_error_id, _error_no) criErr_NotifyErrorSimple() + /* x̒ʒm */ + /* Notification of Warning */ + #define criErr_NotifyWarning(id, msg) criErr_NotifyWarningSimple() + #define criErr_NotifyWarning1(id, msg, p1) criErr_NotifyWarningSimple() + #define criErr_NotifyWarning2(id, msg, p1, p2) criErr_NotifyWarningSimple() + #define criErr_NotifyWarningPrmArray(id, msg, p1, p2, pa) criErr_NotifyWarningSimple() + #define criErr_NotifyWarningGeneric(_error_id, _error_no) criErr_NotifyWarningSimple() +#else + /* G[̒ʒm */ + /* Notification of Error */ + #define criErr_NotifyError(id, msg) criErr_Notify(CRIERR_LEVEL_ERROR, id ":" msg) + #define criErr_NotifyError1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1)) + #define criErr_NotifyError2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) + #define criErr_NotifyErrorPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr *)(pa)) + #define criErr_NotifyErrorGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, _error_id, _error_no) + /* x̒ʒm */ + /* Notification of Warning */ + #define criErr_NotifyWarning(id, msg) criErr_Notify(CRIERR_LEVEL_WARNING, id ":" msg) + #define criErr_NotifyWarning1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1)) + #define criErr_NotifyWarning2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) + #define criErr_NotifyWarningPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr *)(pa)) + #define criErr_NotifyWarningGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_WARNING, _error_id, _error_no) +#endif + +/**************************************************************************** + * Data type declaration * + ****************************************************************************/ + +/* Error Callback Function type */ +typedef void (CRIAPI *CriErrCbFunc)(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + +/**************************************************************************** + * ϐ̐錾 * + * Variable Declaration * + ****************************************************************************/ +/* G[o͏ȗpϐ */ +/* default argument of CriError */ +#ifdef __cplusplus +namespace criErr { + extern CriError ErrorContainer; +} +#endif /* __cplusplus */ + +/**************************************************************************** + * ֐̐錾 * + * Function Declaration * + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*JP + * \brief G[ID񂩂G[bZ[W֕ϊ + * \ingroup CRI_ERROR + * \param[in] errid G[ID + * \return G[bZ[W + * \par : + * G[ID񂩂ڍׂȃG[bZ[W֕ϊ܂B
+ * \attention + * ̊֐͋dl̊֐łB
+ * ::criErr_ConvertIdToMessage ֐gpĂB + * \sa criErr_ConvertIdToMessage + */ +/*EN + * \brief Convert error ID to error message + * \ingroup CRI_ERROR + * \param[in] errid error ID + * \return error message + * \par Explanation: + * This function converts error ID to detailed error message.
+ * \attention + * This function is an obsolete one.
+ * Please use the ::criErr_ConvertIdToMessage function instead. + * \sa criErr_ConvertIdToMessage + */ +const CriChar8* CRIAPI criErr_ConvertIdToMsg(const CriChar8 *errid); + +/*JP + * \brief G[ID񂩂G[bZ[W֕ϊ + * \ingroup CRI_ERROR + * \param[in] errid G[ID + * \param[in] p1 ⑫1 + * \param[in] p2 ⑫2 + * \return G[bZ[W + * \par : + * G[ID񂩂ڍׂȃG[bZ[W֕ϊ܂B
+ * \par p: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * \endcode + */ +/*EN + * \brief Convert error ID to error message + * \ingroup CRI_ERROR + * \param[in] errid error ID + * \param[in] p1 supplementary information 1 + * \param[in] p2 supplementary information 2 + * \return error message + * \par Explanation: + * This function converts error ID to detailed error message.
+ * \par Example: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * \endcode + */ +const CriChar8* CRIAPI criErr_ConvertIdToMessage(const CriChar8 *errid, CriUint32 p1, CriUint32 p2); + +/*JP + * \brief G[R[obN֐̓o^ + * \ingroup CRI_ERROR + * \param[in] cbf G[R[obN֐ + * \return Ȃ + * \par : + * G[R[obN֐o^܂B
+ * o^ꂽ֐́ACRI~hEGACuŃG[ƂɌĂяo܂B
+ * ɓo^łG[R[obN֐͂P‚łB
+ * o^ɍēx{֐Ăяoꍇ݂͌̓o^㏑܂B + * \par p: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * + * void main(int ac, char *av[]) + * { + * F + * // G[R[obN̓o^ + * criErr_SetCallback(user_error_callback_func); + * F + * } + * \endcode + */ +/*EN + * \brief Register error callback function + * \ingroup CRI_ERROR + * \param[in] cbf error callback function + * \return NONE + * \par Explanation: + * This function registers an error callback function.
+ * The registered function is called if an error occurs within the CRI middleware library. + * \par Example: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * + * void main(int ac, char *av[]) + * { + * : + * // Registers the error callback function + * criErr_SetCallback(user_error_callback_func); + * : + * } + * \endcode + */ +void CRIAPI criErr_SetCallback(CriErrCbFunc cbf); + +/*JP + * \brief G[ʒmx̕ύX + * \ingroup CRI_ERROR + * \param[in] level G[ʒmx + * \return Ȃ + * \par : + * G[R[obNɒʒmG[̃xύX܂B + */ +/*EN + * \brief Change error notification level + * \ingroup CRI_ERROR + * \param[in] level error notification level + * \return NONE + * \par Explanation: + * This function changes the level of error information that is notified to the error callback. + */ +void CRIAPI criErr_SetErrorNotificationLevel(CriErrorNotificationLevel level); + +/*JP + * \brief G[񐔂̎擾 + * \ingroup CRI_ERROR + * \param[in] level G[x + * \return G[ + * \par : + * G[񐔂擾܂B + */ +/*EN + * \brief Retrieve error count + * \ingroup CRI_ERROR + * \param[in] level error level + * \return number of errors occured + * \par Explanation: + * This function retrieves the number of errors occured. + */ +CriUint32 CRIAPI criErr_GetErrorCount(CriErrorLevel level); + +/*JP + * \brief G[񐔂̃Zbg + * \ingroup CRI_ERROR + * \param[in] level G[x + * \return Ȃ + * \par : + * G[񐔂̃JE^0ɖ߂܂B + */ +/*EN + * \brief Resets error count + * \ingroup CRI_ERROR + * \param[in] level error level + * \return NONE + * \par Explanation: + * This function resets the counter for number of errors occured. + */ +void CRIAPI criErr_ResetErrorCount(CriErrorLevel level); + +/* G[R[obN𔭐 (֐) */ +/* Error notification (Internal functions) */ +void CRIAPI criErr_Notify(CriErrorLevel level, const CriChar8 *errid); +void CRIAPI criErr_Notify1(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1); +void CRIAPI criErr_Notify2(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1, CriUintPtr p2); +void CRIAPI criErr_NotifyPrmArray(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1, CriUintPtr p2, CriUintPtr *pa); +void CRIAPI criErr_NotifyGeneric(CriErrorLevel level, const CriChar8 *error_id, CriError error_no); +void CRIAPI criErr_NotifyErrorSimple(void); +void CRIAPI criErr_NotifyWarningSimple(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/*************************************************************************** + * o[WƂ̌݊p + * For compatibility with old versions + ***************************************************************************/ +#define criErr_Invoke(errid) criErr_Notify(CRIERR_LEVEL_ERROR, errid) +#define criErr_Invoke1(errid, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, errid, p1) +#define criErr_Invoke2(errid, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, errid, p1, p2) +#define criErr_InvokePrmArray(errid, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, errid, p1, p2, pa) +#define criErr_InvokeGeneric(error_id, error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, error_id, error_no) +#define criErr_Occur(id, msg) criErr_Notify(CRIERR_LEVEL_ERROR, id ":" msg) +#define criErr_Occur1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1)) +#define criErr_Occur2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) +#define criErr_OccurPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr*)(pa)) +#define criErr_OccurGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, _error_id, _error_no) + +/*EN + * @} + */ +/*JP + * @} + */ + +#endif // _CRI_ERROR_H_INCLUDED + +/* --- end of file --- */ diff --git a/3rdParty/cri/XboxOne/include/cri_heap.h b/3rdParty/cri/XboxOne/include/cri_heap.h new file mode 100644 index 00000000..488306bb --- /dev/null +++ b/3rdParty/cri/XboxOne/include/cri_heap.h @@ -0,0 +1,640 @@ +#ifndef _CRI_HEAP_H_INCLUDED +#define _CRI_HEAP_H_INCLUDED +/**************************************************************************** + * * + * CRI Heap Manager "CriHeap" Library * + * * + * 2005-03-17 written by satouo * + * * + ****************************************************************************/ +/*! + * \file cri_heap.h + */ + +/**************************************************************************** + * CN[ht@C * + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" + +#ifdef XPT_TGT_PC +#pragma pack(push) +#pragma pack(1) //The boundary value of structure is adjusted to 1 byte. +#endif + +/**************************************************************************** + * 萔}N * + * MACRO CONSTANT * + ****************************************************************************/ +/* Version number of CRIHEAP */ +#define CRIHEAP_NAME_STRINGS "CRI Heap" +#define CRIHEAP_VERSION_STRINGS "1.21.02" + +/* Default memory alignment */ +#define CRIHEAP_DEFAULT_MEM_ALIGN (8) + +/**************************************************************************** + * 񋓒萔}N * + * ENUM CONSTANT * + ****************************************************************************/ +/*JP + * \brief ̃^Cv + */ +/*EN + * \brief Types of heap + */ +typedef enum { + CRIHEAP_TYPE_FIX = (1), + CRIHEAP_TYPE_TEMPORARY = (2), + CRIHEAP_TYPE_DYNAMIC = (3), // unuse + CRIHEAP_TYPE_NONE = (0), + /* enum be 4bytes */ + CRIHEAP_TYPE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriHeapType; + +/**************************************************************************** + * f[^^ * + * Data type declaration * + ****************************************************************************/ +/* CriHeapnh */ +/* CriHeap handle */ +#ifndef CRIHEAP_DEFINED +#define CRIHEAP_DEFINED + +/* internal */ +typedef struct CriHeapBlockTag { + struct CriHeapBlockTag *prevblock; + struct CriHeapBlockTag *nextblock; + CriSint32 memsize; + CriUint8 used; + CriUint8 type; + CriUint16 alignspc; + CriUint16 gap; + CriChar8 *nameadr; +} CriHeapBlock, *CriHeapBlockPtr; + +/*JP + * \brief CRI Heapnh + * \struct CriHeap + * \ingroup CRIHEAP_BASIC + * CRI HeappăAP[gs߂ɕKvȃnhłB
+ * ̃nhɑ΂āAAP[g⃁t[s܂B + * \sa criHeap_Create(), criHeap_Destroy() + */ +/*EN + * \brief CRI Heap handle + * \struct CriHeap + * \ingroup CRIHEAP_BASIC + * \par Description: + * The heap handle. This data structure needs to exist through the life cycle of + * the heap. It allows the library to allocate and deallocate memory + * internally within the heap. Typically this handle gets allocated at the + * beginning of the heap memory that you've provided for the heap, but don't + * depend on this behavior. The heap itself is opaque. You can of course + * allocate multiple non-contiguous heaps, but these will be separate heap + * structures and a single allocation won't choose between them. + * + * \sa criHeap_Create(), criHeap_Destroy() + */ +typedef struct _criheap_struct { + struct _criheap_vfunctiontable *vtbl; + CriSint32 totalsize; + CriSint32 peaksize; + CriSint32 currentsize; + CriHeapBlock *topblock; + CriHeapBlock *taleblock; +} CriHeapObj, *CriHeap; + +/*JP + * \brief CRI Heapz֐e[u + * \struct criHeapVirtualFunctionTable + * \ingroup CRIHEAP_BASIC + * Ǝ̃AP[g֐ۂɎgp鉼z֐e[u\̂łB
+ * e֐̓}`XbhZ[tłKv܂B
+ * \par l: + * RԖڂ̃AP[g֐͌ݖgpłB + */ +/*EN + * \brief CRI Heap Virtual Function Table + * \struct criHeapVirtualFunctionTable + * \ingroup CRIHEAP_BASIC + * \par Description: + * The virtual functions table for original allocation functions.
+ * The third allocation function is not in use currently. + */ +typedef struct _criheap_vfunctiontable { + /*JP + * \brief ̃AP[gï̐[j + * \par : + * criHeap_AllocFix֐ĂяoɌĂ΂܂B + * \sa criHeap_AllocFix() + */ + /*EN + * \brief Memory allocation (allocating from the top of the memory area) + * \par Description: + * Called from criHeap_AllocFix(). + * \sa criHeap_AllocFix() + */ + void *(*AllocFix)(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + /*JP + * \brief ̃AP[gï̏I[j + * \par : + * criHeap_AllocFix֐ĂяoɌĂ΂܂B + * \sa criHeap_AllocTemporary() + */ + /*EN + * \brief Memory allocation (allocating from the tail of the memory area) + * \par Description: + * Called from criHeap_AllocTemporary(). + * \sa criHeap_AllocTemporary() + */ + void *(*AllocTemporary)(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + /*JP + * \brief gp֐ + */ + /*EN + * \brief Unused + */ + void *(*AllocDynamic)(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); // unused + + /*JP + * \brief ̃t[ + * \par : + * criHeap_Free֐ĂяoɌĂ΂܂B + * \sa criHeap_Free() + */ + /*EN + * \brief Memory deallocation + * \par Description: + * Called from criHeap_Free(). + * \sa criHeap_Free() + */ + CriSint32 (*Free)(CriHeap heap, void *ptr); +} criHeapVirtualFunctionTable; + +#endif + + +/**************************************************************************** + * ֐̐錾 + * Function Declaration + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*==========================================================================* + * CȕƏI + * Initialize and Finalize of Library + *==========================================================================*/ +/*JP + * \brief CRI HeapCȕ + * \ingroup CRIHEAP_BASIC + * \par : + * CRI HeapCugp邽߂ɕKvȏ֐łB
+ * CRI Heapgpۂ͂炩ߖ{֐R[Kv܂B + * \sa criHeap_Finalize() + */ +/*EN + * \brief Initialize the heap manager. + * \ingroup CRIHEAP_BASIC + * \par Description: + * This function initializes the heap manager and prepares it to manage heaps. + * This function only has an effect the first time it is called in your program. + * Subsequent calls only increment an internal counter. This allows your + * program to call criHeap_Initialize() in pairs with criHeap_Finalize() + * throughout your program modules, and only the initial call to criHeap_Initialize() + * and the final call to criHeap_Finalize() will have any effect. + * \if ps2 + * \par PS2 only: + * This function does a sanity check to make sure that the size of the CriHeapObj + * data structure is a factor of 16. If it is not a factor of 16, this function + * hangs. + * \endif + * \sa criHeap_Finalize() + */ +void CRIAPI criHeap_Initialize(void); + +/*JP + * \brief CRI HeapCȕI + * \ingroup CRIHEAP_BASIC + * \par : + * CRI HeapCuI邽߂ɕKvȏI֐łB
+ * CRI Heap̎gpIۂ͖{֐R[ĂB + * \sa criHeap_Initialize() + */ +/*EN + * \brief Finalize the heap manager. + * \ingroup CRIHEAP_BASIC + * \par Description: + * This function finalizes the heap manager. If the criHeap_Initialize() function + * is called n times, then the nth time that criHeap_Finalize() + * is called, this function invalidates any heaps currently in use. Calling + * any heap function after the nth call to criHeap_Finalize() will + * have unpredictable results. + * \sa criHeap_Initialize() + */ +void CRIAPI criHeap_Finalize(void); + +/*==========================================================================* + * nh̐E + *==========================================================================*/ +/*JP + * \brief CRI Heapnh̐ + * \ingroup CRIHEAP_BASIC + * \param ptr ̈̃|C^B + * \param size ̈̃TCYB + * \return CRI HeapnhB
Ɏsꍇ́ANULLԂ܂B + * \par : + * CRI Heapnh𐶐܂B
+ * {֐ŗ^郁̈́ACRI Heapg̃nḧAP[g + * mۂ郁̈ƂȂ܂B
+ * Ǘ̈܂ނ߁Ä悷ׂĂAP[goȂ_ɒӂĂB + * Ǘ̖̈ڈ́uPnhsizeof(CriHeapObj)v{uPAP[g + * sizeof(CriHeapBlock){eACgɕKvȃTCYvƂȂ܂B + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * \endcode + * \sa criHeap_Destroy() + */ +/*EN + * \brief Create a contiguous heap in memory. + * \ingroup CRIHEAP_BASIC + * \param ptr A pointer to the start of the memory region to use as a heap. + * \param size The size of the region to be used as a heap. + * \return A valid CriHeap handle if successful, or NULL if unsuccessful. + * \par Description: + * This function allows you to set aside a region of memory for this library's + * use as a "heap". Heap allocation is required before active playback + * can begin. + * This function will fail and return NULL if the size of the memory region + * is smaller than the CriHeapObj structure. + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * \endcode + * \sa criHeap_Destroy() + */ +CriHeap CRIAPI criHeap_Create(void *ptr, CriSint32 size); + +/*JP + * \brief XbhZ[tCRI Heapnh̐ + * \ingroup CRIHEAP_BASIC + * \param ptr ̈̃|C^B + * \param size ̈̃TCYB + * \return CRI HeapnhB
Ɏsꍇ́ANULLԂ܂B + * \par : + * CRI Heapnh𐶐܂B
+ * {֐gpč쐬ꂽq[v́Ar䂪sȂ܂B
+ * Xbh瓯ɎQƂq[v̍쐬ɂ́AcriHeap_Create֐pB + * \sa criHeap_Create(), criHeap_Destroy() + */ +/*EN + * \brief Create a contiguous heap in memory. + * \ingroup CRIHEAP_BASIC + * \param ptr A pointer to the start of the memory region to use as a heap. + * \param size The size of the region to be used as a heap. + * \return A valid CriHeap handle if successful, or NULL if unsuccessful. + * \par Description: + * This function creates a heap to use the static memory as dynamically allocatable memory. + * The heap created by using this function is not threadsafe. + * If heap will be accessed by multiple threads, you must create the heap by using the criHeap_Create function. + * \sa criHeap_Create(), criHeap_Destroy() + */ +CriHeap CRIAPI criHeap_CreateNoSerialize(void *ptr, CriSint32 size); + +/*JP + * \brief CRI Heapnh̉ + * \ingroup CRIHEAP_BASIC + * \param heap CRI HeapnhB + * \par : + * CRI Heapnh܂B
criHeap_Create() Ŏw肳ꂽ̈悪 + * ACRI Heapnh͖ƂȂ܂B + * \sa criHeap_Create() + */ +/*EN + * \brief Destroy a previously created heap. + * \ingroup CRIHEAP_BASIC + * \param heap A CriHeap handle previously created with criHeap_Create(). + * \par Description: + * This function frees all internal allocations previously performed on + * the heap and frees the memory. Internally, this function does in + * fact walk through the heap, finding and freeing all allocations, e.g. + * it is not stubbed. So calling this function on a trashed heap + * will have unpredictable results. + * \sa criHeap_Create() + */ +void CRIAPI criHeap_Destroy(CriHeap heap); + +/*==========================================================================* + * Allocation + *==========================================================================*/ +/*JP + * \brief ̃AP[gï̐[j + * \ingroup CRIHEAP_ALLOC + * \param heap CRI HeapnhB + * \param size AP[g郁̃TCYB + * \param name AP[g郁̖OBO̓fobOɎgp܂B + * \param align AP[g郁̃ACgB + * \return AP[gւ̃|C^B
AP[gɎsꍇNULLԂ܂B + * \par : + * ̈̐[mۂ郁AP[V֐łBq[v̈\ref block_fix "FixubN"쐬܂B
+ * ̒fЉh߁ATCY^ACg̉ς\ref block_fix "FixubN"[TāAėp悤Ɏ݂܂Bꂪ‚Ȃꍇ́Agp̋󂫗̈i\ref block_free "FreeubN"j𕪊ă擾܂B + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * \endcode + * \sa criHeap_AllocTemporary(), criHeap_Free() + */ +/*EN + * \brief Memory allocation (allocating from the top of the memory area) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heap handle + * \param size Memory block size to be allocated + * \param name Memory block name, which is used on debugging + * \param align Memory block alignment + * \return A pointer to the allocated memory block.
Returns NULL if unsuccessful. + * \par Description: + * This function allocates a memory block from the top of the memory area and creates a \ref block_fix "Fix block" in the heap area.
+ * To prevent memory fragmentation, a released \ref block_fix "Fix block" with the same size and alignment is searched for in the heap area from the top to the bottom and tries to reused the block. And if not found, an unused free block (\ref block_free "Free block") is divided and a new block is allocated. + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * \endcode + * \sa criHeap_AllocTemporary(), criHeap_Free() + */ +void * CRIAPI criHeap_AllocFix(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + +/*JP + * \brief ̃AP[gï̏I[j + * \ingroup CRIHEAP_ALLOC + * \param heap CRI HeapnhB + * \param size AP[g郁̃TCYB + * \param name AP[g郁̖OBO̓fobOɎgp܂B + * \param align AP[g郁̃ACgB + * \return AP[gւ̃|C^B
AP[gɎsꍇNULLԂ܂B + * \par : + * ̈̏I[mۂ郁AP[V֐łBq[v̈\ref block_temporary "TemporaryubN"쐬܂B
+ * vTCY^ACgAP[g”\ȉς\ref block_temporary "TemporaryubN"I[TāA܂͍ėp悤Ɏ݂܂Bꂪ‚Ȃꍇ́Agp̋󂫗̈i\ref block_free "FreeubN"j𕪊ă擾܂B
+ * q[v̈̏I[烁AP[g邽߁A[ł̒fЉhƂo܂B
+ * ɁAꎞIɗp郁Ɏgp܂B + * \sa criHeap_AllocFix(), criHeap_Free() + */ +/*EN + * \brief Memory allocation (allocating from the tail of the memory area) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heap handle + * \param size Memory block size to be allocated + * \param name Memory block name, which is used on debugging + * \param align Memory block alignment + * \return A pointer to the allocated memory block.
Returns NULL if unsuccessful. + * \par Description: + * This function allocates a memory block from the bottom of the memory area and creates a \ref block_temporary "Temporary block" in the heap area.
+ * A released \ref block_temporary "Temporary block" available with the requested size and alignment is searched for in the heap area from the bottom and tries to divide and to reuse the block. And if not found, an unused free block (\ref block_free "Free block") is divided and a new block is allocated.
+ * Allocating from the bottom of the heap area will prevent fragmentation in the top of the heap area.
+ * Temporary block is mainly used for the memory area that is temporarily used. + * \sa criHeap_AllocFix(), criHeap_Free() + */ +void * CRIAPI criHeap_AllocTemporary(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + +/* DYNAMIC (unuse) */ +//void * CRIAPI criHeap_AllocDynamic(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + +void * CRIAPI criHeap_Alloc(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align, CriSint32 type); + +/*==========================================================================* + * Free + *==========================================================================*/ +/*JP + * \brief ̃t[ + * \ingroup CRIHEAP_ALLOC + * \param heap CRI HeapnhB + * \param ptr AP[g̃|C^B + * \return t[ꂽTCYB + * \par : + * AP[gꂽt[܂B
+ * \code + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * criHeap_Free(heap, memptr); + * \endcode + * \sa criHeap_AllocFix(), criHeap_AllocTemporary() + */ +/*EN + * \brief Memory deallocation + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heap handle + * \param ptr The pointer to the allocated memory block + * \return Deallocated memory block size + * \par Description: + * This function deallocates the allocated memory block.
+ * \code + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * criHeap_Free(heap, memptr); + * \endcode + * \sa criHeap_AllocFix(), criHeap_AllocTemporary() + */ +CriSint32 CRIAPI criHeap_Free(CriHeap heap, void *ptr); + +/*==========================================================================* + * rp֐ + *==========================================================================*/ +CriSint32 CRIAPI criHeap_EnterCriticalSection(void); +CriSint32 CRIAPI criHeap_LeaveCriticalSection(void); + +/*==========================================================================* + * ̑̊֐ + *==========================================================================*/ +/* For only internal use */ +CriSint32 CRIAPI criHeap_SwitchAllocFunctions(CriHeap heap); + +/*==========================================================================* + * fobO֘A + *==========================================================================*/ +/*JP + * \brief s[NTCY̎擾 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI HeapnhB + * \return gpꂽ̍őlB + * \par : + * ߋAgpꂽʂ̍őlԂ܂B
+ * őlcriHeap_DebugResetPeakMemorySize() ŃZbg邱Ƃo܂B + * \sa criHeap_DebugResetPeakMemorySize() + */ +/*EN + * \brief Returns peak memory usage of the heap. + * \ingroup CRIHEAP_DEBUG + * \param heap The heap previously allocated by criHeap_Create(). + * \return The maximum number of bytes used by the heap. + * \par Description: + * The amount of memory used by these libraries is variable and depends + * on the number of simultaneous streams being read, the seek and error + * frequency within the stream being read, video resolution and other + * factors. This function allows you to tune the allocation of the heap + * to achieve a required performance level while allocating minimal + * heap space for this library. To get accurate readings, this function + * should typically be called just before criHeap_Destroy(), and after + * exercising all the video and audio functions in your program. + */ +CriSint32 CRIAPI criHeap_DebugGetPeakMemorySize(CriHeap heap); + +/*JP + * \brief s[NTCỸZbg + * \ingroup CRIHEAP_DEBUG + * \param heap CRI HeapnhB + * \par : + * s[NTCYZbg܂B + * \sa criHeap_DebugGetPeakMemorySize() + */ +/*EN + * \brief Reset peak memory size + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap handle + * \par Description: + * The peak memory size is reset. + * \sa criHeap_DebugGetPeakMemorySize() + */ +void CRIAPI criHeap_DebugResetPeakMemorySize(CriHeap heap); + +/*JP + * \brief ubN̎擾 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI HeapnhB + * \return ubNB + * \par : + * AP[gꂽ̃ubNԂ܂B
+ * CRI Heapnh͖gp̃ubNP‘݂ + * ƂȂ܂B܂At[ꂽfЉꂽubN̐ + * ܂݂܂B + * \sa criHeap_DebugGetUsedBlocks() + */ +/*EN + * \brief Get number of allocated memory blocks + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap handle + * \return Number of allocated memory blocks + * \par Description: + * The number of allocated memory blocks is returned.
+ * One unused memory block exists right after CRI Heap handle creation. + * The number of released fragmented memory blocks is also included. + * \sa criHeap_DebugGetUsedBlocks() + */ + CriSint32 CRIAPI criHeap_DebugGetNumBlocks(CriHeap heap); + +/*JP + * \brief gpubN̎擾 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI HeapnhB + * \return gpubNB + * \par : + * AP[gĂ郁ubN̐Ԃ܂B + * \sa criHeap_DebugGetNumBlocks() + */ +/*EN + * \brief Get number of used memory blocks + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \return Number of used memory blocks + * \par Description: + * The number of used memory blocks is returned.
+ * \sa criHeap_DebugGetNumBlocks() + */ +CriSint32 CRIAPI criHeap_DebugGetUsedBlocks(CriHeap heap); + +/*JP + * \brief ubN̎擾 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI HeapnhB + * \param ptr AP[g̃|C^B + * \return ubNB + * \par : + * AP[gɐݒ肵ubNւ̃|C^Ԃ܂B
+ */ +/*EN + * \brief Get memory block name + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \param ptr A pointer to the allocated memory block + * \return Memory block name + * \par Description: + * The pointer to the memory block name specified on allocation is returned.
+ */ +CriChar8 * CRIAPI criHeap_DebugGetBlockName(CriHeap heap, void *ptr); + +/* ubNԍ̎擾 */ +//CriSint32 CRIAPI criHeap_DebugGetBlockNumberFromPointer(CriHeap heap, void *ptr); + +/* ubN̎擾 */ +//void CRIAPI criHeap_DebugGetBlockInformation(CriHeap heap, +// CriSint32 blocknumber, CriHeapBlock *heapblock); + +/* ubN̕\ */ +//void CRIAPI criHeap_DebugPrintBlockInformation(CriHeap heap, +// CriSint32 blocknumber, CriHeapBlock *heapblock); + +/*JP + * \brief ubN̕\ + * \ingroup CRIHEAP_DEBUG + * \param heap CRI HeapnhB + * \par : + * ݂̃ubN\܂B
+ * printf֐Ȃǂ̕Wo͂ɕ\s܂B + */ +/*EN + * \brief Print memory block information + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \par Description: + * The current memory block information is displayed.
+ * It is displayed on the standard output for the printf function. + */ + void CRIAPI criHeap_DebugPrintBlockInformationAll(CriHeap heap); + +/*JP + * \brief AP[gTCY̎擾 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI HeapnhB + * \par : + * ݂̃AP[gTCY̍vlԂ܂B + */ +/*EN + * \brief Get total allocation size + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \par Description: + * The total size of allocated memory blocks is returned. + */ +CriSint32 CRIAPI criHeap_DebugGetTotalAllocSize(CriHeap heap); + +/* t[TCY̎擾 */ +//CriSint32 CRIAPI criHeap_DebugGetTotalFreeSize(CriHeap heap); + +/* AP[gTCY̎擾(^Cv) */ +CriSint32 CRIAPI criHeap_DebugGetAllocSize(CriHeap heap, CriSint32 type); + +/* q[vwb_TCY̎擾 */ +CriSint64 CRIAPI criHeap_DebugGetHandleHeaderSize(CriHeap heap); + +/* ubNwb_TCY̎擾 ptr: Allocated Pointer */ +CriSint64 CRIAPI criHeap_DebugGetMemBlockHeaderSize(void *ptr); + +/* ljŕKvƂȂTCY̍ől */ +CriSint32 CRIAPI criHeap_DebugGetWorstExtraSize(CriSint32 alignment); + +/* criHeap_AllocFixŃAP[g”\ȃTCY */ +CriSint32 CRIAPI criHeap_DebugGetFixAllocatableSize(CriHeap heap, CriSint32 alignment); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#ifdef XPT_TGT_PC +#pragma pack(pop) +#endif + +#endif // _CRI_HEAP_H_INCLUDED + +/* end of file */ diff --git a/3rdParty/cri/XboxOne/include/cri_movie.h b/3rdParty/cri/XboxOne/include/cri_movie.h new file mode 100644 index 00000000..1c0db2f8 --- /dev/null +++ b/3rdParty/cri/XboxOne/include/cri_movie.h @@ -0,0 +1,4402 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2006-2013 CRI Middleware Co., Ltd. + * + * Library : CRI Movie + * Module : Library User's Header + * File : cri_movie.h + * Date : 2013-11-27 + * Version : (see CRIMOVIE_VER) + * + ****************************************************************************/ +/*! + * \file cri_movie.h + */ +#ifndef CRI_MOVIE_H_INCLUDED /* Re-definition prevention */ +#define CRI_MOVIE_H_INCLUDED + +/* Version No. */ +#define CRIMOVIE_VER "3.50" +#define CRIMOVIE_NAME "CRI Movie" + +/*************************************************************************** + * Include file + ***************************************************************************/ +#include +#include +#include +#include +#include +#include + +/*************************************************************************** + * MACRO CONSTANT + ***************************************************************************/ +/*EN + * \brief Maximum length of a filename that can be opened by EasyPlayer + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetFile() + */ +/*JP + * \brief EasyPlayerɎw”\ȃt@C̍ő咷 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetFile() + */ +#define CRIMV_MAX_FILE_NAME (256) + +/*EN + * \brief Default audio track setting used by AttachSubAudioInterface(), ReplaceCenterVoice() + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::ReplaceCenterVoice(), CriMvEasyPlayer::AttachSubAudioInterface() + */ +/*JP + * \brief TuI[fBIi܂̓Z^[{CXj̃ftHgl + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::ReplaceCenterVoice(), CriMvEasyPlayer::AttachSubAudioInterface() + */ +#define CRIMV_CENTER_VOICE_OFF (-1) + + +/*************************************************************************** + * Variable Declaration + ***************************************************************************/ +namespace CriMv { + extern CriError ErrorContainer; +} + +/*************************************************************************** + * Prototype Functions + ***************************************************************************/ +/*EN + * \brief CRI Movie Namespace + * \ingroup MDL_MV_BASIC + * \par + * Namespace for all CRI Movie methods, constants, and declarations + */ +/*JP + * \brief CRI Movie Namespace + * \ingroup MDL_MV_BASIC + * \par + * Namespace for all CRI Movie methods, constants, and declarations + */ +namespace CriMv { + + /*EN + * \brief Returns the version number and build information of CRI Movie + * \param none + * \return A string constant + * + * Returns the version number and build information of CRI Movie as a constant + * string, in the form + * + * "CRI Movie/{PLATFORM} {VERSION} Build:{BUILD DATE}" + */ + /*JP + * \brief CRI Moviẽo[WԍrhԂ܂B + * \return Cu񕶎 + * + */ + const CriChar8* CRIAPI GetLibraryVersionString(void); + + /*EN + * \brief Initialize the CRI Movie library + * \param err Optional error code + * + * Does one-time initialization of the CRI Movie library.
+ * This function must be successfully called before calling CriMvEasyPlayer::Create().
+ *
+ * In general, all CRI Movie APIs are available after calling CriMv::Initialize(), + * until CriMv::Finalize() is called. However, there are some methods that set options + * for the library as a whole which must be called before CriMv::Initialize():
+ *
+ * It is safe to call CriMv::Initialize() more than once, as long as your application calls + * CriMv::Finalize() once for each call to CriMv::Initialize(). Multiple calls will not + * have an effect on the library, other than to increment or decrement an internal counter. + * + * \sa CriMv::Finalize() + */ + /*JP + * \brief CRI MovieCȕ + * \param err G[iȗj + * + * CRI Movie Cu܂B
+ * CriMvEasyPlayer::Create ֐ɌĂяoĂB
+ *
+ * ƂđSĂ CRI Movie Cu֐͏AI֐Ăяo܂ł̊Ԃɂ̂ݎgp܂B
+ * A‚̐ݒ֐͏֐ɌĂяoKv̂܂B + * ڍׂ͊eݒ֐̐QƂĂB + *
+ * ֐𕡐ĂяoꍇAQڈȍ~̌Ăяoł͌Ăяo񐔂L^邾ōď͍s܂B
+ * ̏ꍇAIsɂ͓񐔂I֐ĂяoKv܂B + * ֐ƏI֐͕K΂ŌĂяo悤ɎĂB
+ * + * \sa CriMv::Finalize() + */ + void CRIAPI Initialize(CriError &err = CriMv::ErrorContainer); + + /* MEMO: + * If an application calls this function instead of CriMv::Initialize(), + * an application need to call CriMv::SetupMovieHandleWork() before CriMv::InitializeMana(). + */ + void CRIAPI InitializeMana(CriError &err = CriMv::ErrorContainer); + + /*EN + * \brief Initialize 32bit ARGB frame conversion + * + * This function initializes 32bit ARGB frame conversion.
+ * When an application uses CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB(), + * please call this function after CriMv::Initialize().
+ * + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB() + */ + /*JP + * \brief 32bitARGBpt[ϊ̏ + * + * 32bitARGBpt[ϊ܂B
+ * CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB() gpꍇ CRI Movie Cu + * ɕKĂяoĂB
+ * + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB() + */ + void CRIAPI InitializeFrame32bitARGB(void); + +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_PC) || defined(XPT_TGT_TRGP6K) + void CRIAPI InitializeFrameRGB565(void); +#endif + + /*EN + * \brief De-initializes the CRI Movie library + * \param err Optional error code + * + * This function finalize whole CRI Movie library.
+ * An application needs to destroy all CriMvEasyPlayer handles and decoding threads before callign CriMv::Finalize().
+ *
+ * In principle, all CRI Movie library APIs are enabled after CriMv::Initialize() until CriMv::Finalize().
+ * But there are some APIs for parameter setting, which need to be called after CriMv::Finalize(). + * For details, refer to each explanations of setting APIs. + *
+ * \remarks + * CriMv::Finalize() must be called once for each call to CriMv::Initialize(). When the + * internal initialization count reaches 0, the library will be finalized. + * + * \sa CriMv::Initialize() + */ + /*JP + * \brief CRI MovieCȕI + * \param err G[iȗj + * + * CRI Movie CuI܂B
+ * ̊֐ĂяoOɁASĂ CriMvEasyPlayer nhуfR[hXbhjĂB
+ *
+ * ƂđSĂ CRI Movie Cu֐͏AI֐Ăяo܂ł̊Ԃɂ̂ݎgp܂B
+ * A‚̐ݒ֐͏I֐ɌĂяoKv̂܂B + * ڍׂ͊eݒ֐̐QƂĂB + *
+ * ֐𕡐ĂяoꍇAIsɂ͓񐔂I֐ĂяoKv܂B + * ֐ƏI֐͕K΂ŌĂяo悤ɎĂB
+ * + * \sa CriMv::Initialize() + */ + void CRIAPI Finalize(CriError &err = CriMv::ErrorContainer); + +#if !defined(XPT_TGT_EE) + /*EN + * \brief Calculates the work buffer size needed for the given number of movie handles + * \param max_num Maximum number of movie handles desired + * \param err Optional error code + * \return The necessary work buffer size, in bytes + * + * Each active movie handle requires an internal work buffer. If your application + * needs to have multiple movies open at one time, it should determine how many handles + * it needs, allocate a buffer of the size returned by this function, and pass it to + * CriMv::SetupMovieHandleWork().
+ * + * Each CriMvEasy object uses a movie handle. Alpha movie playback uses two handles. + * If you need to play aplha movies, be sure to double the number of handles requested. + * + * \remarks + * The number of movie handles must be set before calling CriMv::Initialize(). + * + * \sa CriMv::SetupMovieHandleWork() + */ + /*JP + * \brief }`nhp[Nobt@TCY̌vZ + * \param max_num őnhis[r̍Đj + * \param err G[iȗj + * \return [NTCY + * + * Ɏgp CriMvEasyPlayer nh̍ő吔𑝉ꍇɕKvȃ[Nobt@ + * TCYvZ܂B + * + * At@[rĐƃnhQ܂B + * ̃At@[rĐsꍇ́Aőnh͔{ɂĎw肵ĂB + * + * \sa CriMv::SetupMovieHandleWork() + */ + CriUint32 CRIAPI CalcMovieHandleWork(CriUint32 max_num, CriError &err = CriMv::ErrorContainer); + + /*EN + * \brief Increases the default number of available movie handles + * \param max_num Maximium number of movie handles + * \param workbuf Work buffer + * \param worksize Size of work buffer + * \param err Optional error code + * + * Call this function if your application needs to increase the maximum number of open movies + * beyond the default. Note that playing an alpha movie requires a second handle.
+ * + * The default number of movie handles depends on the platform.
+ * + * The work buffer must be allocated based on the size returned by CriMv::CalcMovieHandleWork().
+ * + * \remarks + * This function must be called before calling CriMv::Initialize(). + * + * \sa CriMv::CalcMovieHandleWork() + */ + /*JP + * \brief }`nhp[Nobt@̐ݒ + * \param max_num őnhis[r̍Đj + * \param workbuf [Nobt@AhX + * \param worksize [Nobt@TCY + * \param err G[iȗj + * + * Ɏgp CriMvEasyPlayer nh̍ő吔𑝉邽߂̃[Nobt@ݒ肵܂B + * ȂA[Nobt@w肵Ȃꍇ̃nh͋@ɂĈقȂ܂B + * + * [Nobt@̐ݒ́A CriMv::Initialize() ̌ĂяoɎsĂB + * + * \sa CriMv::CalcMovieHandleWork() + */ + void CRIAPI SetupMovieHandleWork(CriUint32 max_num, void *workbuf, CriUint32 worksize, CriError &err = CriMv::ErrorContainer); + + /*EN + * \brief Get max number of movie handles + * \param err Optional error code + * \return Max number of movie handles you set by CriMv::SetupMovieHandleWork(). + * + * Returns the maximum number of movie handles that are available to CRI Movie.
+ * + * Note that this is not necessarily equal to the number of movies that can be + * opened at a time. In general, each movie will use one handle; however, + * alpha channel movies uses two handles. + * + * \sa CriMv::SetupMovieHandleWork(), CriMv::CalcMovieHandleWork() + */ + /*JP + * \brief őnh̎擾 + * \param err G[iȗj + * \return CriMv::SetupMovieHandleWork() Őݒ肵őnh + * + * CriMv::CalcMovieHandleWork() ōőnh𑝉ꍇɁA + * ݒ肵őnh擾܂B + * + * \sa CriMv::SetupMovieHandleWork(), CriMv::CalcMovieHandleWork() + */ + CriUint32 CRIAPI GetMaxNumberOfHandles(CriError &err = CriMv::ErrorContainer); +#endif + + /* For Sofdec2 */ + CriSint32 CRIAPI CalcHandleWorkSize(CriMvHandleConfig *config, CriError &err = CriMv::ErrorContainer); + void CRIAPI SetDelayDestroySubmodules(CriBool sw); +} + +/*************************************************************************** + * CLASS + ***************************************************************************/ +/*EN + * \brief File Reading Interface Class for EasyPlayer + * \ingroup MDL_IF_READER + * \par + * You can implement your own streaming filesystem for movie playback by deriving + * from this class.
+ * + * Pass an instance of this subclass to CriMvEasyPlayer::Create().
+ * + * This class is designed for asynchronous operation. All functions are pure virtual. + * + * \sa CriMvEasyPlayer::Create() + */ +/*JP + * \brief t@Cǂݍ݃C^tF[X for EasyPlayer + * \ingroup MDL_IF_READER + * + * ̃NX`邱ƂŁAÕt@CVXegEasyPlayer + * Xg[~OД\ɂȂ܂B
+ * SĂ̊֐͏z֐ƂĒ`Ă̂ŁASĂ̊֐KĂB + * + * \sa CriMvEasyPlayer::Create() + */ +class CriMvFileReaderInterface +{ +public: + /*EN Status of an asynchronous operation */ + /*JP 񓯊Xe[^X */ + enum AsyncStatus { + ASYNC_STATUS_STOP, /*EN< No action */ + /*JP< ĂȂԁB*/ + ASYNC_STATUS_BUSY, /*EN< Currently processing */ + /*JP< */ + ASYNC_STATUS_COMPLETE, /*EN< Processing completed */ + /*JP< I */ + ASYNC_STATUS_ERROR, /*EN< An error occured */ + /*JP< G[ */ + + /* Keep enum 4bytes */ + ASYNC_STATUS_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + /*EN Offset values for Seek() */ + /*JP V[NJnʒu */ + enum SeekOrigin { + SEEK_FROM_BEGIN, /*EN< Start of file */ + /*JP< t@C擪 */ + SEEK_FROM_CURRENT, /*EN< Current position in file */ + /*JP< t@Č݈ʒu */ + SEEK_FROM_END, /*EN< End of file */ + /*JP< t@CI[ */ + + /* Keep enum 4bytes */ + SEEK_FROM_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + /*EN + * \brief Opens a file asynchronously + * \param fname Name of file to open + * + * Initiates a file open request, and returns immediately. + * + * To determine success or failure, call CriMvFileReaderInterface::GetOpenStatus().
+ * + * \remarks + * CRI Movie may call CriMvFileReaderInterface::Read() and CriMvFileReaderInterface::Close() + * before CriMvFileReaderInterface::GetOpenStatus() returns ASYNC_STATUS_COMPLETE. + * + * \sa CriMvFileReaderInterface::GetOpenStatus() + */ + /*JP + * \brief t@Cɂt@CI[v(A) + * \param fname t@C̕ + * + * t@CwŃt@C̃I[vvo܂B
+ * ̊֐͑Å֐ƂČĂяo܂B
+ * I[vIǂ CriMvFileReaderInterface::GetOpenStatus֐ + * Ń`FbNł悤ɂĂB
+ * CRI Movie Cu̓I[vIi CriMvFileReaderInterface::GetOpenStatus֐ + * ASYNC_STATUS_COMPLETEԂjOɁA[hAN[Y̗vĂяo”\܂B + * + * \sa CriMvFileReaderInterface::GetOpenStatus() + */ + /* pure */ virtual void Open(CriChar8 *fname)=0; + + /*EN + * \brief Closes a file asynchronously + * + * Initiates a file close request, and returns immediately.
+ * + * To determine success or failure, call CriMvFileReaderInterface::GetCloseStatus().
+ * + * \sa CriMvFileReaderInterface::GetCloseStatus() + */ + /*JP + * \brief t@C̃N[Y(A) + * + * I[vς݂̃t@C̃N[Yvo܂B
+ * ̊֐͑Å֐ƂČĂяo܂B
+ * N[YIǂ CriMvFileReaderInterface::GetCloseStatus() + * Ń`FbNł悤ɂĂB + * + * \sa CriMvFileReaderInterface::GetCloseStatus() + */ + /* pure */ virtual void Close(void)=0; + + /*EN + * \brief Reads from a file + * \param buffer Buffer to read into + * \param req_size Size of the buffer + * + * Initiates a file read request, and returns immediately.
+ * + * The buffer must be available and writable until the read request completes.
+ * + * To determine success or failure, call CriMvFileReaderInterface::GetReadStatus().
+ * + * To determine the number of bytes actually read, call CriMvFileReaderInterface::GetReadSize() + * after CriMvFileReaderInterface::GetReadStatus() has returned ASYNC_STATUS_COMPLETE. + * + * \remarks + * CRI Movie may call CriMvFileReaderInterface::Close() before + * CriMvFileReaderInterface::GetReadStatus() returns ASYNC_STATUS_COMPLETE. + * + * \sa CriMvFileReaderInterface::GetReadStatus(), CriMvFileReaderInterface::GetReadSize() + */ + /*JP + * \brief ǂݍݗviAj + * \param buffer oobt@̃|C^BǂݍݗvTCY𖞂̃obt@mۂĂKv܂B + * \param req_size ǂݍݗvTCYBPʂ̓oCgPʂłB + * + * t@C̓ǂݍݗvo܂B
+ * ̊֐͑Å֐ƂČĂяo܂B
+ * [hIǂ CriMvFileReaderInterface::GetReadStatus() + * Ń`FbNł悤ɂĂB
+ * CRI Movie Cu̓[hIi CriMvFileReaderInterface::GetReadStatus() + * ASYNC_STATUS_COMPLETEԂjOɁAN[YvĂяo”\܂B
+ * ̊֐͓ǂݍ񂾃TCYԂ܂B
+ * ǂݍݍς݃TCÝA CriMvFileReaderInterface::GetReadStatus() ASYNC_STATUS_COMPLETE + * ԂƂ CriMvFileReaderInterface::GetReadSize()ŕԂ悤ɎĂB + * + * \sa CriMvFileReaderInterface::GetReadStatus(), CriMvFileReaderInterface::GetReadSize() + */ + /* pure */ virtual void Read(CriUint8 *buffer, CriSint64 req_size)=0; + + /*EN + * \brief Gets asynchronous status of a call to CriMvFileReaderInterface::Open() + * + * \return Status of the call + * + * While the Open() call is in process, this will return ASYNC_STATUS_BUSY.
+ * If the call fails, this will return ASYNC_STATUS_ERROR.
+ * On success, this will return ASYNC_STATUS_COMPLETE.
+ * + * \sa CriMvFileReaderInterface::Open() + */ + /*JP + * \brief I[vR}h̏Ԏ擾 + * \return I[vR}h̏ԁB + * + * CriMvFileReaderInterface::Open֐̏Ԃ擾܂B + * + * \sa CriMvFileReaderInterface::Open() + */ + /* pure */ virtual CriMvFileReaderInterface::AsyncStatus GetOpenStatus(void)=0; + + /*EN + * \brief Gets asynchronous status of a call to CriMvFileReaderInterface::Close() + * + * \return Status of the call + * + * While the Close() call is in process, this will return ASYNC_STATUS_BUSY.
+ * If the call fails, this will return ASYNC_STATUS_ERROR.
+ * On success, this will return ASYNC_STATUS_COMPLETE.
+ * + * \sa CriMvFileReaderInterface::Close() + */ + /*JP + * \brief N[YR}h̏Ԏ擾 + * \return N[YR}h̏ԁB + * + * CriMvFileReaderInterface::Close֐̏Ԃ擾܂B + * + * \sa CriMvFileReaderInterface::Close() + */ + /* pure */ virtual CriMvFileReaderInterface::AsyncStatus GetCloseStatus(void)=0; + + /*EN + * \brief Gets asynchronous status of a call to CriMvFileReaderInterface::Read() + * + * \return Status of the call + * + * While the Read() call is in process, this will return ASYNC_STATUS_BUSY.
+ * If the call fails, this will return ASYNC_STATUS_ERROR.
+ * On success, this will return ASYNC_STATUS_COMPLETE.
+ * + * \sa CriMvFileReaderInterface::Read() + */ + /*JP + * \brief [hR}h̏Ԏ擾 + * \return [hR}h̏ԁB + * + * CriMvFileReaderInterface::Read֐̏Ԃ擾܂B + * + * \sa CriMvFileReaderInterface::Read() + */ + /* pure */ virtual CriMvFileReaderInterface::AsyncStatus GetReadStatus(void)=0; + + /*EN + * \brief Gets the number of bytes read by a successful call to CriMvFileReaderInterface::Read() + * + * \return Number of bytes read + * + * Once CriMvFileReaderInterface::GetReadStatus() returns ASYNC_STATUS_COMPLETE, this + * function can be called to determine the number of bytes read by + * CriMvFileReaderInterface::Read().
+ * + * If no call to Read() has been made, this function will return 0.
+ * + * If called multiple times after completing the read, the same value will be returned each time. + * + * \sa CriMvFileReaderInterface::Read(), CriMvFileReaderInterface::GetReadStatus() + */ + /*JP + * \brief Oǂݍݗvɑ΂ǂݍ݊TCY + * \return ǂݍ݊TCYBPʂByteB + * + * O̓ǂݍݗvɑ΂ēǂݍ݊TCYԂ܂B + * ܂ǂݍ݂PxvĂȂꍇ͂OԂ܂B + * ǂݍ݊ɌJԂ̊֐Ăяoꂽꍇ́AׂēlԂ܂B + * + * \sa CriMvFileReaderInterface::Read(), CriMvFileReaderInterface::GetReadStatus() + */ + /* pure */ virtual CriSint64 GetReadSize(void)=0; + + /*EN + * \brief Seeks to a new position in the file + * + * \param size Number of bytes to seek relative to \a offset + * \param offset Starting position of seek + * \return The offset, in bytes, from the previous file position. + * + * If \a offset is SEEK_FROM_BEGIN, seeking will start from the beginning of the file.
+ * If \a offset is SEEK_FROM_CURRENT, seeking will start from the current file position.
+ * If \a offset is SEEK_FROM_END, seeking will start from the end of the file.
+ * + * \sa CriMvFileReaderInterface::SeekOrigin + */ + /*JP + * \brief V[N + * \param size V[NTCY + * \param offset V[N̊Jnʒu + * \return ۂɃV[NBBytePʁB + * + * \sa CriMvFileReaderInterface::SeekOrigin + * + */ + /* pure */ virtual CriSint64 Seek(CriSint64 size, CriMvFileReaderInterface::SeekOrigin offset)=0; + + /*EN + * \brief Gets the file size + * + * \return File size, in bytes + * + * This function can safely be called once CriMvFileReaderInterface::Open() has completed + * successfully. + * + * \sa CriMvFileReaderInterface::Open(), CriMvFileReaderInterface::GetOpenStatus() + */ + /*JP + * \brief t@CTCY̎擾 + * \return t@CTCY[byte]. + * + * ̊֐̓t@CI[v̏IɌĂяo܂B + * + * \sa CriMvFileReaderInterface::Open(), CriMvFileReaderInterface::GetOpenStatus() + */ + /* pure */ virtual CriSint64 GetFileSize(void)=0; + +protected: + virtual ~CriMvFileReaderInterface(void) {} +}; + +/*EN + * \brief Sound Interface Class for EasyPlayer + * \ingroup MDL_IF_SOUND + * + * \par + * A class derived from CriMvSoundInterface is required in order to play sound in CRI Movie. + * Pass an instance of this subclass to CriMvEasyPlayer::Create().
+ * + * If you do not need audio output, you can pass NULL instead. However, if you do, + * you can not use a movie timer of type MVEASY_TIMER_AUDIO. See CriMvEasyPlayer::SetMasterTimer() + * for more details.
+ * + * Sound data must be provided in either 32 or 16 bit PCM format. + * + * All functions are pure virtual. + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::SetMasterTimer(), CriMvEasyPlayer::TimerType + */ +/*JP + * \brief TEho̓C^tF[X + * \ingroup MDL_IF_SOUND + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::SetMasterTimer(), CriMvEasyPlayer::TimerType + */ +class CriMvSoundInterface +{ +public: + /*EN + * \brief The status of the Sound Module + * + * This is the return value of CriMvSoundInterface::GetStatus().
+ * + * After CriMvSoundInterface::Start() is called, the state transitions to MVEASY_SOUND_STATUS_EXEC.
+ * While the state is MVEASY_SOUND_STATUS_EXEC, the sound module calls the callback function + * to retrieve sound data as needed.
+ * When the EasyPlayer is stopped, or transits to MVEASY_STATUS_PLAYEND, + * CRI Movie will call CriMvSoundInterface::Stop(). Then, CRI Movie waits for + * CriMvSoundInterface::GetStatus() to return MVEASY_SOUND_STATUS_STOP, + * and calls CriMvSoundInterface::DestroyOutput(). + * + * \sa CriMvSoundInterface::GetStatus(), CriMvSoundInterface::Start(), + * CriMvSoundInterface::Stop(), CriMvSoundInterface::DestroyOutput() + */ + /*JP + * \brief TEhW[̏ + * + * TEhW[̏Ԃ\񋓌^łB
+ * CriMvEasyPlayer::GetStatus() ̊֐lłB
+ * CriMvSoundInterface::Start() ĂяoMVEASY_SOUND_STATUS_EXECԂɂȂ܂B
+ * MVEASY_SOUND_STATUS_EXECԂ̊Ԃ́ATEho̓W[̓R[obN֐Ăяo܂B
+ * CRI Movie Cu͍ĐI܂͍Đ~w󂯂ꍇA܂ CriMvSoundInterface::Stop()Ăяo܂B
+ * ̌ASTOPԂɂȂ̂҂Ă CriMvSoundInterface::DestroyOutput()Ăяo܂B + * + * \sa CriMvSoundInterface::GetStatus(), CriMvSoundInterface::Start(), + * CriMvSoundInterface::Stop(), CriMvSoundInterface::DestroyOutput() + */ + enum Status { + MVEASY_SOUND_STATUS_STOP, /*EN< No sound processing is happening. */ + /*JP< CRI Movie ̃TEho͂ĂȂ */ + MVEASY_SOUND_STATUS_EXEC, /*EN< Sound data is being retrieved and processed. */ + /*JP< CRI Movie ̃TEho͒ */ + MVEASY_SOUND_STATUS_ERROR, /*EN< An error has occurred. */ + /*JP< G[ */ + + /* Keep enum 4bytes */ + MVEASY_SOUND_STATUS_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /*EN + * \brief PCM audio data format + * + * CRI Movie only operates on PCM encoded data. Two formats are supported: 32 bit floating + * point values, and 16 bit integer values. + * + * Return one of these values from CriMvSoundInterface::GetPcmFormat(). + * According to the returned format, CRI Movie calls a SetCallback for the specified PCM format. + * + * \sa CriMvSoundInterface::GetPcmFormat(), CriMvSoundInterface::SetCallbackGetFloat32PcmData(), + * CriMvSoundInterface::SetCallbackGetSint16PcmData() + */ + /*JP + * \brief PCMf[^tH[}bg + * + * PCM̏o̓tH[}bgPcmFormat^Œ`ꂽꂩłȂ΂܂B
+ * EasyPlayer CriMvSoundInterface::GetPcmFormat()Ŏ擾łf[^^̂ݎgp܂B
+ * AvP[V͂̃NX̑SĂ̊֐Ȃ΂Ȃ̂ŁAgȂtH[}bg + * ̃R[obNo^֐̓J֐ƂĎĂB + * + * \sa CriMvSoundInterface::GetPcmFormat(), CriMvSoundInterface::SetCallbackGetFloat32PcmData(), + * CriMvSoundInterface::SetCallbackGetSint16PcmData() + */ + enum PcmFormat { + MVEASY_PCM_FLOAT32, /*EN< PCM data is in 32 bit floating point format. */ + /*JP< 32bit ^PCMtH[}bg */ + MVEASY_PCM_SINT16, /*EN< PCM data is in 16 bit integer format. */ + /*JP< 16bit ^PCMtH[}bg */ + + /* Keep enum 4bytes */ + MVEASY_PCM_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /*EN + * \brief Creates a sound output module + * \param heap Handle to a CriHeap object + * \param channel Number of sound channels (1 = monaural, 2 = stereo, 6 = 5.1ch) + * \param samplerate Sample rate of audio data (ex. 48000 = 48k) + * \return TRUE if the sound module was created successfully + * \return FALSE if there was an error + * + * Creates a CRI Movie sound output module and prepares it for use. Memory for the module + * is taken from the provided CriHeap object.
+ * + * CRI Movie calls this method once it has determined that a movie has an active audio track + * and has analyzed the number of channels (mono, stereo, 5.1ch, etc.) and the sample rate. + * + */ + /*JP + * \brief TEho͂̍쐬 + * \param heap nh + * \param channel o͂TEh̃`l (1=monaural, 2=stereo, 6=5.1ch) + * \param samplerate TvO[g (ex. 48k = 48000) + * \return 쐬ʁB̏ꍇTRUEAs̏ꍇFALSEԂ܂B + * + * TEho͂쐬܂B
+ * ̊֐ CRI Movie ĐTEh肵ƂɁÃTEh̃`l + * TvO[gƂĎs܂B + * + */ + /* pure */ virtual CriBool CreateOutput(CriHeap heap, CriUint32 channel, CriUint32 samplerate)=0; + + /*EN + * \brief Destroys the sound output module + * + * Deletes the sound output module that was created by + * CriMvSoundInterface::CreateOutput().
+ * + * CRI Movie calls this method once CriMvSoundInterface::GetStatus() returns MVEASY_SOUND_STATUS_STOP. + * + */ + /*JP + * \brief TEho͂̔j + * + * TEho͂j܂B
+ * ̊֐̓TEho͂ MVEASY_SOUND_STATUS_STOP ԂɂȂɌĂяo܂B + * + */ + /* pure */ virtual void DestroyOutput(void)=0; + + /*EN + * \brief Gets the PCM format of audio data + * \return The type of PCM format supported by this CriMvSoundInterface instance + * + * CRI Movie supports audio data in one of two PCM formats: 32 bit floating point (MVEASY_PCM_FLOAT32) + * or 16 bit integer (MVEASY_PCM_SINT16). EasyPlayer uses the return value from this method to + * determine which format is being used, and will call the appropriate callback function to retrieve + * data samples. + * + * \sa CriMvSoundInterface::PcmFormat + */ + /*JP + * \brief PCMf[^tH[}bg̎擾 + * \return CriMvSoundInterface gpPCMtH[}bgԂ܂B + * + * EasyPlayer͂̊֐ɂāAo͂PCMtH[}bg𔻒f܂B + * + * \sa CriMvSoundInterface::PcmFormat + */ + /* pure */ virtual PcmFormat GetPcmFormat(void)=0; + + /*EN + * \brief Sets the callback function for retrieving 32 bit floating point PCM sound samples + * \param func Function that is called when CriMvSoundInterface gets PCM data (32bit float) + * \param obj Pointer to user-specifed data, passed as the first argument to the callback + * + * Sets a function that CriMvSoundInterface will call when it needs audio data in 32 bit floating point + * PCM format. This callback function takes 4 arguments:
+ * + * - \a obj: The user-specified \a obj parameter passed to SetCallbackGetFloat32PcmData().
+ * - \a nch: The number of audio channels. Mono is 1, stereo is 2, 5.1 channel is 6.
+ * - \a pcmbuf: An array of buffers to hold the returned PCM data. There must be one element of + * this array for each channel.
+ * - \a req_nsmpl: The number of samples requested. Each buffer must be large enough to hold this + * many samples (i.e. \a nch * \a req_nsmpl). + * + * \remarks + * The maximum number of channels is CRIMV_PCM_BUFFER_MAX + * + * \sa CriMvSoundInterface::SetCallbackGetSint16PcmData() + */ + /*JP + * \brief 32bit`PCMf[^擾R[obN֐̓o^ + * \param func CriMvSoundInterface PCMf[^vۂɌĂтR[obN֐ + * \param obj R[obN֐sۂɑɎw肷IuWFNgϐ + * + * CriMvSoundInterface EasyPlayerPCMf[^vۂɌĂяoR[obN֐o^܂B + * R[obN֐͂S‚̈Ă܂B
+ * - "obj" ̓R[obN֐ŎgpIuWFNgłB + * R[obN֐Ăяoۂ́A֐o^Ɏw肳ꂽobjK̈ɓĂB
+ * - "nch" CriMvSoundInterface vI[fBĨ`lłBmȂ1BXeIȂ2B5.1chȂ6ƂȂ܂B
+ * - "pcmbuf" PCMf[^i[邽߂̃obt@|C^złB
+ * obt@̎̂ CriMvSoundInterface ŏĂBobt@̐"nch"ƓłȂ΂܂B
+ * - "req_nsmpl" CriMvSoundInterface vPCMf[^̍őTvłB
+ * "pcmbuf"Ŏw肵eobt@̂ɂ́ÃTv܂ĂvȂ̗̈KĂB
+ * + * o^ꂽR[obN֐Ăяo^C~O CriMvSoundInterface ̔CӂƂȂ܂B + * + * \sa CriMvSoundInterface::SetCallbackGetSint16PcmData() + */ + /* pure */ virtual void SetCallbackGetFloat32PcmData(CriUint32 (*func)(void *obj, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl), void *obj)=0; + + /*EN + * \brief Sets the callback function for retrieving 16 bit integer PCM sound samples + * \param func Function that will be called when 16 bit integer PCM data is needed + * \param obj Pointer to user-specifed data, passed as the first argument to the callback + * + * Sets a function that CriMvSoundInterface will call when it needs audio data in 16 bit integer + * PCM format. This callback function takes 4 arguments:
+ * + * - \a obj: The user-specified \a obj parameter passed to SetCallbackGetSint16PcmData().
+ * - \a nch: The number of audio channels. Mono is 1, stereo is 2, 5.1 channel is 6.
+ * - \a pcmbuf: An array of buffers to hold the returned PCM data. There must be one element of + * this array for each channel.
+ * - \a req_nsmpl: The number of samples requested. Each buffer must be large enough to hold this + * many samples (i.e. \a nch * \a req_nsmpl). + * + * \remarks + * The maximum number of channels is CRIMV_PCM_BUFFER_MAX (currently 8) + * + * \sa CriMvSoundInterface::SetCallbackGetFloat32PcmData() + */ + /*JP + * \brief 16bit`PCMf[^擾R[obN֐̓o^ + * \param func CriMvSoundInterface PCMf[^vۂɌĂтR[obN֐ + * \param obj R[obN֐sۂɑɎw肷IuWFNgϐ + * + * PCMtH[}bgႤȊÓA CriMvSoundInterface::SetCallbackGetFloat32PcmData() ƓłB + * + * \sa CriMvSoundInterface::SetCallbackGetFloat32PcmData() + */ + /* pure */ virtual void SetCallbackGetSint16PcmData(CriUint32 (*func)(void *obj, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl), void *obj)=0; + + /*EN + * \brief Starts sound output + * + * CRI Movie will call this method when it needs to start playing sound. The PCM data callback function + * has to be called after this function until movie playback is finished.
+ * + * Your sound module should begin incrementing its playback time when this method is called. + * + * \remarks + * On success, this should set the status to CriMvSoundInterface::MVEASY_SOUND_STATUS_EXEC. + */ + /*JP + * \brief TEho͂̊Jn + * + * TEho͂Jn܂BPCMf[^擾pR[obN֐́A{֐̌ďoォsĂB + */ + /* pure */ virtual void Start(void)=0; + + /*EN + * \brief Stops sound output + * + * CRI Movie will call this when the movie playback stops, or the status changes to MVEASY_STATUS_PLAYEND.
+ * + * When EasyPlayer wants to pause and restart playback, it will call CriMvSoundInterface::Pause() + * instead of this method.
+ * + * Your sound module should set its playback time to 0 when this method is called. + * + * \remarks + * This should set the status to CriMvSoundInterface::MVEASY_SOUND_STATUS_STOP. + * + * \sa CriMvSoundInterface::Pause(), CriMvSoundInterface::Start() + */ + /*JP + * \brief TEho͂̒~ + * + * TEho͂~܂BĊJł悤ɂKv͂܂B
+ * EasyPlayerĊJsꍇ́A{֐ł͂ȂA CriMvSoundInterface::Pause()Ăяo܂B
+ * CriMvSoundInterface::Stop() ďóAR[obN֐Ă΂Ȃ悤ɎĂB + * + * \sa CriMvSoundInterface::Pause(), CriMvSoundInterface::Stop() + */ + /* pure */ virtual void Stop(void)=0; + + /*EN + * \brief Gets status of sound module + * \return The module status + * + * This must return one of the enumerated values in CriMvSoundInterface::Status.
+ * + * While this method returns CriMvSoundInterface::MVEASY_SOUND_STATUS_EXEC, EasyPlayer will call the + * PCM data callback.
+ * When a movie has finished playing and this method returns CriMvSoundInterface::MVEASY_SOUND_STATUS_STOP, + * EasyPlayer will call CriMvSoundInterface::DestroyOutput(). + * + * \sa CriMvSoundInterface::Status + */ + /*JP + * \brief TEhW[̏Ԏ擾 + * + * TEhW[̏Ԃ擾܂B + * + * \sa CriMvSoundInterface::Status + */ + /* pure */ virtual Status GetStatus(void)=0; + + /*EN + * \brief Pauses or resumes sound output + * \param sw Pause or resume playback. + * + * If \a sw is 1 (ON), output will be paused.
+ * If \a sw is 0 (OFF), output will be resumed.
+ * + * Temporarily pauses or resumes sound output.
+ * + * When you pause sound output, you must pause your playback timer as well. + */ + /*JP + * \brief TEho͂̈ꎞ~܂͍ĊJ + * \param sw |[YXCb`B|[YON̏ꍇ1A|[YOFF(W[)̏ꍇ0w肵܂B + * + * {֐͈̓Ɉˑ܂B
+ * sw ON(1)ȂAꎞ~B sw OFF(0)ȂTEho͍ĊJłB + */ + /* pure */ virtual void Pause(CriBool sw)=0; + + /*EN + * \brief Gets the time, in seconds, that sound has been playing + * \param count Playback time counter + * \param unit Counter increment per second + * + * CRI Movie calls this method periodically for some damn reason.
+ *
+ * The time, in seconds, is specified by \a count / \a unit.
+ * + * For example, if \a count was 500 and \a unit was 1000, that would be 0.5 seconds.
+ * + * \remarks + * Before Start() is called, and after Stop() is called, \a count should be 0. + */ + /*JP + * \brief Đ̎擾 + * \param count ^C}JEg + * \param unit Pb̃^C}JEglBcount unit ŕbPʂ̎ƂȂ܂B + * + * ^C}擾܂Bcountunit̓‚̕ϐŕ\܂B
+ * count unit ŕbPʂ̎ƂȂ悤ȒlԂ܂B
+ * ĐJnOi CriMvSoundInterface::Start()ĂяoOj + * Đ~i CriMvSoundInterface::Stop()Ăяoj́AOi^C}JEgOjԂ܂B + */ + /* pure */ virtual void GetTime(CriUint64 &count, CriUint64 &unit)=0; // sec = count / unit. + +protected: + virtual ~CriMvSoundInterface(void) {} +}; + +/*EN + * \brief System Timer Interface Class for EasyPlayer + * \ingroup MDL_IF_TIMER + * + * If you want to synchronize video frames with something other than the audio track, or if you + * need to play a movie that does not have an audio track, you will need to pass an instance of + * a class derived from CriMvSystemTimerInterface to CriMvEasyPlayer::Create().
+ * + * If you do not need any special timer facilities, you can pass NULL to CriMvEasyPlayer::Create() instead.
+ * + * All functions are pure virtual. + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::SyncMasterTimer() + */ +/*JP + * \brief VXe^C}[C^tF[X for EasyPlayer + * \ingroup MDL_IF_TIMER + * + * VXe^C}[͉[rĐɁArfIt[̑o^C~O𒲐邽߂Ɏgp܂B
+ * ̃NX`邱ƂŁAÕ^C}VXegEasyPlayer̃Xg[~OД\ɂȂ܂B
+ * SĂ̊֐͏z֐ƂĒ`Ă̂ŁASĂ̊֐KĂB + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::SyncMasterTimer() + */ +class CriMvSystemTimerInterface +{ +public: + /*EN + * \brief Starts timer and resets it to 0 + * + * When this method is called, your internal counter should initialize itself to 0 and start + * normal operation. + */ + /*JP + * \brief ^C}Jn + * + * ^C}̃JEgJn܂B̊֐Ă΂ꂽOƂȂ܂B + */ + /* pure */ virtual void Start(void)=0; + + /*EN + * \brief Stops the timer and resets it to 0 + * + * When this method is called, your internal counter should stop incrementing, and re-initialize + * itself to 0. After this method has been called, CriMvSystemTimerInterface::GetTime() must + * return a time of 0 seconds. + */ + /*JP + * \brief ^C}~ + * + * ^C}̃JEg~܂B̊֐Ă΂ꂽƂɁÃ^C}ĊJ邱Ƃ͂܂B + */ + /* pure */ virtual void Stop(void)=0; + + /*EN + * \brief Pauses or resumes the timer + * + * \param sw Pause or resume timer operation. + * + * If \a sw is 1 (ON), the timer will be paused.
+ * If \a sw is 0 (OFF), the timer will be resumed.
+ * + * Temporarily pauses or resumes the timer.
+ * + * When you pause the timer, you must maintain the previous value of the counter. + */ + /*JP + * \brief ^C}̈ꎞ~܂͍ĊJ + * \param sw |[YXCb`BON(1)Ȃꎞ~AOFF(0)ȂĊJB + * + * {֐͈̓Ɉˑ܂B
+ * sw ON(1)ȂAꎞ~B sw OFF(0)Ȃ^C}JEgĊJłB + */ + /* pure */ virtual void Pause(CriBool sw)=0; + + /*EN + * \brief Gets the time, in seconds, that the timer has been running + * + * \param count Timer counter + * \param unit Counter increment per second + * + * CRI Movie calls this method periodically to synchronize video playback with the + * movie's internal framerate.
+ *
+ * The time, in seconds, is specified by \a count / \a unit.
+ * + * For example, if \a count was 500 and \a unit was 1000, that would be 0.5 seconds.
+ * + * \remarks + * Before Start() is called, and after Stop() is called, \a count should be 0. + */ + /*JP + * \brief oߎ̎擾 + * \param count ^C}JEg + * \param unit Pb̃^C}JEglBcount unit ŕbPʂ̎ƂȂ܂B + * + * ^C}擾܂Bcountunit̓‚̕ϐŕ\܂B
+ * count unit ŕbPʂ̎ƂȂ悤ȒlԂ܂B
+ * ĐJnOi CriMvSystemTimerInterface::Start()ĂяoOj + * Đ~i CriMvSystemTimerInterface::Stop()Ăяoj́AOi^C}JEgOjԂ܂B + */ + /* pure */ virtual void GetTime(CriUint64 &count, CriUint64 &unit)=0; + +protected: + virtual ~CriMvSystemTimerInterface(void) {} +}; + + +/*EN + * \brief EasyPlayer Interface class for CRI Movie + * \ingroup MDL_EASY_PLAYER + */ +/*JP + * \brief EasyPlayerC^tF[X + * \ingroup MDL_EASY_PLAYER + */ +class CriMvEasyPlayer : public CriAllocator +{ +public: + /*EN + * \brief The possible states an EasyPlayer handle can be in. + * + * An EasyPlayer handle takes on various states, depending on where it is in the decoding process. + * You can check the status of a valid EasyPlayer handle at any time by calling CriMvEasyPlayer::GetStatus(). + * + * An EasyPlayer handle is created in the MVEASY_STATUS_STOP state. During movie playback, the status + * transitions through various states from MVEASY_STATUS_STOP to MVEASY_STATUS_PLAYEND. + * + * An application does not need to check all states. At a minimum, it only needs to check for + * MVEASY_STATUS_STOP, MVEASY_STATUS_PLAYING, MVEASY_STATUS_PLAYEND, + * and MVEASY_STATUS_ERROR. + * + * If an application calls CriMvEasyPlayer::DecodeHeader(), the status of the EasyPlayer handle will change to + * MVEASY_STATUS_WAIT_PREP when CRI Movie has finished analyzing the movie information. The EasyPlayer + * handle will remain in this state until the application calls CriMvEasyPlayer::Prepare() or + * CriMvEasyPlayer::Start(). Once the state has changed to MVEASY_STATUS_WAIT_PREP, information + * about the movie can be retrieved by calling CriMvEasyPlayer::GetMovieInfo(). + * + * If an application calls CriMvEasyPlayer::Prepare(), the EasyPlayer handle status will change to + * MVEASY_STATUS_READY once CRI Movie has finished buffering enough input and decoded output for playback. + * The handle will remain in this state until CriMvEasyPlayer::Start() is called. This allows the application + * to better control playback timing, since a movie can immediately start playing. + * + * Once CriMvEasyPlayer::Start() is called and the movie is actively playing, the status will alternate + * between MVEASY_STATUS_PLAYING and MVEASY_STATUS_PREP, as CRI Movie plays back frames and decodes + * new ones. + * + * When the movie has finished playing normally, the status of the EasyPlayer handle will automatically change + * to MVEASY_STATUS_PLAYEND. If the movie is in looping mode, however, once the movie reaches the + * end, it will start playing from the beginning and the status will not change to MVEASY_STATUS_PLAYEND. + * + * When CriMvEasyPlayer::Stop() is called, the status of the handle will change to MVEASY_STATUS_STOP + * once it has finished any decoding and playback that is in progress. This does not happen immediately, + * but will take a few cycles. + * + * If there are any problems during playback, for instance insufficient memory or invalid input data, the + * status will change to MVEASY_STATUS_ERROR. When the handle is in state MVEASY_STATUS_ERROR, + * the application must call CriMvEasyPlayer::Stop() and wait until the state changes to MVEASY_STATUS_STOP + * before doing anything else with the handle. + * + * Once the state is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, the handle can be deleted by + * calling CriMvEasyPlayer::Destroy(). + * + * \attention + * As of CRI Movie version 2.00, the handling of the MVEASY_STATUS_ERROR state has changed. Previously, + * a handle could be destroyed when it was in the MVEASY_STATUS_ERROR state. Now, an application + * must call CriMvEasyPlayer::Stop() and wait for the MVEASY_STATUS_STOP state before destroying + * the handle. + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::Start(), CriMvEasyPlayer::DecodeHeader(), + * CriMvEasyPlayer::Prepare(), CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::Stop(), + * CriMvEasyPlayer::Destroy() + */ + /*JP + * \brief EasyPlayernh + * + * EasyPlayer ̃nhԂłB + * nhԂ CriMvEasyPlayer::GetStatus() ł‚ł擾邱Ƃo܂B
+ * nh쐬 MVEASY_STATUS_STOP ԂłB + * + * nhԂ MVEASY_STATUS_STOP MVEASY_STATUS_PLAYEND ܂ŏɑJڂĂ܂B
+ * AvP[V[rĐɂāAK̑SĂ̏Ԃ`FbNKv͂܂B
+ * ŒAMVEASY_STATUS_STOP, MVEASY_STATUS_PLAYING, MVEASY_STATUS_PLAYEND, MVEASY_STATUS_ERROR + * `FbN΁A[r̍ĐsƂł܂B + * + * EasyPlayer nh쐬A[r̉𑜓xȂǂɊm肵Ăꍇ́AAvP[V + * CriMvEasyPlayer::Start() 𒼐ڌĂяoƂł܂B̏ꍇAnhԂ͎I + * MVEASY_STATUS_PLAYEND ܂őJڂĂ܂B + * + * ŏ CriMvEasyPlayer::DecodeHeader() Ăяoꍇ́Awb_͂IƃnhԂ + * MVEASY_STATUS_WAIT_PREP ƂȂAAvP[V CriMvEasyPlayer::Prepare() ܂ + * CriMvEasyPlayer::Start() Ă΂܂őҋ@܂B + * + * MVEASY_STATUS_WAIT_PREPԈȍ~A CriMvEasyPlayer::GetMovieInfo() Ń[r擾邱Ƃł܂B
+ * CriMvEasyPlayer::Prepare() Ăяoꍇ́Awb_͂уf[^̃obt@OIƁA + * nhԂ MVEASY_STATUS_READY ƂȂAAvP[V CriMvEasyPlayer::Start() + * Ă΂܂őҋ@܂BɂčĐJñ^C~O𒲐邱Ƃł܂B + * + * ĐIƎI MVEASY_STATUS_PLAYEND ɂȂ܂B + * + * CriMvEasyPlayer::Stop() Ăяoꍇ́AfR[_̒~IƂ MVEASY_STATUS_STOP + * ԂɂȂ܂B CriMvEasyPlayer::Stop() Iɒ~ԂɂȂƂ͌܂B + * + * sf[^G[Ȃlj炩̖肪ꍇ MVEASY_STATUS_ERROR ԂƂȂ܂B
+ * MVEASY_STATUS_ERROR ԂɂȂꍇ CriMvEasyPlayer::Stop() ĂяoănhԂ + * MVEASY_STATUS_STOP ԂɑJڂĂB
+ * + * CriMvEasyPlayer::Destroy() MVEASY_STATUS_STOP, MVEASY_STATUS_PLAYEND + * ꂩ̏Ԃ̎̂݌ĂяoƂł܂B + * + * \attention + * CRI Movie Ver.2.00 MVEASY_STATUS_ERROR Ԃɂ‚Ă̎dlύXɂȂ܂B
+ * MVEASY_STATUS_ERROR ԂŃnhjoȂȂA CriMvEasyPlay::Stop() ĂяoKv܂B + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::Start(), CriMvEasyPlayer::DecodeHeader(), + * CriMvEasyPlayer::Prepare(), CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::Stop(), + * CriMvEasyPlayer::Destroy() + */ + enum Status { + MVEASY_STATUS_STOP, /*EN< Standstill. No processing is happening. + * EasyPlayer handles are created in this state. */ + /*JP< ~ */ + MVEASY_STATUS_DECHDR, /*EN< The EasyPlayer handle is now parsing the movie header, + * including information about the width and height of the video stream. */ + /*JP< wb_͒ */ + MVEASY_STATUS_WAIT_PREP, /*EN< The EasyPlayer handle is a waiting for the work buffer to be allocated. */ + /*JP< obt@OJnҋ@ */ + MVEASY_STATUS_PREP, /*EN< The EasyPlayer handle is now buffering video and audio data. */ + /*JP< Đ */ + MVEASY_STATUS_READY, /*EN< Ready to start playback. */ + /*JP< Đҋ@ */ + MVEASY_STATUS_PLAYING, /*EN< The decoders are currently decoding and playing output. */ + /*JP< Đ */ + MVEASY_STATUS_PLAYEND, /*EN< The end of the movie has been reached. */ + /*JP< ĐI */ + MVEASY_STATUS_ERROR, /*EN< An error has occurred. */ + /*JP< G[ */ + + /* Keep enum 4bytes */ + MVEASY_STATUS_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /*EN + * \brief Supported timer types; used to synchronize video frames. + */ + /*JP + * \brief ^C} + */ + enum TimerType { + MVEASY_TIMER_NONE, /*EN< No synchronization. The output is available as soon as + * each frame is decoded. */ + /*JP< rfIt[͎܂BfR[hIt[ + * ͂Ɏ擾邱Ƃł܂B */ + MVEASY_TIMER_SYSTEM, /*EN< Video frames synchronize to the system timer.
+ * You must provide an instance of CriMvSystemTimerInterface to + * CriMvEasyPlayer::Create(). */ + /*JP< rfIt[̓VXeɓ܂BVXe̓AvP[V + * CriMvSystemTimerInterface ƂCriMvEasynhɐݒ肷Kv܂B */ + MVEASY_TIMER_AUDIO, /*EN< Video frames synchronize with the movie's audio data.
+ * You must provide an instance of CriMvSoundInterface to CriMvEasyPlayer::Create().
+ * If the movie does not have audio, video frames will synchronize with the system timer. */ + /*JP< rfIt[̓[r̃I[fBIɓ܂B + * AvP[V GetTime֐܂ CriMvSoundInterface CriMvEasy + * nhɐݒ肷Kv܂B[rf[^ɃI[fBI܂܂ + * Ȃꍇ́ArfI̓VXeɓ܂B */ + + /* Keep enum 4bytes */ + MVEASY_TIMER_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /*EN + * \ingroup MODULE_INIT + * + * \brief Creates an EasyPlayer handle + * + * \param heap Handle to a CriHeap object + * \param freader File input interface + * \param stimer System timer interface + * \param sound Sound module interface + * \param err Optional error code + * + * \return A valid CriMvEasyPlayer handle, or NULL if the handle cannot be allocated + * + * Creates and initialize a new EasyPlayer handle. Its status is initially MVEASY_STATUS_STOP. + * Memory for the handle is allocated from the provided CriHeap object. + * + * If memory allocation fails, this function will return NULL. Be sure to initialize and create + * your heap with criHeap_Initialize() and criHeap_Create() before calling this function. + * + * \remarks + * CriMv::Initialize() must be called before calling this function. + * + */ + /*JP + * \ingroup MODULE_INIT + * \brief EasyPlayernh̍쐬 + * \param heap CriHeapnh + * \param freader t@Cǂݍ݃C^tF[X + * \param stimer VXe^C}C^tF[X + * \param sound TEhC^tF[X + * \param err G[ + * \return CriMvEasynhԂ܂BG[ꍇ́ANULLԂ܂B + * + * {֐ CriMv::Initialize() ĂяoɎsĂB
+ * nh쐬̓nhԂMVEASY_STATUS_STOPƂȂ܂B
+ * nhmۂɕKvȃ͑SāAœnꂽ CriHeap gĊmۂ܂B
+ * sȂǂŃG[ꍇ́A{֐NULLԂ܂B + * + */ + static CriMvEasyPlayer* CRIAPI Create(CriHeap heap, + CriMvFileReaderInterface *freader, + CriMvSystemTimerInterface *stimer, + CriMvSoundInterface *sound, + CriError &err=CriMv::ErrorContainer); + /*EN + * \ingroup MODULE_INIT + * \brief Destroy a handle + * \param err Optional error code + * + * \ingroup MODULE_INIT + * + * \brief Destroys an EasyPlayer handle + * \param err Optional error code + * + * Destroys an EasyPlayer handle previously created with CriMvEasyPlayer::Create(), and frees its resources. + * + * An EasyPlayer handle can only be destroyed when it is in the MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND state. + * Attempting to destroy a handle when it is in any other state will cause an error. + * + * Any work buffers allocated via CriHeap, if still associated with the handle, are freed by this call. + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::Status, CriMvEasyPlayer::GetStatus() + */ + /*JP + * \ingroup MODULE_INIT + * \brief EasyPlayernh̔j + * \param err G[iȗj + * + * CriMvEasyPlayer::Create()ō쐬EasyPlayernhj܂B + * + * nhԂ MVEASY_STATUS_STOP A MVEASY_STATUS_PLAYEND ̎ɂ̂݃nhj邱Ƃł܂B
+ * ȊȌԂŌĂяoꍇ́AG[ɂȂ܂B
+ * + * nhԂ MVEASY_STATUS_ERROR ꍇ́ACriMvEasyPlayer::Stop() Ăяo + * MVEASY_STATUS_STOP ԂɂȂĂnhjĂB
+ * nhԂ CriMvEasyPlayer::GetStatus() ŊmF邱Ƃł܂B + * + * nh쐬Ɏw肵CriHeapɂĊmۂꂽŖ̑SẮA + * ̊֐̌Ăяoɂĉ܂B + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::Status, CriMvEasyPlayer::GetStatus() + */ + void Destroy(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_BASIC + * + * \brief Returns status of an EasyPlayer handle. + * \param err Optional error code + * \return Handle status + * + * Returns the current status of an EasyPlayer handle. The status will be one of the values + * defined by CriMvEasyPlayer::Status. + * + * \sa CriMvEasyPlayer::Status + */ + /*JP + * \ingroup MODULE_BASIC + * \brief nhԂ̎擾 + * \param err G[iȗj + * \return nh CriMvEasyPlayer::Status + * + * nhԂ擾܂B + * + * \sa CriMvEasyPlayer::Status + */ + Status GetStatus(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_BASIC + * + * \brief Executes heatbeat functions for an EasyPlayer handle + * \param err Optional error code + * + * Performs regular processing for an EasyPlayer handle, including handoff and parsing of input + * buffers, and audio decoding. Additionally, it checks for situations where the handle state + * should change to one of the values defined by CriMvEasyPlayer::Status, and changes state as + * necessary. + * + * This function and CriMvEasyPlayer::ExecuteDecode() should be called periodically during movie + * playback or when waiting for CriMvEasyPlayer::DecodeHeader() to complete. It takes a relatively + * low CPU load, and should typically be called on every vertical blank. + * + * \remarks + * Note that this function does not perform any video decoding. Decoding is done in + * CriMvEasyPlayer::ExecuteDecode(). + * + * \sa CriMvEasyPlayer::Status, CriMvEasyPlayer::ExecuteDecode(), CriMvEasyPlayer::DecodeHeader() + */ + /*JP + * \ingroup MODULE_BASIC + * \brief EasyPlayerT[o֐ + * \param err G[iȗj + * + * [r̃wb_͂̓obt@AI[fBIfR[hs܂B
+ * EasyPlayer nh̏ԑJڂ̊֐ōs܂B
+ * ̊֐̓rfĨfR[h͍s܂B̂CPUׂ͂܂荂Ȃ܂B
+ * {֐̓AvP[ṼC[vŖĂяo悤ɂĂB + * + * \sa CriMvEasyPlayer::Status + */ + void Update(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_BASIC + * + * \brief Synchronizes the master timer of an EasyPlayer handle. + * \param err Optional error code + * + * Synchronizes the timing of video frames to the master timer used by this EasyPlayer handle. + * If the master timer is of type MVEASY_TIMER_AUDIO and the movie does not have audio, + * EasyPlayer will use the system timer that was set when the handle was created. + * + * \sa CriMvEasyPlayer::TimerType, CriMvEasyPlayer::SetMasterTimer(), CriMvSystemTimerInterface + */ + /*JP + * \ingroup MODULE_BASIC + * \brief }X^^C}ւ̓ + * \param err G[iȗj + * + * [rĐ}X^^C}ɓ܂B
+ * }X^^C} CriMvEasyPlayer::SetMasterTimer() ɂĎw肳ꂽ^C}g܂B
+ * ^C}ʂƂ MVEASY_TIMER_AUDIO w肳ĂāAĐ郀[rɃI[fBI + * ܂܂ĂȂꍇ́Anh쐬̃VXe^C}gp܂B + * + * ̊֐́Anh쐬Ɏw肵VXe^C}C^tF[X + * CriMvSystemTimerInterface::GetTime() Ăяo܂B + * + * \sa CriMvEasyPlayer::TimerType, CriMvEasyPlayer::SetMasterTimer(), CriMvSystemTimerInterface + */ + void SyncMasterTimer(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_BASIC + * + * \brief Decodes a video frame + * \param err Optional error code + * \return \a TRUE If the movie is currently in a playback state + * \return \a FALSE If the movie is not playing + * + * Performs the actual video decoding. Each call to this function decodes a single frame. + * It does not return until the frame has been decoded. + * + * Video decoding can impose a very heavy CPU load, so calling this function from an application's + * main thread may cause your application to miss the vertical blank interval. To avoid this situation, + * ExecuteDecode() can be called from a separate, lower-priority thread. See the Mutithreaded Decoding + * tutorial for a full explanation. + * + * The return value describes the movie playback state. If TRUE, the movie is currently playing + * (or decoding the movie header) or ready to play. If FALSE, playback has not yet been started, + * or playback has finished. + * + * If a decoding thread is used, an application must wait until this function returns FALSE before destroying + * the thread. Otherwise, the handle state will not transition to MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, + * and the EasyPlayer handle cannot be destroyed. + * + * \attention + * ExecuteDecode() is the only CRI Movie function that is safe to call from a separate thread. + * No other CRI Movie functions should be considered to be thead-safe. + * + */ + /*JP + * \ingroup MODULE_BASIC + * \brief rfIfR[h + * \param err G[iȗj + * \return [rĐTRUE AĐI܂~FALSEԂ܂B + * + * rfIf[^̃fR[hs܂B
+ * {֐͂PsN`̃fR[hI܂ŏI܂B
+ * sN`fR[hׂ͕̍Ȃ̂ŁAAvP[ṼCXbhĂяoƏ”\܂B
+ * ̏ꍇ́ACXbhDx̒ႢʃXbhĂяo悤ɂĂB + * + * {֐̕ԂĺA[rĐ̎sǂ\Ă܂B
+ * fR[hpXbhIꍇ́AԂlFALSEɂȂ̂҂Ȃ΂܂B
+ * ԂlTRUE̊ԂɃfR[hXbhIĂ܂ƁAnh̏Ԃ MVEASY_STATUS_STOP + * MVEASY_STATUS_PLAYEND ɑJڂłAnhjoȂȂ܂B
+ * + */ + CriBool ExecuteDecode(CriError &err=CriMv::ErrorContainer); + + /* Đ */ + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Sets the name of the movie file to play + * \param fname Name of the movie file + * \param err Optional error code + * + * Sets the name of the movie file to play, but does not open the file. The length of the filename + * (including path) is limited to CRIMV_MAX_FILE_NAME characters. EasyPlayer copies this + * string to internal memory, so a temporary variable can be used. + * + * If an application plays the same movie repeatedly, it only needs to call this function once. + * + * Multiple calls to this function will overwrite previous values. Calling CriMvEasyPlayer::SetData() + * will clear any filename set by this function. + * + * \remarks + * This function can only be called when the handle status is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, + * or from the file request callback. See CriMvEasyPlayer::SetFileRequestCallback() for details. + * + * \remarks + * Calling this function does not open the file. The file is opened by a call to CriMvEasyPlayer::Update(). + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetData() + */ + /*JP + * \ingroup MODULE_CONTROL + * + * \brief Đt@C̎w + * \param fname [rt@CpX + * \param err G[iȗj + * + * Đ郀[r̃t@CpXݒ肵܂Bt@CpX̍ő咷 CRIMV_MAX_FILE_NAME oCgłB
+ * EasyPlayer͓ł̃t@CpXRs[̂ŁAœn͔jĂ܂܂B + * + * t@CJԂĐꍇ́Å֐ēxĂяoKv͂܂B + * + * ̊֐Ăяoɂx̊֐ĂяoƁAÕt@C͐Vt@Cɏ㏑܂B + * CriMvEasyPlayer::SetData()֐Ăяoꍇ́AOɐݒ肵t@C񂪃NA܂B + * + * \para l1F + * ̊֐̓nhԂ MVEASY_STATUS_STOP MVEASY_STATUS_PLAYEND̂݌Ăяo”\łB + * ܂̓t@CvR[obN֐ł̊֐ĂяoƂł܂Bڍׂ CriMvEasyPlayer::SetFileRequestCallback()֐ + * QƂĂB + * + * \para l2F + * ̊֐̓ł̓t@C̃I[vv͂܂Bt@C̃I[v CriMvEasyPlayer::Update() ֐̒ōs܂B + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetData(), CriMvEasyPlayer::SetFileRange() + */ + void SetFile(CriChar8 *fname, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Sets in-memory movie data + * \param dataptr Pointer to movie data + * \param datasize Size of data, in bytes + * \param err Optional error code + * + * Sets the in-memory data buffer for this EasyPlayer handle to point to the provided buffer, + * but does not attempt to read that buffer. After this call, the memory pointed to by \a dataptr + * belongs to CRI Movie and must remain valid until playback is complete. + * + * If an application plays the same movie data repeatedly, it only needs to call this function once. + * + * Multiple calls to this function will overwrite previous values. Calling CriMvEasyPlayer::SetFile() + * will clear any pointer set by this function. + * + * \remarks + * This function can only be called when the handle status is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, + * or from the file request callback. See CriMvEasyPlayer::SetFileRequestCallback() for details. + * + * \remarks + * Calling this function does not attempt to reference the memory. The memory read is initiated by a call + * to CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start(). + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetFile(), CriMvEasyPlayer::SetFileRange() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief f[^̎w + * \param dataptr f[^|C^ + * \param datasize f[^TCY + * \param err G[iȗj + * + * ̊֐EasyPlayer̃nhԂMVEASY_STATUS_STOPMVEASY_STATUS_PLAYEND̎ɌĂяoĂB
+ * ܂́At@CvR[obN̓ŌĂяoƂł܂B
+ * + * {֐JԂĂяoꍇ́A͏㏑܂B
+ * CriMvEasyPlayer::SetFile()Ăяoꍇ́A{֐Ŏw肵̓nh܂B + * + * nhœ[rf[^JԂĐꍇ́A{֐̌Ăяo͏ȗ邱Ƃł܂B + * + * w肳ꂽ̈ɎۂɃANZX̂́A CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Prepare(), + * CriMvEasyPlayer::Start() ̂ꂩĂяoꂽȍ~łB
+ * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetFile(), CriMvEasyPlayer::SetFileRange() + */ + void SetData(CriUint8 *dataptr, CriUint32 datasize, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * \brief Set a pack file and pass offset and range of movie file to an EasyPlayer handle + * \param fname File name string pointer of the pack file + * \param offset offset in byte to movie data in the packing file [in bytes] + * \param range size of movie data from the offset in the packing file [in bytes] + * \param err Optional error code + * + * Sets the name of the pack file that contains the movie file to play. + * EasyPlayer tries to read data from 'offset' through 'range' in the pack file as the movie data. + * Passing a negative value as range, EasyPlayer reads data until the end of the pack file. + * + * The length of file name is limited until CRIMV_MAX_FILE_NAME. + * EasyPlayer handle copies the file name string into the handle. + * You can use a temporary variable as the file name string. + * + * If an application plays the same movie repeatedly, it only needs to call this function once. + * + * Multiple calls to this function will overwrite previous values. Calling CriMvEasyPlayer::SetData() + * will clear any filename set by this function. + * + * \remarks + * This function can only be called when the handle status is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, + * or from the file request callback. See CriMvEasyPlayer::SetFileRequestCallback() for details. + * + * \remarks + * Calling this function does not open the file. The file is opened by a call to CriMvEasyPlayer::Update(). + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetData(), CriMvEasyPlayer::SetFile() + */ + /*JP + * \ingroup MODULE_CONTROL + * + * \brief Đ[rt@C܂ރpbNt@C̎w + * \param fname pbNt@C (pX܂) + * \param offset pbNt@C̃[rf[^܂ł̃ItZbg (P: oCg) + * \param range pbNt@C̃[rf[^̃TCY (PʁFoCg) + * \param err G[iȗj + * + * Đ郀[r܂ރpbNt@Cw肵܂BŎw肵 offset ʒu range TCY܂łpbNt@CɊ܂܂郀[rf[^݂Ȃ܂B + * rangeɕl͂ƃpbNt@C̏I[܂ł[rƂēǂݍ݂܂B + * + * pbNt@C̃t@CpX̍ő咷 CRIMV_MAX_FILE_NAME oCgłB + * EasyPlayer͓ł̃t@CpXRs[̂ŁAœn͔jĂ܂܂B + * + * t@CJԂĐꍇ́Å֐ēxĂяoKv͂܂B + * + * ̊֐ĂяoɁAx̊֐ĂяoƁAÕt@C͐Vt@Cɏ㏑܂B + * CriMvEasyPlayer::SetData()֐Ăяoꍇ́AOɐݒ肵t@C񂪃NA܂B + * + * \para l1F + * ̊֐̓nhԂ MVEASY_STATUS_STOP MVEASY_STATUS_PLAYEND̂݌Ăяo”\łB + * ܂̓t@CvR[obN֐ł̊֐ĂяoƂł܂Bڍׂ CriMvEasyPlayer::SetFileRequestCallback()֐ + * QƂĂB + * + * \para l2F + * ̊֐̓ł̓t@C̃I[vv͂܂Bt@C̃I[v CriMvEasyPlayer::Update() ֐̒ōs܂B + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetData(), CriMvEasyPlayer::SetFile() + */ + void SetFileRange(CriChar8 *fname, CriUint64 offset, CriSint64 range, CriError &err=CriMv::ErrorContainer); + + /* Õ[rf[^xo^it@CvR[obN֐ł̂݌ĂԂƁj */ + void SetPreviousDataAgain(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Reads movie header and analyzes movie information + * \param err Optional error code + * + * This function opens the movie file, reads the header, and starts to analyze the movie data. + * It does not start movie playback. + * + * When this function is called, the handle status changes to MVEASY_STATUS_DECHDR. Once EasyPlayer + * has finished reading the header and analyzing the movie, the status changes to MVEASY_STATUS_WAIT_PREP. + * When the status is MVEASY_STATUS_WAIT_PREP, CriMvEasyPlayer::GetMovieInfo() can be successfully called. + * + * To continue playback, call CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start() when the handle status + * is MVEASY_STATUS_WAIT_PREP. + * + * \remarks + * This function can only be called when the handle status is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND. + * + * \remarks + * You must either call CriMvEasyPlayer::SetFile() or CriMvEasyPlayer::SetData(), or provide a file request + * callback with CriMvEasyPlayer::SetFileRequestCallback(), before calling this function. + * + * \remarks + * Once this function has been called, CriMvEasyPlayer::ExecuteDecode() and CriMvEasyPlayer::Update() must be + * called periodically in order for this function to have any effect. Otherwise, the handle status will + * never change. + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::Prepare(), CriMvEasyPlayer::Start(), + * CriMvEasyPlayer::SetFileRequestCallback(), + * CriMvEasyPlayer::ExecuteDecode(), CriMvEasyPlayer::Update() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief [rwb_ + * \param err G[iȗj + * + * [r̍Đ͊JnAwb_͂̂ݍsđҋ@邽߂̊֐łB
+ * ̊֐gpăwb_͂Oɍς܂邱ƂɂAĐJnOɃ[r̉𑜓xI[fBȈ + * 邱Ƃł܂B
+ * {֐ĂяoƁAEasyPlayer̃nhԂMVEASY_STATUS_STOP MVEASY_STATUS_DECHDR ƑJڂĂA + * wb_͂MVEASY_STATUS_WAIT_PREPƂȂ܂B
+ * [r擾ɂ́AnhԂMVEASY_STATUS_WAIT_PREPɂȂƂ CriMvEasyPlayer::GetMovieInfo() + * sĂB
+ * + * nhԂMVEASY_STATUS_WAIT_PREP̎ɁA CriMvEasyPlayer::Prepare() CriMvEasyPlayer::Start() + * ĂԂƂōĐ𑱂邱Ƃł܂B
+ * + * {֐ EasyPlayer̃nhԂMVEASY_STATUS_STOPMVEASY_STATUS_PLAYEND̎ɌĂяoĂB + * + * {֐ĂяoO CriMvEasyPlayer::SetFile() CriMvEasyPlayer::SetData() Ń[rf[^w肵ĂB
+ * At@CvR[obN֐o^Ăꍇ͎Õ[rf[^ݒ͏ȗ邱Ƃ܂B + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::Prepare(), CriMvEasyPlayer::Start(), CriMvEasyPlayer::SetFileRequestCallback() + */ + void DecodeHeader(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Reads movie header, analyzes movie information, and buffers data. + * \param err Optional error code + * + * This function opens the movie file and gets it ready for immediate playback, by reading and analyzing + * the header and decoding and buffering video data. It allows a movie to start playing immediately when + * CriMvEasyPlayer::Start() is called, without an initial delay. + * + * When this function is called, the handle status changes to MVEASY_STATUS_DECHDR. Once EasyPlayer + * has finished reading and analyzing the movie data, the status changes to MVEASY_STATUS_PREP and EasyPlayer + * begins decoding video data. When the initial video data has been decoded and buffered, the status changes to + * MVEASY_STATUS_READY. + * + * The amount of data that is buffered, in seconds, is based on the value set by CriMvEasyPlayer::SetBufferingTime(). + * By default, this is 1 second. + * + * When the status is MVEASY_STATUS_READY, movie playback will start imediately when CriMvEasyPlayer::Start() + * is called. + * + * \remarks + * Unless you CriMvEasyPlayer::DecodeHeader() first, this function can only be called when the handle status + * is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND. + * + * \remarks + * You must either call CriMvEasyPlayer::SetFile() or CriMvEasyPlayer::SetData(), or provide a file request + * callback with CriMvEasyPlayer::SetFileRequestCallback(), before calling this function. + * + * \remarks + * Once this function has been called, CriMvEasyPlayer::ExecuteDecode() and CriMvEasyPlayer::Update() must be + * called periodically in order for this function to have any effect. Otherwise, the handle status will + * never change. + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Start(), + * CriMvEasyPlayer::SetBufferingTime(), CriMvInputBufferInfo + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief Điwb_͂ƃobt@Oj + * \param err G[iȗj + * + * [r̍Đ͊JnAwb_͂ƍĐ݂̂sđҋ@邽߂̊֐łB
+ * ̊֐gpčĐOɍς܂邱ƂɂA[rĐJñ^C~Oׂ䂷邱Ƃł܂B
+ * iĐōĐJn֐Ăяoꍇ́AۂɍĐn܂܂łɃ^CO܂Bj
+ * {֐ĂяoƁAEasyPlayer̃nhԂMVEASY_STATUS_STOP MVEASY_STATUS_DECHDR MVEASY_STATUS_PREP ƑJڂĂA + * ĐMVEASY_STATUS_READYƂȂ܂B + * + * nhԂMVEASY_STATUS_READY̎ɁA CriMvEasyPlayer::Start() ĂԂƂōĐJn邱Ƃł܂B + * + * CriMvEasyPlayer::DecodeHeader() ̌Ăяoł̊֐Ăяoꍇ́ACriMvEasyPlayer̃nhԂ + * MVEASY_STATUS_STOPMVEASY_STATUS_PLAYEND łȂ΂܂B + * + * ĐJnOɂ CriMvEasyPlayer::SetFile() CriMvEasyPlayer::SetData() Ń[rf[^w肵ĂB
+ * At@CvR[obN֐o^Ăꍇ͎Õ[rf[^ݒ͏ȗ邱Ƃ܂B + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Start(), + * CriMvEasyPlayer::SetBufferingTime(), CriMvInputBufferInfo + */ + void Prepare(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Starts movie playback + * \param err Optional error code + * + * Opens the movie and starts playback. If CriMvEasyPlayer::Prepare() was not called, there will be a + * delay while the library reads the movie header and buffers the initial data. If CriMvEasyPlayer::Prepare() + * was called and the handle status is MVEASY_STATUS_READY, playback will start as soon as this function is called. + * + * \remarks + * If you call this function without calling CriMvEasyPlayer::DecodeHeader() or CriMvEasyPlayer::Prepare() + * first, this function can only be called when the handle status is MVEASY_STATUS_STOP, MVEASY_STATUS_PLAYEND, + * or MVEASY_STATUS_READY. + * + * \remarks + * You must either call CriMvEasyPlayer::SetFile() or CriMvEasyPlayer::SetData(), or provide a file request + * callback with CriMvEasyPlayer::SetFileRequestCallback(), before calling this function. + * + * \remarks + * Once this function has been called, CriMvEasyPlayer::ExecuteDecode() and CriMvEasyPlayer::Update() must be + * called periodically in order for this function to have any effect. Otherwise, the movie will not play and + * the handle status will never change. + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Prepare() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief ĐJn + * \param err G[iȗj + * + * [r̍ĐJn܂B
+ * CriMvEasyPlayer::Prepare()Ă΂ɁA{֐Ăяoꍇ́A[r̉͂ƍĐ̏s߁A + * ۂɃ[r̍Đn܂܂łɃ^CO܂B
+ * CriMvEasyPlayer::Prepare()ɌĂяoāAnhԂMVEASY_STATUS_READYɂȂĂ΁A + * ̊֐ĂяoĂɍĐn܂܂B + * + * CriMvEasyPlayer::DecodeHeader() ܂ CriMvEasyPlayer::Prepare() ̌Ăяoł̊֐Ăяoꍇ́A + * CriMvEasyPlayer̃nhԂ MVEASY_STATUS_STOPMVEASY_STATUS_PLAYEND łȂ΂܂B + * + * ĐJnOɂ CriMvEasyPlayer::SetFile() CriMvEasyPlayer::SetData() Ń[rf[^w肵ĂB
+ * At@CvR[obN֐o^Ăꍇ͎Õ[rf[^ݒ͏ȗ邱Ƃ܂B + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Prepare() + */ + void Start(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Stops movie playback; resets a handle that is in an ERROR state, + * \param err Optional error code + * + * Tells the movie to stop playing and returns immediately. Note that this does not actually stop playback; + * an application must continue to call CriMvEasyPlayer::Update() and CriMvEasyPlayer::ExecuteDecode() until + * the status changes to MVEASY_STATUS_STOP. + * + * Once the handle is in the MVEASY_STATUS_STOP state, it can be reused for a different movie. + * + * If the handle state is MVEASY_STATUS_ERROR, an application must call this function and wait for the status + * to change to MVEASY_STATUS_STOP before destroying or reusing the player handle. + * + * In principle, this function does not reset any EasyPlayer handle parameters that were explicitly set via + * any of the settings APIs, so an application can replay the same movie by simply calling CriMvEasyPlayer::Start() + * once the state has changed to MVEASY_STATUS_STOP. However, calling this function will reset the following + * parameters: + * + * - The pause state (see CriMvEasyPlayer::Pause()) will be reset to OFF (not paused). + * - If a file request callback has been set (via CriMvEasyPlayer::SetFileRequestCallback()), the movie + * data information will be reset. + * + * See the description of CriMvEasyPlayer::ResetAllParameters() for a comparison of the parameters that are + * affected by that function and by this function. + * + * \remarks + * This function may call CriMvSoundInterface::Stop() and CriMvFileReaderInterface::Close(). For an EasyPlayer + * handle to change to MVEASY_STATUS_STOP, the sound and file interfaces need to transition to their STOP states. + * In the case of CriMvSoundInterface, this means that CriMvSoundInterface::GetStatus() will return + * MVEASY_SOUND_STATUS_STOP. For CriMvFileReaderInterface, this means that CriMvFileReaderInterface::GetCloseStatus() + * will return ASYNC_STATUS_COMPLETE. + * + * \sa CriMvEasyPlayer::Status, CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::ResetAllParameters() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief Đ~^G[Ԃ̕A + * \param err G[iȗj + * + * [rĐ~̗vo܂B{֐͑A֐łB{֐őSĂ̒~s킯ł͂܂B
+ * {֐ďoAĐԂ MVEASY_STATUS_STOP Ȃ܂ł͒ʏ̃C[v𓮂ĂB
+ * ̓Iɂ CriMvEasyPlayer::Update(), CriMvEasyPlayer::ExecuteDecode() ʏʂĂяoKv܂B + * + * ĐԂ MVEASY_STATUS_ERROR ɂȂꍇ́A{֐Ăяo MVEASY_STATUS_STOP ҂ĂB
+ * + * for[vȂǂɂ郍[J[vŏԕύX҂Ă MVEASY_STATUS_STOP ɂ͂Ȃ܂B
+ * + * {֐ĂяoĂAAvP[VĐnhɐݒ肵ep[^͌ƂăZbg܂B
+ * MVEASY_STATUS_STOP ԂɂȂƁAxĐJnƑOƓp[^ōĐsƂł܂B
+ * OIɖ{֐ŃZbgp[^͈ȉ̂̂܂B + * - CriMvEasyPlayer::Pause() ɂ|[YԂ́AOFFɃZbg܂B + * - t@CvR[obN֐̓o^ꍇA[rt@Ci܂̓j̏̓Zbg܂B + * + * Zbgp[^ꗗ CriMvEasyPlayer::ResetAllParameters() ̐QƂĂB + * + * {֐͕Kvɉ CriMvSoundInterface::Stop() CriMvFileReaderInterface::Close() Ăяo܂B
+ * EasyPlayer nh MVEASY_STATUS_STOP ԂɂȂ邽߂ɂ́AeC^tF[X~ԂɂȂȂ΂܂B
+ * TEhC^tF[X̏ꍇA CriMvSoundInterface::GetStatus() MVEASY_SOUND_STATUS_STOP ԂƁB
+ * t@Cǂݍ݃C^tF[X̏ꍇA CriMvFileReaderInterface::GetCloseStatus() AASYNC_STATUS_COMPLETE + * ԂȂ΂܂B + * + * \sa CriMvEasyPlayer::Status, CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::ResetAllParameters() + */ + void Stop(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Pauses or resumes movie playback + * \param sw Pause state. ON (1) will pause playback, OFF (0) will resume it. + * \param err Optional error code + * + * Pauses or resumes movie playback, depending on the argument. If \a sw is ON (1), playback will be paused. + * If \a sw is OFF (0), playback will be resumed. + * + * \remarks + * This function will call CriMvSoundInterface::Pause() and CriMvSystemTimerInterface::Pause() with the + * provided argument. + * + * \remarks + * Calling CriMvEasyPlayer::Stop() or CriMvEasyPlayer::ResetAllParameters() will set the pause state to OFF. + * + * \sa CriMvSoundInterface::Pause(), CriMvSystemTimerInterface::Pause() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief Đ̈ꎞ~܂͍ĊJ + * \param sw |[YXCb`B|[YON̏ꍇ1A|[YOFF(W[)̏ꍇ0w肵܂B + * \param err G[iȗj + * + * {֐͈̓Ɉˑ܂B
+ * sw ON(1)ȂAꎞ~B sw OFF(0)ȂĐĊJłB + * + * CriMvEasyPlayer::Stop() ܂ CriMvEasyPlayer::ResetAllParameters Ăяoƃ|[YԂOFFɃZbg܂B + * + * ̊֐ CriMvSoundInterface::Pause() CriMvSystemTimerInterface::Pause() 𓯂ŌĂяo܂B + * + * \sa CriMvSoundInterface::Pause(), CriMvSystemTimerInterface::Pause() + */ + void Pause(CriBool sw, CriError &err=CriMv::ErrorContainer); + + CriBool IsPaused(CriError &err=CriMv::ErrorContainer); + + /* IvVݒ^擾 */ + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the type of timer used for video synchronization + * \param type Type of timer to use + * \param err Optional error code + * + * In order to display video frames at the proper rate, CRI Movie uses a timer to determine when the + * next frame should be shown. For a movie with an audio track, you would typically use the + * MVEASY_TIMER_AUDIO timer type. For a movie with no audio, the MVEASY_TIMER_SYSTEM type timer + * should be used. + * + * The default is the timer type that was passed to CriMvEasyPlayer::Create(). If this value + * was NULL, a system timer (MVEASY_TIMER_SYSTEM) will be used. + * + * \remarks + * If an audio timer (MVEASY_TIMER_AUDIO) is wanted, it must be created and passed to + * CriMvEasyPlayer::Create(). + * + * \remarks + * If the movie does not have an audio track, CRI Movie will use a MVEASY_TIMER_SYSTEM regardless of + * the value set by this function. + * + * \sa CriMvEasyPlayer::GetMasterTimer(), CriMvEasyPlayer::Create(), TimerType + */ + /*JP + * \ingroup MODULE_OPTION + * \brief }X^^C}ʂ̎w + * \param type }X^^C} + * \param err G[iȗj + * + * rfIt[̎ǗɎgp^C}ʂw肵܂B
+ * ftHg̓nh쐬Ɏw肷VXe^C}łB
+ * rfIt[̕\^C~OI[fBI̎ƓƂ̓I[fBI^C}w肵ĂB
+ * I[fBI^C}w肵ꍇłAĐ郀[rɃI[fBI܂܂ĂȂꍇ̓VXe^C}ƂȂ܂B + * + * \sa CriMvEasyPlayer::GetMasterTimer(), CriMvEasyPlayer::Create() + */ + void SetMasterTimer(TimerType type, CriError &err=CriMv::ErrorContainer); // default is SYSTEM + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Returns the type of timer currently being used by the EasyPlayer handle + * \param err Optional error code + * \return The current timer type + * + * Returns the current type of timer used to synchronize video frames. This value can be changed + * by calling CriMvEasyPlayer::SetMasterTimer(). Otherwise, the timer type is set when the handle + * is created. + * + * \sa CriMvEasyPlayer::SetMasterTimer(), CriMvEasyPlayer::Create(), TimerType + */ + /*JP + * \ingroup MODULE_OPTION + * \brief }X^^C}ʂ̎擾 + * \param err G[iȗj + * \return ݐݒ肳Ă}X^^C} + * + * ݐݒ肳Ă}X^^C}ʂ擾܂B + * + * \sa CriMvEasyPlayer::SetMasterTimer() + */ + TimerType GetMasterTimer(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the number of internal video buffers + * \param npools The number of buffers to use; must be greater than 0 + * \param err Optional error code + * + * CRI Movie uses internal memory, or frame pools, to buffer decoded frames before display. + * More frame pools can help smooth out playback under high CPU loads. + * + * \remarks + * By default, the number of pools is 1. To change the value, this function must be called + * before starting playback (with either CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start()). + */ + /*JP + * \ingroup MODULE_OPTION + * \brief rfIobt@it[v[j̎w + * \param npools rfIobt@iŒłPj + * \param err G[iȗj + * + * EasyPlayernh̃rfIobt@w肵܂B
+ * ̓rfIobt@̓fR[hʂ~Ă߂̂̂ŁAt[v[ƌĂт܂B
+ * t[v[قǐsărfIfR[hi߂邱Ƃł邽߁AfR[h + * וϓ傫AfR[hɎgpłCPUԂ̕ϓ傫ꍇɂX[YȍĐ + * s₷Ȃ܂B
+ * ftHg̃t[v[͂PłB
+ * t[v[ύXꍇ́AĐJnO( CriMvEasyPlayer::Prepare()܂ CriMvEasyPlayer::Start()) + * {֐sĂB + */ + void SetNumberOfFramePools(CriUint32 npools, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the amount of movie data that will be buffered, in seconds + * \param sec Buffering time, in seconds + * \param err Optional error code + * + * CRI Movie buffers enough raw data from disk to allow for smooth playback and to reduce disk reads. + * The buffer size is based on the bitrate of the movie, and other movie parameters. + * + * By default, this buffer will be large enough to hold 1 second worth of playback. + * + * To determine the current buffering time, look at the \a buffering_time field of the + * CriMvStreamingParameters structure, which is retrieved by calling CriMvEasyPlayer::GetMovieInfo(). + * + * \remarks + * If this function is called, it must be called before starting playback (with either + * CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start()). + * + * \remarks + * Passing \a 0.0 as the value of \a sec will reset the buffering time to the default value. + * + * \remarks + * If an application calls CriMvEasyPlayer::SetStreamingParameters() for a handle, this function + * can not be used with that handle. + * + * \remarks + * The value set by this function, along with the value set by CriMvEasyPlayer::SetReloadThresholdTime(), + * determine how often data is read from disk. See the description of + * CriMvEasyPlayer::SetReloadThresholdTime() for details. + * + * \sa CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::GetInputBufferInfo(), + * CriMvStreamingParameters + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ̓f[^̃obt@OԂ̎w + * \param sec obt@OԁBPʂ͕bB + * \param err G[iȗj + * + * Xg[~OĐŃobt@O̓f[^̗ʂbPʂ̎ԂŎw肵܂B
+ * EasyPlayeŕAobt@OԂƃ[r̃rbg[gǂݍ݃obt@̃TCY肵܂B + * + * ftHg̃obt@OԂ́AĐJn_ŃAvP[V쐬ς݂EasyPlayernh + * ɈˑČ܂܂BEasyPlayernhP‚ɂ‚Pb̃obt@OԂmۂ܂BAv + * P[VR‚EasyPlayernh쐬ĂꍇAobt@OԂ͂RbƂȂ܂B + * + * EasyPlayernhb̃obt@OԂɂȂĂ邩 CriMvEasyPlayer::GetMovieInfo + * ֐Ŏ擾 CriMvStreamingParameters \̂̕ϐ buffering_time ŊmFł܂B + * + * {֐̌ĂяóA CriMvEasyPlayer::Prepare ֐܂ CriMvEasyPlayer::Start ֐̑O܂łɎsĂB + * + * obt@OԂ 0.0f w肵ꍇAobt@OԂ̓CũftHglƂȂ܂B
+ * ܂AAvP[V CriMvEasyPlayer::SetStreamingParameters ֐Ăяoꍇ͖{֐ + * ݒ肵lA CriMvEasyPlayer::SetStreamingParameters ֐̎w肪D悳܂B + * + * \sa CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::GetInputBufferInfo() + */ + void SetBufferingTime(CriFloat32 sec, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Determines how often the movie data buffer is refilled from disk + * \param sec Number of seconds of playback time to buffer + * \param err Optional error code + * + * EasyPlayer buffers raw data from disk to allow for smooth playback. How often it refills + * its buffers is determined by this function. When the amount of data remaining, in seconds, + * falls below this value, EasyPlayer will call into the FileReader module for this handle in + * order to read more data. + * + * SetBufferingTime() sets a "low water mark" for the data buffer. For instance, if an application + * sets the buffer size to 4 seconds (with CriMvEasyPlayer::SetBufferingTime()), and sets the reload + * threshold to 1 second, then CRI Movie will initially fill the buffer with 4 seconds worth of + * data. After 3 seconds worth of data have been decoded and consumed, there will be less than + * \a reload \a threshold seconds of data remaining, and CRI Movie will refill the buffer. + * + * \remarks + * The default value for \a sec is 0.8s. + * + * \remarks + * If this function is called, it must be called before starting playback (with either + * CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start()). + * + * \sa CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::GetInputBufferInfo(), CriMvFileReaderInterface + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ēǂݍ臒l̎Ԏw + * \param sec Ԏwɂēǂݍ臒lBPʂ͕bB + * \param err G[iȗj + * + * EasyPlayernh́A̓obt@̃f[^ēǂݍ臒lȉɂȂɎ̃f[^ǂݍ݂s܂B + * ēǂݍ臒l͖{֐ɂw莞Ԃƃ[rf[^̃rbg[gɂĎIɌvZ܂B + * ēǂݍ臒l͎[b]Ŏw肵܂BftHgl0.8błB + * + * [rĐɃf[^𗠓ǂ݂ꍇȂǂɃV[N񐔂炷߂臒lݒ𗘗p邱Ƃł܂B + * Ⴆ΁Aobt@OԂ2bAēǂݍ臒l1bɐݒ肷ƁA[rf[^̓ǂݍ݂͖1b1̎sɂȂ܂B + * 邱ƂŁA1b̊Ԃ̓f[^̓ǂݍ݂AIɍsƂł܂B + * + * [rĐȂ烆[Uf[^̓ǂݍ݂sꍇA[Uf[^̓ǂݍ݂͖{֐Ŏw肵Ԉȓɓǂݍ + * I悤ɂĂBTCY̑傫ȃf[^͕ɕēǂݍނȂǂ̑ΏKvɂȂ܂B + * {֐Ŏw肵ԈȓɃ[Uf[^̓ǂݍ݂IȂꍇA[rf[^͊ă[rĐ؂܂B + * + * {֐̌ĂяóA CriMvEasyPlayer::Prepare ֐܂ CriMvEasyPlayer::Start ֐̑O܂łɎsĂB + * + * [rĐ̓̓obt@̃f[^ʂēǂݍ臒l̃TCÝACriMvEasyPlayer::GetInputBufferInfo Ŏ擾”\łB + * + * \sa CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::GetInputBufferInfo() + */ + void SetReloadThresholdTime(CriFloat32 sec, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Retrieves input data buffering settings + * \param ibuf_info Input buffer information structure + * \param err Optional error code + * + * Populates the passed CriMvInputBufferInfo structure with the values of the settings + * for the raw input buffer size, the reload interval, and the amount of data currently buffered. + * + * \remarks + * This function can be called once the handle status has transitioned to MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvInputBufferInfo, CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::SetReloadThresholdTime() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ̓obt@̎擾 + * \param ibuf_info ̓obt@ + * \param err G[iȗj + * + * ̓obt@ CriMvInputBufferInfo 擾܂B
+ * ̓obt@EasyPlayernh̏Ԃ MVEASY_STATUS_WAIT_PREP ȍ~ɂȂƎ擾ł܂B
+ * + * \sa CriMvInputBufferInfo, CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::SetReloadThresholdTime() + */ + void GetInputBufferInfo(CriMvInputBufferInfo &ibuf_info, CriError &err=CriMv::ErrorContainer); + + /*EN + * + * \brief Sets the maximum bitrate EasyPlayer will assume for movie data + * \param max_bitrate Maximum bitrate, in bits/second + * \param err Optional error code + * + * EasyPlayer determines the size of its input data buffer by the movie's bitrate, the buffering time, + * and other movie parameters. In normal usage, an application should not need to call this function. + * However, it can be useful when doing concatenated playback of several movies sequentially. + * + * If the bitrate of the first movie is smaller or larger than the next movie, EasyPlayer can choose + * a buffer size that will be appropriate for the first movie, but either too small for the next + * (causing excessive disk reads or playback stuttering) or too large (using more memory than necessary). + * + * Passing a value of 0 for \a max_bitrate will cause the handle to revert to its default behavior + * for determining maximum bitrate. + * + * \remarks + * The value set by this function will not be reflected in the \a max_bitrate field of the + * CriMvStreamingParameters structure, which will contain the actual value as stored in the movie's + * header. + * + * \remarks + * If this function is called, it must be called before starting playback (with either + * CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start()). + * + * \remarks + * If an application calls CriMvEasyPlayer::SetStreamingParameters() for a handle, this function + * can not be used with that handle. + * + * \remarks + * For details about concatenated playback, see the description of CriMvEasyPlayer::SetFileRequestCallback(). + * + * \sa CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::SetReloadThresholdTime(), + * CriMvEasyPlayer::SetFileRequestCallback() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief őrbg[g̎w + * \param max_bitrate őrbg[g(bit per second) + * \param err G[(ȗ) + * + * [rf[^̍őrbg[gw肵܂Bőrbg[g̓Xg[ĐpɊmۂobt@TCYɉe܂B
+ * + * PĐ͖{֐ĂяoKv͂܂BEasyPlayernhIɍőrbg[g擾ĕKvȂ + * ǂݍ݃obt@mۂ܂B
+ * + * AĐɁA擪̃[rt@C̃rbg[g㑱̃[rt@CƔׂċɒ[ɏꍇɂ́A{֐gp + * Iɍőrbg[g傫w肵ĂB
+ * + * {֐Őݒ肵őrbg[ǵACriMvEasyPlayer::GetMovieInfo ֐Ŏ擾郀[rɂ͔f܂B + * CriMvEasyPlayer::GetMovieInfo ֐Ŏ擾ł̂̓[rf[^̖{̏łB
+ * + * {֐̌ĂяóA CriMvEasyPlayer::Prepare ֐܂ CriMvEasyPlayer::Start ֐̑O܂łɎsĂB
+ * + * őrbg[g 0w肵ꍇAőrbg[g̓[rf[^̎’lƂȂ܂B
+ * ܂AAvP[V CriMvEasyPlayer::SetStreamingParameters ֐Ăяoꍇ͖{֐ + * ݒ肵lA CriMvEasyPlayer::SetStreamingParameters ֐̎w肪D悳܂B + * + * \sa CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::SetReloadThresholdTime(), + * CriMvEasyPlayer::SetFileRequestCallback() + */ + void SetMaxBitrate(CriUint32 max_bitrate, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the audio playback track + * \param track Audio track number + * \param err Optional error code + * + * If a movie has multiple audio tracks (for instance, English and Spanish versions), this function + * will determine which track plays. By default, the first audio track is used. + * + * To determine the number of audio tracks in the movie, call CriMvEasyPlayer::GetMovieInfo() and + * look at the \a num_audio field of the CriMvStreamingParameters structure. + * + * If the movie does not have any audio, this function has no effect. + * + * \remarks + * To use the default setting, set \a track to CRIMV_AUDIO_TRACK_AUTO. + * + * \remarks + * To turn off audio altogether, set \a track to CRIMV_AUDIO_TRACK_OFF. + * + * \sa CriMvEasyPlayer::GetMovieInfo() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ĐI[fBIgbN̎w + * \param track ĐI[fBIgbN + * \param err G[iȗj + * + * [r̃I[fBIgbNĂꍇɁAĐI[fBIw肵܂B
+ * ĐJnO( CriMvEasyPlayer::Prepare()܂ CriMvEasyPlayer::Start())ɖ{֐sĂB + * + * {֐sȂꍇ́AƂႢԍ̃I[fBIgbNĐ܂B
+ * CriMvEasyPlayer::DecodeHeader() CriMvEasyPlayer::GetMovieInfo()gƂŁAǂ̃`l + * ǂȃI[fBIĂ邩ĐJnOɒm邱Ƃł܂B + * + * f[^݂ȂgbNԍw肵ꍇ́AI[fBI͍Đ܂B + * + * gbNԍƂCRIMV_AUDIO_TRACK_OFFw肷ƁAႦ[rɃI[fBI܂܂Ă + * ĂI[fBI͍Đ܂B + * + * ܂AftHgݒiƂႢ`l̃I[fBIĐjɂꍇ́A + * `lƂCRIMV_AUDIO_TRACK_AUTOw肵ĂB + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader() + */ + void SetAudioTrack(CriSint32 track, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Turns movie looping on or off + * \param sw Looping value + * \param err Optional error code + * + * If \a sw is 1 (ON), the movie will loop continuously. + * If \a sw is 0 (OFF), the movie will play normally. + * + * In normal usage, a movie will play once, with the handle status changing to MVEASY_STATUS_PLAYEND + * when it completes. When looping is ON, this behavior changes. When the movie reaches the + * end, it will immediately start playing again from the beginning, and the status will continue to + * toggle between MVEASY_STATUS_PLAYING and MVEASY_STATUS_PREP. + * + * If looping is ON, and the playback is from a file, EasyPlayer will call CriMvFileReaderInterface::Seek() + * as necessary to reset the file pointer. + * + * \remarks + * If looping is ON, and an application sets it to OFF while the movie is playing, playback might + * not stop at the end of the movie. In that case, playback will end after the next loop iteration. + * + * \sa CriMvEasyPlayer::GetLoopFlag(), CriMvFileReaderInterface::Seek() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief [vĐtO̎w + * \param sw [vXCb`BON̏ꍇ̓[vAOFF̏ꍇ̓[vɂȂ܂B + * \param err G[iȗj + * + * [vĐ̗Lݒ肵܂BftHg̓[vOFFłB
+ * [vĐONɂꍇ́A[ȑI[܂ōĐĂnhԂMVEASY_STATUS_PLAYENDɂȂ炸A + * [r̐擪ĐJԂ܂B
+ * t@CwōĐĂꍇ́AŌ܂œǂݍ񂾂 CriMvFileReaderInterface::Seek()g + * ǂݍ݈ʒut@C̐擪ɖ߂܂B + * + * [vĐOFFɐݒ肵ꍇ́ÂƂǂݍł[ȑI[܂ōĐƁA + * nhԂMVEASY_STATUS_PLAYENDɑJڂ܂B
+ * ĐɃ[vOFFɂꍇA^C~OɂẮAĐ̃[rI[ŏI炸ǍJԂ + * Đ܂Ŏs܂B + * + * ݂̃[vݒ擾ɂ CriMvEasyPlayer::GetLoopFlag()gĂB + * + * \sa CriMvEasyPlayer::GetLoopFlag(), CriMvFileReaderInterface::Seek() + */ + void SetLoopFlag(CriBool sw, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Retrieves the value of the looping flag + * \return The current looping setting + * + * By default, looping is OFF and playback will stop when it reaches the end. You can + * change this behavior by calling CriMvEasyPlayer::SetLoopFlag(). + * + * \sa CriMvEasyPlayer::SetLoopFlag() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief [vĐtO̎擾 + * \param err G[iȗj + * \return ݂̃[vĐݒ + * + * ݂̃[vݒ擾܂B + * [vݒ CriMvEasyPlayer::SetLoopFlag() ŕύX邱Ƃł܂B + * + * \sa CriMvEasyPlayer::SetLoopFlag() + */ + CriBool GetLoopFlag(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Gets the amount of time that a movie has been playing + * \param count Number of timer units since the movie started playing + * \param unit Number of timer units per second + * \param err Optional error code + * + * This function retrieves the absolute time that has elapsed since a movie started playing. + * The time value is returned in two parts - a counter with an arbitrary interval, and the + * number of timer ticks per second. To determine the playing time in seconds, divide + * \a count by \a unit. + * + * Before playback has started, and after it has stopped, this function will return a \a count value of 0. + * + * The value retrieved is the value of the master timer for the handle, not the time of the current frame itself. + * To get the video frame time, check the CriMvFrameInfo structure once you have retrieved the frame. + * + * \remarks + * Note that this function provides an absolute playback time - it does not wrap to 0 + * when the movie loops. + * + */ + /*JP + * \ingroup MODULE_OPTION + * \brief Đ̎擾 + * \param count ^C}JEg + * \param unit Pb̃^C}JEglBcount unit ŕbPʂ̎ƂȂ܂B + * \param err G[iȗj + * + * ^C}擾܂Bcountunit̓‚̕ϐŕ\܂B
+ * count unit ŕbPʂ̎ƂȂ悤ȒlԂ܂B
+ * ĐJnOi CriMvSoundInterface::Start()ĂяoOj + * Đ~i CriMvSoundInterface::Stop()Ăяoj́AOi^C}JEgOjԂ܂B
+ * {֐̓}X^^C}Ŏw肳ꂽ^C}̎ԂŁArfIt[̎Ԃ̂ł͂܂B
+ * 擾rfIt[̖{̕\́ArfIt[擾 CriMvFrameInfo \̂QƂĂB + */ + void GetTime(CriUint64 &count, CriUint64 &unit, CriError &err=CriMv::ErrorContainer); // only refer time of SyncMasterTimer + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Gets information about the movie + * \param stmprm Movie information structure + * \param err Optional error code + * \return TRUE if movie information was successfully retrieved + * \return FALSE if the header has not yet been decoded, or if an error occurred + * + * Populates the passed \a CriMvStreamingParameters structure with information about the current movie, + * including the bitrate, resolution, audio track information, subtitle availability, and more. + * + * This function is available once the handle status has changed to MVEASY_STATUS_WAIT_PREP. If an application + * needs this information before starting playback (for instance, to set up for playing subtitles, or to + * allocate a display surface based on the size of the movie), call CriMvEasyPlayer::DecodeHeader(), then + * call GetMovieInfo(). + * + * \remarks + * When doing concatenated playback (via CriMvEasyPlayer::SetFileRequestCallback()), GetMovieInfo() will + * return information about the currently playing movie. + * + * \sa CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::SetFileRequestCallback() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief [r̎擾 + * \param stmprm [r + * \param err G[iȗj + * + * [r CriMvStreamingParameters 擾܂B
+ * [r񂩂͎Ƀrbg[g𑜓xAI[fBIȂǂ킩܂B
+ * [rEasyPlayernh̏Ԃ MVEASY_STATUS_WAIT_PREP ȍ~ɂȂƎ擾ł܂B
+ * ĐJnOɃ[rm肽ꍇ́A CriMvEasyPlayer::DecodeHeader()Ăяoăwb_͂sĂB + * + * AĐsꍇAŌɎ擾t[܂ރ[rt@Cɂ‚Ă̏Ԃ܂B + * + * \sa CriMvEasyPlayer::DecodeHeader() + */ + CriBool GetMovieInfo(CriMvStreamingParameters &stmprm, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Changes the parameters for the movie + * \param stmprm Movie information structure + * \param err Optional error code + * + * This is a DEBUG function and should not normally be used by applications. + * + * This function allows an application to change the streaming parameters for the movie as a whole. + * It is available once the handle status has changed to MVEASY_STATUS_WAIT_PREP. + * + * To use this function, first call CriMvEasyPlayer::DecodeHeader(), then call CriMvEasyPlayer::GetMovieInfo() + * to retrieve the current movie parameters. Change the fields of the CriMvStreamingParameters structure + * as appropriate, then call SetStreamingParameters(). + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief Xg[~Op[^̕ύX + * \param stmprm Xg[~Op[^ + * \param err G[iȗj + * + * {֐͒ʏAAvP[V͎gp܂BfobOp̊֐łB + * + * [rĐ̂߂̃Xg[~Op[^EasyPlayernhɐݒ肵܂B
+ * Xg[~Op[^wł̂́AEasyPlayernhԂMVEASY_STATUS_WAIT_PREP̎łB
+ * ̊֐́Aǂݍ݃obt@TCYȂǍׂȃp[^SăAvP[VŒꍇɎg܂B
+ * CriMvEasyPlayer::DecodeHeader()Ńwb_͂sƁA CriMvEasyPlayer::GetMovieInfo()Ŏ擾ł + * [r񂪂̂܂܃Xg[~Op[^ƂȂ܂̂ŁAlύXāA{֐Őݒ肵Ȃ + * ĂB + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader() + */ + void SetStreamingParameters(CriMvStreamingParameters *stmprm, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Determine if a new video frame can be displayed + * + * \param err Optional error code + * + * \return TRUE if a frame is ready to be displayed + * \return FALSE if the movie is paused or not playing, or if a new frame is + * not yet decoded or ready to be displayed + * + * Each frame in a movie corresponds to an absolute time, with the first frame being time 0. + * The playback time is controlled by the master timer for this handle. + * If the time of the next frame is less than or equal to the current playback time, as determined + * by CriMvEasyPlayer::GetTime(), it is ready to be displayed, and this function will return TRUE. + * + * If an application needs to do some complex or lengthy processing before displaying a frame (such + * as locking a texture), it should call this function first. + * + * \remarks + * If the next frame has not yet been decoded, this function will return FALSE regardless of the playback time. + * + * \sa CriMvEasyPlayer::GetTime() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief t[̕\ + * \param err G[iȗj + * \return ̃rfIt[łɕ\ɂȂĂꍇTRUE(1)Ԃ܂B
+ * ̃rfIt[܂fR[hłȂꍇFALSE(0)Ԃ܂B + * + * ̃rfIt[łɕ\ɂȂĂ邩ǂ₢킹܂B
+ * fR[hxĂĎ̃rfIt[܂fR[hłĂȂꍇ́AĐɊ֌W + * ȂFALSEԂ܂B
+ * ‚܂肱̊֐́ũt[ GetFrameOnTime֐Ŏ擾ł邩ǂv𒲂ׂ܂B
+ * rfIt[ۂɎ擾ɂȂ΂ȂiႦ΃eNX`bNȂǁj + * ꍇ́Å֐Ńt[擾̐ۂ𔻒肵Ă珈ĂB + * + * \sa CriMvEasyPlayer::GetTime() + */ + CriBool IsNextFrameOnTime(CriError &err=CriMv::ErrorContainer); + +#if !defined(XPT_TGT_EE) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Loads video frame data into a buffer, in 32 bit ARGB format + * \param imagebuf Pointer to output buffer + * \param pitch Pitch of output buffer, in bytes + * \param bufsize Size of output buffer, in bytes + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Copies the next decoded frame into the 32 bit ARGB image buffer pointed to by \a imagebuf. + * If the display time is less than the frame time, or if the frame has not yet been decoded, the + * \a frameinfo parameter will be cleared and this function will return FALSE. + * + * The \a pitch parameter is the width, in bytes, of each row of the frame image, including any padding. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * CRI Movie decodes video frames into YUV420 format internally, and stores them in frame pools (see + * CriMvEasyPlayer::SetNumberOfFramePools()) for later display. When this function is called, + * the frame must first converted to ARGB format. This can be a very CPU-intensive operation, + * especially on the PS3 and Xbox360. For 1280 x 720 video resolution, this can use almost an + * entire vsync interval. On these platforms, we recommend implementing a pixel shader and calling + * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() instead. + * + * \remarks
+ * If an application uses this function, an application need to call CriMv::InitializeFrame32bitARGB() + * after CriMv::Initialize(). If an application calls this function without CriMv::InitializeFrame32bitARGB() + * calling, this function failed and an error callback occurs. + * + * \remarks + * This function is not available on the PS2. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers(), + * CriMvEasyPlayer::SetNumberOfFramePools() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief 32bit ARGBtH[}bgł̃fR[hʂ̎擾 + * \param imagebuf o̓obt@|C^ + * \param pitch o̓obt@̃sb` [byte] + * \param bufsize o̓obt@̃TCY [byte] + * \param frameinfo 擾rfIt[̏\ + * \param err G[iȗj + * \return t[擾łꍇTRUE(1)AłȂꍇFALSE(0)Ԃ܂B + * + * 32bit ARGBtH[}bgŁA\ɂȂĂrfIt[擾܂B
+ * ̊֐Ăяoꍇ́AARGBobt@̎̂mۂŌĂяoKv܂B
+ * rfIt[͈imagebufŎw肵ARGBobt@ɏo܂B
+ * ̃rfIt[̕\ɂȂĂȂAfR[hIĂȂꍇ + * t[擾łAframeinfo̒g̓NA܂B
+ * OɃrfIt[擾ł邩ǂm肽ꍇ CriMvEasyPlayer::IsNextFrameOnTime() + * gpĂB + * + * 32bit ARGB ̎ۂ̃sNZf[^̕тɂ‚ẮÃvbgtH[ōłWI + * tH[}bgɂȂ܂B + * + * :
+ * {֐gpꍇ̓t[ϊ̏ CriMv::InitializeFrame32bitARGB()̌Ăяo + * OɕKvłBt[ϊ̏s킸ɖ{֐Ăяoꍇ̓t[擾ɎsA + * G[R[obN܂B + * + * :
+ * PS3, Xbox360 ł{֐͎gpł܂AƂĂCPUׂ̍֐ƂȂ܂B
+ * 𑜓x 1280x720 ̃[r{֐t[擾1vsync߂Ԃ܂B
+ * PS3, Xbox360 łCriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() ֐ sNZVF[_[ + * ̑gݍ킹ɂt[ϊ߂܂B
+ * + * l:
+ * PS2CRI Movie ͖{֐ɑΉĂ܂B + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriBool GetFrameOnTimeAs32bitARGB(CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + +#if !defined(XPT_TGT_EE) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Loads video frame data into a set of Y,U,V separate buffers + * \param yuvbuffers Pointer to Y,U,V buffer data structure + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Copies the next decoded frame into the Y,U,V image buffers pointed to by \a yuvbuffers, for use + * with a pixel shader. CRI Movie decodes video frames into YUV420 format internally, so this is + * a very efficient function. + * + * If the display time is less than the frame time, or if the frame has not yet been decoded, the + * \a frameinfo parameter will be cleared and this function will return FALSE. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \remarks + * If the movie does not have an alpha channel, the alpha buffer fields of the \a CriMvYuvBuffers + * structure are not used. + * + * \remarks + * This function is not available on the PS2. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief YUV•ʃobt@ւ̃fR[hʂ̎擾 + * \param yuvbuffers YUV•ʃobt@̃p[^\ + * \param frameinfo 擾rfIt[̏\ + * \param err G[iȗj + * \return t[擾łꍇTRUE(1)AłȂꍇFALSE(0)Ԃ܂B + * + * YUV•ʃobt@`ŕ\ɂȂĂrfIt[擾܂B
+ * YUV•ʃobt@`̓sNZVF[_[Ńt[`悷邽߂̏o̓tH[}bgłB
+ * ̊֐Ăяoꍇ́AYUV•ʃobt@̎̂mۂŌĂяoKv܂B
+ * rfIt[͈yuvbuffersŎw肵YUV•ʃobt@ɏo܂B
+ * ̃rfIt[̕\ɂȂĂȂAfR[hIĂȂꍇ + * t[擾łAframeinfo̒g̓NA܂B
+ * OɃrfIt[擾ł邩ǂm肽ꍇ CriMvEasyPlayer::IsNextFrameOnTime() + * gpĂB
+ *
+ * At@[rĐsȂꍇ́A yuvbuffers AlphaeNX`֘Ãp[^͎gp܂B
+ * + * l:
+ * PS2CRI Movie ͖{֐ɑΉĂ܂B + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriBool GetFrameOnTimeAsYUVBuffers(CriMvYuvBuffers *yuvbuffers, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + +#if defined(XPT_TGT_PC) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Loads video frame data into a buffer, in YUV422 format + * \param imagebuf Pointer to output buffer + * \param pitch Pitch of output buffer, in bytes + * \param bufsize Size of output buffer, in bytes + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Copies the next decoded frame into the YUV422 texture buffer pointed to by \a imagebuf. + * CRI Movie decodes video frames into YUV420 format internally, so there is some internal conversion + * required when using this function. + * + * If the display time is less than the frame time, or if the frame has not yet been decoded, the + * \a frameinfo parameter will be cleared and this function will return FALSE. + * + * The \a pitch parameter is the width, in bytes, of each row of the frame image, including any padding. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \remarks + * This function is currently only available in the PC version of CRI Movie. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief YUV422tH[}bgł̃fR[hʂ̎擾 + * \param imagebuf o̓obt@̃|C^ + * \param pitch o̓obt@̃sb` [byte] + * \param bufsize o̓obt@TCY [byte] + * \param frameinfo 擾rfIt[̏\ + * \param err G[iȗj + * \return t[擾łꍇTRUE(1)AłȂꍇFALSE(0)Ԃ܂B + * + * YUV422eNX`tH[}bgŁA\ɂȂĂrfIt[擾܂B
+ * ̊֐Ăяoꍇ́AYUVobt@̎̂mۂŌĂяoKv܂B
+ * rfIt[͈imagebufŎw肵YUVobt@ɏo܂B
+ * ̃rfIt[̕\ɂȂĂȂAfR[hIĂȂꍇ + * t[擾łAframeinfo̒g̓NA܂B
+ * OɃrfIt[擾ł邩ǂm肽ꍇ CriMvEasyPlayer::IsNextFrameOnTime() + * gpĂB + * + * ylz
+ * ݂́APCCRI Movie ̂ݖ{֐ɑΉĂ܂B + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriBool GetFrameOnTimeAsYUV422(CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_PC)|| defined(XPT_TGT_TRGP6K) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * \brief Get video frame data to 16bit RGB565 format buffer + * + * This function is added for a prototype library for iPhone + * Please add comments when releasing the SDK. + * + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief 16bit RGB565tH[}bgł̃fR[hʂ̎擾 + * + * ̊֐iPhoneCRI Moviẽvg^Cvp̊֐錾łB + * SDKƂă[Xۂ́ARgljĉB + * + */ + CriBool GetFrameOnTimeAsRGB565(CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + +#if defined(XPT_TGT_EE) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Gets a reference to EasyPlayer's internal video frame buffer, in 32 bit ARGB format + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Locks the internal buffer for the current video frame in memory, and retrieves a pointer to it. This is + * different behavior than the GetFrameXXX()functions, which copy the frame data into a caller-supplied location. + * + * On successful return from this function, the fields of \a frameinfo will be populated with information + * about the frame. In particular, the \a imageptr field will be set to the image buffer, in 32 bit ARGB format. + * After calling this function, an application must copy the video frame into its own buffer or transfer it to + * GS local memory via DMA. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \remarks + * After the application has copied the frame data, it must call CriMvEasyPlayer::UnlockFrame(). + * + * \remarks + * This function is only available on the PS2. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::UnlockFrame() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief fR[hʗ̈(ARGB32bit)̃bNBPS2pB + * \param frameinfo bNrfIt[̏\ + * \param err G[iȗj + * + * {֐PS2p̃t[擾֐ŁA@ GetFrame ֐ɑ܂B
+ * PS2ł GetFrame ֐̑ɖ{֐ UnlockFrame ֐gpăt[擾s܂B
+ * GetFrame ֐͏o̓obt@w肵ĂփfR[hʂ擾̂ɑ΂ALockFrame ֐̓obt@w肹 + * CriMvEasyPlayernhɂfR[hʃobt@̃|C^擾Ƃ낪Ⴂ܂B
+ * + * {֐̓fR[hʂ̃̈QƊJn邽߂ɃbN܂B
+ * ̊֐Ńt[bNł̂́Ãt[\”\ԂɂȂĂꍇ݂̂łB
+ * AvP[V̓t[bNƁAfR[hʂDMAŃeNX`̈֓]邩A + * ʃobt@փRs[Ȃǂ̏s܂B
+ * fR[hʂ̎QƂIɂ́AK CriMvEasyPlayer::UnlockFrame() ֐ĂяoĎQƏIʒmĂB
+ * + * l:
+ * {֐PS2CRI Movie ̂ݑΉĂ܂B + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::UnlockFrame() + */ + CriBool LockFrameOnTimeAs32bitARGB_PS2(CriMvFrameInfo &frameinfo, CriError &err=CriMv::ErrorContainer); +#endif + + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Unlocks the video frame + * \param frameinfo Pointer to locked video frame information + * \param err Optional error code + * + * Unlocks the video frame that was locked in memory by a call to one of the LockFrameXXX() functions. + * + * The \a frameinfo parameter must be the same one that was passed to LockFrameXXX(). + * + * If the frame has been locked, EasyPlayer will not be able to retrieve the next frame until the frame is + * unlocked. An attempt to lock the same frame more than once will fail. + * + * The LockFrameXXX() functions are CriMvEasyPlayer::LockFrameOnTimeAs32bitARGB_PS2() and + * CriMvEasyPlayer::LockFrameOnTimeAsYUVBuffers(). Depending on the platform, only one or the other of + * these functions will be available. + * + * \sa CriMvEasyPlayer::LockFrameOnTimeAs32bitARGB_PS2(), CriMvEasyPlayer::LockFrameOnTimeAsYUVBuffers() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief bNt[Ŏ擾fR[hʂAbN + * \param frameinfo bNrfIt[̏\ + * \param err G[iȗj + * + * {֐̓bNt[֐găbNĂt[AbNAQƂ̏Iʒm܂B
+ * bNt[֐ɂ CriMvEasyPlayer::LockFrameOnTimeAs32bitARGB_PS2() CriMvEasyPlayer::LockFrameOnTimeAsYUVBuffers() + * ܂Aǂ̊֐găbNꍇA{֐găAbN܂B
+ * {֐̈ɂ́Aǂ̃t[AbN邩w邽߂ɁAbNt[֐Ŏ擾t[\̂w肵܂B
+ * + * {֐ŃAbNt[́AȌAɃrfIt[̃fR[ho̓obt@ƂĎgp܂B
+ * PxAbNt[xbN邱Ƃ͏o܂B
+ * + * \sa CriMvEasyPlayer::LockFrameOnTimeAs32bitARGB_PS2(), CriMvEasyPlayer::LockFrameOnTimeAsYUVBuffers() + */ + CriBool UnlockFrame(CriMvFrameInfo *frameinfo, CriError &err=CriMv::ErrorContainer); + +#if !defined(XPT_TGT_EE) + /*EN + * + * \brief Gets a reference to EasyPlayer's internal video frame buffer + * \param yuvbuffers Y,U,V buffer data structure + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Locks the internal buffer for the current video frame in memory, and retrieves a pointer to it. This is + * different behavior than the GetFrameXXX() functions, which copy the frame data into a caller-supplied location. + * + * On successful return from this function, the fields of \a yuvbuffers will be set to the Y,U,V fields of the + * video frame, and the fields of \a frameinfo will be populated with information about the frame. + * + * After calling this function, an application must copy the video frame into its own buffer or transfer it to + * texture memory. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \remarks + * After the application has copied the frame data, it must call CriMvEasyPlayer::UnlockFrame(). + * + * \remarks + * This function is not available on the PS2. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::UnlockFrame() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief fR[hʗ̈̃bN + * \param yuvbuffers YUV•ʃobt@̃p[^\ + * \param frameinfo bNrfIt[̏\ + * \param err G[iȗj + * + * GetFrame Ƃ͕ʂ̎dl̃t[擾֐łB
+ * {֐ UnlockFrame ֐ƃZbgŎgp܂B
+ * GetFrame ֐͏o̓obt@w肵ĂփfR[hʂ擾̂ɑ΂ALockFrame ֐̓obt@w肹 + * CriMvEasyPlayernhɂfR[hʃobt@̃|C^擾Ƃ낪Ⴂ܂B
+ * + * {֐̓fR[hʂ̃̈QƊJn邽߂ɃbNA + * fR[hʂYUVRނ̃obt@ɂ‚Ă̏ yuvbuffers Ɋi[܂B
+ * ̊֐Ńt[bNł̂́Ãt[\”\ԂɂȂĂꍇ݂̂łB
+ * AvP[V̓t[bNƁAfR[hʂeNX`̈փRs[邩A + * ʃobt@փRs[Ȃǂ̏s܂B
+ * fR[hʂ̎QƂIɂ́AK CriMvEasyPlayer::UnlockFrame() ֐ĂяoĎQƏIʒmĂB
+ * + * l:
+ * PS2CRI Movie ͖{֐ɑΉĂ܂B + * + * \sa CriMvEasyPlayer::UnlockFrame() + */ + CriBool LockFrameOnTimeAsYUVBuffers(CriMvYuvBuffers &yuvbuffers, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Discards the next video frame + * \param frameinfo Discarded frame information structure + * \param err Optional error code + * \return TRUE if a frame was available to discard + * \return FALSE otherwise + * + * Discards the next video frame, if it is available, and populates \a frameinfo with information about + * the frame. Note that the \a imageptr field of that structure will not be available and should not + * be referenced. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief t[擾Ɏ̂Ă + * \param frameinfo jrfIt[̏\ + * \param err G[iȗj + * + * fR[hς݂̃rfIt[̂ĂꍇɎgp֐łB
+ * t[擾֐ƔׂƁAo͗pobt@KvłB
+ * CriMvEasyPlayer::IsNextFrameOnTime()Ŏt[擾ł邱ƂmFA{֐ĂяoĂB
+ * frameinfoɂ͎Ql̂߂ɔjrfIt[̏񂪊i[܂AfR[hʎ̂ɂ̓ANZXł܂B + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriBool DiscardNextFrame(CriMvFrameInfo &frameinfo, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the current channel for displaying subtitles + * + * \param channel Subtitle channel number + * \param err Optional error code + * + * A movie can contain up to 16 distinct sets of subtitles, each on its own display channel. This can + * be used, for instance, to provide multilanguage support. + * + * Subtitle channels are numbered sequentially, starting from 0, but do not need to be contiguous. + * For example, a movie can have 3 sets of subtitles, on channels 1, 5, and 7. The number of channels + * can be determined once CriMvEasyPlayer::GetMovieInfo() has completed successfully by looking at the + * \a num_subtitle field of the \a CriMvStreamingParameters structure passed to that function. + * + * By default, subtitle playback is off. To turn off subtitles once they have been turned on, pass + * CRIMV_SUBTITLE_CHANNEL_OFF as the value of \a channel. + * + * If the selected subtitle channel does not exist, subtitles will not be displayed. + * + * \remarks + * If an application turns on subtitle display with this function, it must periodically call + * CriMvEasyPlayer::GetSubtitleOnTime(), or else movie playback will stall. + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::GetSubtitleOnTime() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 擾鎚`l̐ݒ + * \param channel `l + * \param err G[iȗj + * + * 擾鎚`lݒ肵܂BftHg͎擾łB + * + * CriMvEasyPlayer::DecodeHeader() CriMvEasyPlayer::GetMovieInfo()gƂŁAĐ郀[r + * ‚̎܂ł邩ĐJnOɒm邱Ƃł܂B + * + * f[^݂Ȃ`lԍw肵ꍇ́A͎擾ł܂B
+ * ftHgݒi擾jɂꍇ́A`lƂCRIMV_SUBTITLE_CHANNEL_OFFw肵ĂB + * + * ̊֐Ŏ`lw肵ꍇ́AC[vI CriMvEasyPlayer::GetSubtitleOnTime() + * sĂB擾IɍsȂꍇ́A[rĐrŎ~܂܂B + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::GetSubtitleOnTime + */ + void SetSubtitleChannel(CriSint32 channel, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Retrieves subtitle data for the current frame, if available + * + * \param bufptr Buffer to receive subtitle data + * \param bufsize Size of buffer, in bytes + * \param err Optional error code + * + * \return The number of bytes copied into \a bufptr + * + * If the movie contains subtitle data, and there is a subtitle for the current frame, up to \a bufsize + * bytes of the subtitle data for the active subtitle channel will be copied into \a bufptr. Otherwise, + * the entire buffer will be filled with zeroes. + * + * \remarks + * If an application turns on subtitle display with CriMvEasyPlayer::SetSubtitleChannel(), it must + * periodically call this function, or else movie playback will stall. + * + * \remarks + * An application should not make assumptions as to whether the returned data is NUL-terminated. + * + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief f[^̎擾 + * \param bufptr o̓obt@|C^ + * \param bufsize o̓obt@TCY [byte] + * \param err G[iȗj + * \return 擾f[^̃TCY[byte]Ԃ܂B + * + * \ɂȂĂ鎚f[^擾܂B + * ̊֐Ăяoꍇ́Apobt@̎̂mۂŌĂяoĂB
+ * f[^͈ bufptr Ŏw肵obt@ɏo܂B
+ * f[^ bufsize 傫ꍇ́Abufsize Ɏ܂ʂoAc͔j܂B + * + * \̎ꍇ́Aobt@̒g̓NA܂B + * + * CriMvEasyPlayer::SetSubtitleChannel()ő݂鎚`lw肵Ăꍇ́A + * C[vIɖ{֐sĂB
+ * sȂꍇ́A[rĐrŎ~܂܂B + * + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ + CriUint32 GetSubtitleOnTime(CriUint8 *bufptr, CriUint32 bufsize, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets a secondary sound interface + * + * \param sound Secondary sound interface to attach to this handle + * \param err Optional error code + * + * A subaudio interface allows an application to play two audio tracks at the same time. This is + * typically used to play a dialog track or sound effects along with background music. After calling + * this function, an application needs to call CriMvEasyPlayer::SetSubAudioTrack() to choose the secondary + * audio track to play. + * + * Note that you must create a separate sound interface to pass to this function. The interface used + * in the CriMvEasyPlayer::Create() call can not be used. + * + * If a subaudio interface is used, the application must call CriMvEasyPlayer::DetachSubAudioInterface() + * when the EasyPlayer handle reaches the MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND state before calling + * CriMvEasyPlayer::Destroy(). + * + * Calling CriMvEasyPlayer::ResetAllParameters() will not affect the value set by this function. + * + * \remarks + * If this function is called, it must be called before starting playback (with either CriMvEasyPlayer::Prepare() + * or CriMvEasyPlayer::Start()). + * + * \remarks + * An EasyPlayer handle can not use a subaudio interface and center channel replacement (see + * CriMvEasyPlayer::ReplaceCenterVoice()) at the same time. + * + * \sa CriMvEasyPlayer::DetachSubAudioInterface(), CriMvEasyPlayer::SetSubAudioTrack(), + * CriMvEasyPlayer::ReplaceCenterVoice() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief TuI[fBIpTEhC^tF[X̐ݒ + * \param sound TuI[fBIpTEhC^tF[X + * \param err G[iȗj + * + * TuI[fBIiCI[fBIƓɕʂ̃I[fBIĐ@\ĵ߂ + * TEhC^tF[Xݒ肵܂B
+ * ݒ肷TEhC^tF[X́A CriMvEasyPlayer::Create() Ɏw肵TEhC^tF[X + * Ƃ́uʂ́vCX^XłȂ΂܂B
+ * + * {֐́AEasyPlayernh쐬A CriMvEasyPlayer::Start() ܂ CriMvEasyPlayer::Prepare() + * ĂяoOɎsȂ΂܂B
+ * + * TuI[fBIĐɂ́A{֐ŃTEhC^tF[Xݒ肵ƁA + * CriMvEasyPlayer::SetSubAudioTrack() ŃTuI[fBĨgbNw肵ĂB
+ * + * TuI[fBIpTEhC^tF[Xݒ肵nhjjOɁA + * MVEASY_STATUS_STOP ܂ MVEASY_STATUS_PLAYEND ̏Ԃ CriMvEasyPlayer::DetachSubAudioInterface() ĂłB + * ȂATuI[fBIpTEhC^tF[X CriMvEasyPlayer::ResetAllParameters() ĂяoĂZbg܂B + * + * :
+ * TuI[fBI@\́A CriMvEasyPlayer::ReplaceCenterVoice() ɂZ^[`lu@\Ƃ + * Ɏgpł܂B
+ * + * \sa CriMvEasyPlayer::DetachSubAudioInterface(), CriMvEasyPlayer::SetSubAudioTrack(), + * CriMvEasyPlayer::ReplaceCenterVoice() + */ + void AttachSubAudioInterface(CriMvSoundInterface *sound, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Removes a secondary audio interface + * + * \param err Optional error code + * + * Removes the secondary sound interface that was set by a call to CriMvEasyPlayer::AttachSubAudioInterface(). + * + * This function should be called when the EasyPlayer handle's state is either MVEASY_STATUS_STOP or + * MVEASY_STATUS_PLAYEND. + * + * \sa CriMvEasyPlayer::AttachSubAudioInterface() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief TuI[fBIpTEhC^tF[X̉ + * \param err G[iȗj + * + * ݐݒ肳ĂTuI[fBIpTEhC^tF[X܂B
+ * + * {֐́AEasyPlayernh̏Ԃ CriMvEasyPlayer::MVEASY_STATUS_STOP ܂ + * CriMvEasyPlayer::MVEASY_STATUS_PLAYEND ̎ɌĂяoĂB
+ * + * \sa CriMvEasyPlayer::AttachSubAudioInterface() + */ + void DetachSubAudioInterface(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the secondary audio track + * + * \param track Track number + * \param err Optional error code + * + * A secondary, or subaudio, track is typically used to play a dialog track or sound effects along + * with a movie. An application can support several different languages by setting the desired language + * track with this function. By default, the subaudio track is disabled, even if the interface has been set. + * + * Subaudio is enabled with CriMvEasyPlayer::AttachSubAudioInterface(). If the interface has not been set, + * this function will have no effect. + * + * The main audio track for the movie is set with CriMvEasyPlayer::SetAudioTrack(). If the same track + * number is used for the main and subaudio, the subaudio will not play. + * + * To turn off the subaudio track, pass CRIMV_CENTER_VOICE_OFF as the track number. + * + * \remarks + * If this function is called, it must be called before starting playback (with either CriMvEasyPlayer::Prepare() + * or CriMvEasyPlayer::Start()). + * + * \remarks + * An EasyPlayer handle can not use a subaudio interface and center channel replacement (see + * CriMvEasyPlayer::ReplaceCenterVoice()) at the same time. + * + * \sa CriMvEasyPlayer::AttachSubAudioInterface(), CriMvEasyPlayer::ReplaceCenterVoice() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief TuI[fBIgbN̐ݒ + * \param track TuI[fBIĐgbNԍ + * \param err G[iȗj + * + * TuI[fBIgbNݒ肵܂BftHgl CRIMV_CENTER_VOICE_OFF łB
+ * + * TuI[fBIĐɂ́A CriMvEasyPlayer::AttachSubAudioInterface() ŃTEhC^tF[Xݒ肵ƁA + * {֐ŃTuI[fBĨgbNw肵ĂB
+ * {֐̌ĂяóA CriMvEasyPlayer::Start() ܂ CriMvEasyPlayer::Prepare() ̌ĂяoOłȂ΂܂B
+ * + * CI[fBĨgbN CriMvEasyPlayer::SetAudioTrack() Ŏw肵܂B + * TuI[fBIgbNƂăCI[fBIƓgbNw肵ꍇ́ATuI[fBI͉Đ܂B
+ * + * TuI[fBIgbNɂ́AZ^[`lu@\Ƃ͈قȂ`l̐͂܂B + * mAXeIA5.1ch ̂̃gbNTuI[fBIƂĎgp邱Ƃł܂B
+ * + * :
+ * TuI[fBI@\́A CriMvEasyPlayer::ReplaceCenterVoice() ɂZ^[`lu@\Ƃ + * Ɏgpł܂B
+ * + * \sa CriMvEasyPlayer::AttachSubAudioInterface() + */ + // default value is -1. + void SetSubAudioTrack(CriSint32 track, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Retrieves the secondary audio track + * + * \param err Optional error code + * \return track number Current subaudio track number + * + * When you successfully set the subaudio track, this function return the track number + * that you specified by CriMvEasyPlayer::SetSubAudioTrack(). Otherwise, it retuns CRIMV_CENTER_VOICE_OFF. + * + * \sa CriMvEasyPlayer::SetSubAudioTrack() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief TuI[fBIgbN̎擾 + * \param err G[iȗj + * \return gbNԍ ݐݒ肳ĂgbNԍ + * + * TuI[fBIĐLɂȂĂ΁A[UCriMvEasyPlayer::SetSubAudioTrack()Őݒ肵 + * TuI[fBIgbNԍԂ܂B + * + * TuI[fBIĐLłȂꍇATuI[fBIgbNw肵ĂȂꍇ́A + * CRIMV_CENTER_VOICE_OFFԂ܂B + * + * \sa CriMvEasyPlayer::SetSubAudioTrack() + */ + CriSint32 GetSubAudioTrack(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Replaces the center channel of a 5.1ch audio track + * + * \param track Track number to use + * \param err Optional error code + * + * If the current audio track for a movie (set with CriMvEasyPlayer::SetAudioTrack()) is in 5.1ch + * surround sound, the center channel can be replaced with a different, mono, track. This does not + * affect any of the other channels in the 5.1ch track. + * + * If the current audio track is not 5.1ch, or the replacement track is not monaural, this call will + * have no effect. + * + * Passing CRIMV_CENTER_VOICE_OFF as the value of \a track will undo the replacement and revert to + * playing the original center channel of th 5.1ch track. + * + * \remarks + * An EasyPlayer handle can not use center channel replacement and a subaudio interface (see + * CriMvEasyPlayer::AttachSubAudioInterface() and CriMvEasyPlayer::SetSubAudioTrack()) at the same time. + * + * \sa CriMvEasyPlayer::SetAudioTrack(), CriMvEasyPlayer::AttachSubAudioInterface(), + * CriMvEasyPlayer::SetSubAudioTrack() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief Z^[{CX̐ݒ + * \param track {CXgbNԍ + * \param err G[iȗj + * + * 5.1ch I[fBIĐɁAZ^[`lʂ̃mgbNƒu邱Ƃł܂B
+ * {֐́Aup̃mf[^I[fBIgbNݒ肵܂B
+ * 5.1ch BGM ɑ΂āA{CX𕡐ނ獷ւꍇɎgpĂB + * + * ftHg̓Z^[{CXw薳łB + * + * ̊֐gpꍇAC̃I[fBIgbNƂčĐĂ5.1chf[^̃Z^[`l + * ͔jAɃZ^[{CXƂĎw肵f[^܂B + * + * (a) Z^[{CXƂĎgpł̂̓m̃I[fBIłB
+ * (b) Z^[uLȂ̂̓C̃I[fBI5.1ch̏ꍇłB + * + * ̓‚̏𖞂ĂȂꍇ́A{֐Őݒ肵l͖܂B + * + * ftHglɖ߂ꍇ́A`lƂCRIMV_CENTER_VOICE_OFFw肵ĂB + * + * \sa CriMvEasyPlayer::SetAudioTrack(), CriMvEasyPlayer::AttachSubAudioInterface(), + * CriMvEasyPlayer::SetSubAudioTrack() + */ + void ReplaceCenterVoice(CriSint32 track, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets a callback function that will set the movie file + * + * \param func Callback function + * \param usrobj Pointer to user-provided data + * \param err Optional error code + * + * Normally, the movie file is provided directly, via CriMvEasyPlayer::SetFile() or + * CriMvEasyPlayer::SetData(), before playback is started. Setting a file request callback + * allows an application to do \a concatenated \a playback, playing multiple movies, one + * after the other. + * + * If the callback function is set, it will be called when + * + * - The last data chunk of the current movie has been read by EasyPlayer. + * - Any of the playback functions (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), + * or CriMvEasyPlayer::DecodeHeader()) are called and the movie file has not been set. + * + * The callback should call CriMvEasyPlayer::SetFile() or CriMvEasyPlayer::SetData() if the + * application wants to continue playback. Otherwise, playback will end once the callback returns. + * + * The \a usrobj parameter specifies a pointer to arbitrary data, that will be passed as the + * second parameter to the callback. + * + * The prototype of the callback function is + * + * void callback(CriMvEasyPlayer *mveasy, void *usrobj) + * + * where + * + * mveasy is the EasyPlayer object + * usrobj is the pointer to user data that was passed to SetFileRequestCallback(). + * + * \remarks + * In order to do concatenated playback, all movies must have the same + * + * \remarks + * - video resolution + * - framerate + * - video codec + * - audio track structure + * - subtitle structure + * + * \remarks + * The same audio track structure means that all movies must have the same number of tracks, and the + * same track number must be of the same audio type for each movie. For instance, if the first movie has + * 2 audio tracks, with track 1 being stereo and track 2 being mono, then \a all other movies would have + * to have 2 tracks, track 1 stereo and track 2 mono. + * + * \remarks + * Subtitles have to match in the number of channels. For instance, if the first movie had 3 subtitle + * channels, then all other movies would need 3 channels. It is also important to keep the languages on + * the same tracks for each movie, since otherwise the application would get confused. CRI Movie makes + * no assumptions about languages or the interpretation of subtitles; subtitles are simply treated as + * binary data. + * + * \remarks + * Currently, cuepoints are not supported with concatenated playback. + * + * \sa CriMvEasyPlayer::SetFile(), CriMvEasyPlayer::SetData() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief t@CvR[obN֐̓o^ + * \param func t@CvR[obN֐ + * \param usrobj [UIuWFNg + * \param err G[iȗj + * + * [r̘AĐs߂ɁA[rt@CvR[obN֐o^܂B + * ̃R[obN֐͈ȉ̃^C~OŔ܂B + * + * E[rt@CǂݍݏIB
+ * Et@C̎w薳ōĐJnB + * + * t@CvR[obN֐ CriMvEasyPlayer::SetFile() ܂ CriMvEasyPlayer::SetData() + * ĂяoƂŁAAĎ̃[rt@Cw肷邱Ƃł܂B
+ * SetFile() SetData() ĂяoȂꍇ́Aǂݍݍς݂̃[rI + * ĐIɂȂ܂B + * + * t@CvR[obNAR[obN֐̑usrobjɂ́Ao^Ɏw + * [UIuWFNgn܂Bo^t@CXgȂǂ̊ǗɗpĂB + * + * AĐł郀[rt@Cɂ͈ȉ̏܂B
+ * - rfI𑜓x + * - rfĨt[[g + * - rfĨR[fbN + * - I[fBIю̃gbN\ + * + * \sa CriMvEasyPlayer::SetFile(), CriMvEasyPlayer::SetData() + */ + void SetFileRequestCallback(void (*func)(CriMvEasyPlayer *mveasy, void *usrobj), + void *usrobj, CriError &err=CriMv::ErrorContainer); + +#if defined(XPT_TGT_PC) + /*EN + * \ingroup MODULE_OPTION + * \brief Set processor parameters for decoding on PC + * + * \param num_threads Number of additional threads for load distribution in decoding (Maximum 3 threads) + * \param affinity_mask Pointer to an array of thread affinity masks for each thread specified with num_threads. + * \param priority Thread priority of the decoding threads for load balancing + * \param err Optional error code + * + * This function sets the processor parameters for decoding. Use it when you want to change + * processors or thread priority for decoding load distribution. + * + * If this function is called, it must be called before calling any of the playback functions + * (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()). + * + * On initialization, CRI Movie prepares three worker threads for distributed decoding.
+ * + * \a num_threads specifies how many worker threads CRI Movie should use.
+ * \a affinity_mask is an array of affinity masks for the worker threads. This array must have + * \a num_threads many elements. The format of \a affinity_mask is same as for the value passed to the + * Win32 SetThreadAffinityMask() API function.
+ * \a priority is used as the thread priority for all of the threads specified by \a num_threads. + * + * If this function is called, three distributed decoding threads will run in parallel by default. + * Also, processor assignment of the decoding threads is handled by the operating system, and their + * priority will be normal. + * + * To reset the parameters, call this function again, passing CRIMV_DEFAULT_AFFNITY_MASK_PC and + * CRIMV_DEFAULT_THREAD_PRIORITY_PC as the affinity masks and thread priority. + * + * \sa CRIMV_DEFAULT_AFFNITY_MASK_PC, CRIMV_DEFAULT_THREAD_PRIORITY_PC + */ + /*JP + * \ingroup MODULE_OPTION + * \brief PCŃfR[hɎgljvZbTݒ + * \param num_threads וUfR[hpɎgpljXbh̐ (őRj + * \param affinity_masks XbhAtBjeB}XN̔zւ̃|C^Bnum_threadsŎw肵XbhƂ̃}XNlB + * \param priority וUfR[hXbh̗Dx + * \param err G[iȗj + * + * fR[h𕪎Uď邽߂̃vZbTwł܂B + * fR[hɍsvZbTXbhDxύXꍇɎgpĂB + * {֐͍ĐJn(Start, Prepare, DecodeHader)OɌĂяoKv܂B + * + * CRI Movie͏̍ۂɂR‚̕UfR[hp̃[J[Xbhpӂ܂B + * num_threadsŁÂ̂‚̃XbhۂɎgp邩wł܂B + * AvP[V疾IɃvZbT蓖ĂsꍇAX̃Xbhɑ΂ + * AtBjeB}XNݒ肵ĂB + * AtBjeB}XN̒ĺAWin32 APISetThreadAffinityMask̈ƓłB + * XbhDx́Anum_threadsŎw肵fR[hɎgpXbhɑ΂ēKp܂B + * + * ̊֐Ă΂ȂꍇAR‚̃XbhŕfR[hs܂B + * fR[hXbh̃vZbT͊蓖Ă͑SOSCŁADx̓XbhWɂȂ܂B + * + * x{֐ŐݒύXAԂ߂ꍇ́ACRIMV_DEFAULT_AFFNITY_MASK_PC, CRIMV_DEFAULT_THREAD_PRIORITY_PC + * ƂĎw肵AēxĂяoĂB + * + * \sa CRIMV_DEFAULT_AFFNITY_MASK_PC, CRIMV_DEFAULT_THREAD_PRIORITY_PC + */ + void SetUsableProcessors_PC(CriSint32 num_threads, const CriUint32 *affinity_mask, CriSint32 priority, + CriError &err=CriMv::ErrorContainer); + +#endif + +#if defined(XPT_TGT_XBOX360) + /*EN + * \ingroup MODULE_OPTION + * \brief Set processor parameters for decoding + * \param processors_param Processor Parameters + * \param err Optional error code + * + * \brief Set processor parameters for decoding + * \param processors_param Processor Parameters + * \param err Optional error code + * + * This function sets the processor parameters for decoding, along the priority of the + * decoding threads. + * + * If this function is called, it must be called before calling any of the playback functions + * (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()). + * + * If you don't call this function, the EasyPlayer handle uses Processor 3 (Core 0, Thread 0) + * and Processor 5 (Core 0, Thread 0). + * + * \sa CriMvProcessorParameters_XBOX360 + */ + /*JP + * \ingroup MODULE_OPTION + * \brief Xbox360ŃfR[hɎgvZbTݒ + * \param processors_param gpvZbTp[^ + * \param err G[iȗj + * + * fR[hɎgpvZbTw肵܂B
+ * {֐͍ĐJn(Start, Prepare, DecodeHader)OɌĂяoKv܂B + * + * ܂AfR[hɎgpXbh̗Dx̐ݒ肪o܂B + * + * ftHg̃vZbTݒł́AvZbTR(RA1Xbh1)ƃvZbTT + * (RA2Xbh1)gp܂B + * + * \sa CriMvProcessorParameters_XBOX360 + */ + void SetUsableProcessors_XBOX360(const CriMvProcessorParameters_XBOX360 *processors_param, + CriError &err=CriMv::ErrorContainer); +#endif + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the frame where playback will start + * + * \param seek_frame_id Frame (0-based) to start playing from + * \param err Optional error code + * + * To play a movie from other than the first frame, call this function before starting playback. + * To seek to a new frame when the movie is already playing, call CriMvEasyPlayer::Stop() and wait + * for the handle to change to the MVEASY_STATUS_STOP state, call this function with the desired + * frame number, then call CriMvEasyPlayer::Start() again. + * + * Valid values for seek_frame_id are from 0 to \a num_frames - 1, where \a num_frames can be found by + * + *
+	 *
+	 *   CriMvStreamingParameters streaming_params;
+	 *   CriSint32                num_frames;
+	 *
+	 *   GetMovieInfo(streaming_params);
+	 *   num_frames = streaming_params.video_prm[0].total_frames;
+	 *
+	 * 
+ * + * Refer to \ref usr_mech7 for more information. + * + * \remarks + * If the value of \a seek_frame_id is out of range, playback will start from frame 0. + * + * \sa CriMvStreamingParameters + */ + /*JP + * \ingroup MODULE_OPTION + * \brief V[NĐJnʒu̐ݒ + * \param seek_frame_id V[NĐJnt[ԍiO`j + * \param err G[iȗj + * + * V[NĐJnt[ԍw肵܂B + * + * ĐJnO( CriMvEasyPlayer::Prepare()܂ CriMvEasyPlayer::Start()ĂяoO)ɖ{֐sĂB + * ܂Å֐̓[r̍ĐɌĂяoƂ͏o܂BĐɃV[Nꍇ́AxĐ~Ă + * {֐ĂяoĂB + * + * {֐sȂꍇA܂̓t[ԍOw肵ꍇ̓[r̐擪ĐJn܂B + * w肵t[ԍA[rf[^̑t[傫蕉̒lꍇ[r̐擪Đ܂B + * + * \ref usr_mech7 킹ĎQƂĂB + * + */ + void SetSeekPosition(CriSint32 seek_frame_id, CriError &err=CriMv::ErrorContainer); + + /*EN + * + * \brief Calculates a frame ID from a frame time + * + * \param count Timer counter + * \param unit Counter increment per second + * \param err Optional error code + * + * \return Frame ID corresponding to given time + * + * Each frame of a movie corresponds to a particular display time, based on the framerate. Given a + * time from the start of playback, this function will return the ID of the specific frame that should + * be displayed, barring any delays or skipped frames, at that time. + * + * The time, in seconds, is specified by \a count / \a unit.
+ * + * This function can be used for, among other things, jumping to a particular frame when a cuepoint is reached. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvEasyPlayer::CalcTimeFromFrameId(); + */ + /*JP + * \ingroup MODULE_OPTION + * \brief Đt[ԍ̌vZ + * \param count ^C}JEg + * \param unit Pb̃^C}JEglBcount unit ŕbPʂ̎ƂȂ܂B + * \param err G[iȗj + * \return frame ID + * + * Đt[ԍvZ܂B + * ̊֐́AEasyPlayernh̏Ԃ MVEASY_STATUS_WAIT_PREP ȍ~ɂȂƂɎgpł܂B + * + * V[NĐJnʒuAvZƂɎgpĂB + * iႦ΃L[|Cg񂩂V[Nʒu肷ꍇȂǁBj + * + * \sa CriMvEasyPlayer::CalcTimeFromFrameId(); + */ + CriSint32 CalcFrameIdFromTime(CriUint64 count, CriUint64 unit, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Calculates a frame time from a frame ID + * + * \param frame_id Frame ID + * \param unit Counter increment per second + * \param err Optional error code + * + * \return Timer counter corresponding to given frame ID + * + * Each frame of a movie corresponds to a particular display time, based on the framerate. Given a + * frame ID and the number of timer intervals per second, this function will return the timer count + * of the display time for that frame. + * + * The display time, in seconds, for this frame is calculated by dividing the timer count by the timer + * interval. + * + * If you have the movie frame, you do not have to calculate the time. The \a time and \a tunit fields + * of the CriMvFrameInfo structure that is passed the GetFrameOnTimeXXX() and DiscardNextFrame() + * functions will contain this information. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvEasyPlayer::CalcFrameIdFromTime(), CriMvFrameInfo + */ + /*JP + * \ingroup MODULE_OPTION + * \brief t[ԍĐ̌vZ + * \param frame_id frame ID + * \param unit Pb̃^C}JEglBcount unit ŕbPʂ̎ƂȂ܂B + * \param err G[iȗj + * \return ^C}JEg + * + * t[ԍĐvZ܂B + * ̊֐́AEasyPlayernh̏Ԃ MVEASY_STATUS_WAIT_PREP ȍ~ɂȂƂɎgpł܂B + * + * ۂɃt[擾ꍇ́AvZ̕Kv͂܂Bt[\̂̎QƂĂB + * + * \sa CriMvEasyPlayer::CalcFrameIdFromTime(), CriMvFrameInfo + */ + CriUint64 CalcTimeFromFrameId(CriSint32 frame_id, CriUint64 unit, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Find the next event point, if any, after the given time counter + * + * \param count Timer counter + * \param unit Counter increment per second + * \param type Type of event point to look for + * \param eventinfo Returned event point information structure + * \param err Optional error code + * + * \return Frame ID corresponding to given time + * + * Event points allow an application to associate arbitrary actions with specific points in a movie. + * This function will search forward in the movie for the next event point after the given time + * (specifed as \a count / \a unit). If an event point is found, \a eventinfo will be populated with + * the information about the event point, and the function will return the corresponding frame ID. + * + * \a type is an application-defined value that can be used to categorize event points, and is specified + * when the movie is encoded (see link to event-point-specification-section for more information + * about creating event points.). If -1 is passed as the value of \a type, all event points will be + * searched. Otherwise, only matching event point types will be searched. + * + * If no event point of the requested type is found, this function will return -1. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvEasyPlayer::SearchPrevEventPointByTime(); + */ + /*JP + * \ingroup MODULE_OPTION + * \brief w莞̃Cxg|Cǧ + * \param count ^C}JEg + * \param unit Pb̃^C}JEglBcount unit ŕbPʂ̎ƂȂ܂B + * \param type ΏۂƂCxg|Cgtypel + * \param eventinfo Cxg|Cg̏ + * \param err G[iȗj + * \return frame ID + * + * w莞̎ɂCxg|CgACxg|Cgƃt[ԍ擾܂B + * ̊֐́AEasyPlayernh̏Ԃ MVEASY_STATUS_WAIT_PREP ȍ~ɂȂƂɎgpł܂B + * + * ̑ΏۂƂȂ̂ type Ŏw肵lvCxg|CgłB + * type -1w肵ꍇ́ASẴCxg|CgΏۂƂȂ܂B + * + * ΏۂƂȂCxg|CgłȂꍇ́At[ԍ-1Ԃ܂B + * + * \sa CriMvEasyPlayer::SearchPrevEventPointByTime(); + */ + CriSint32 SearchNextEventPointByTime(CriUint64 count, CriUint64 unit, CriSint32 type, + CriMvEventPoint &eventinfo, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Find the previous event point, if any, before the given time counter + * + * \param count Timer counter + * \param unit Counter increment per second + * \param type Type of event point to look for + * \param eventinfo Returned event point information structure + * \param err Optional error code + * + * \return Frame ID corresponding to given time + * + * Event points allow an application to associate arbitrary actions with specific points in a movie. + * This function will search backward in the movie (i.e. towards the beginning) for the next event + * point before the given time (specifed as \a count / \a unit). If an event point is found, + * \a eventinfo will be populated with the information about the event point, and the function will + * return the corresponding frame ID. + * + * \a type is an application-defined value that can be used to categorize event points, and is specified + * when the movie is encoded (see link to event-point-specification-section for more information + * about creating event points.). If -1 is passed as the value of \a type, all event points will be + * searched. Otherwise, only matching event point types will be searched. + * + * If no event point of the requested type is found, this function will return -1. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvEasyPlayer::SearchNextEventPointByTime(); + */ + /*JP + * \ingroup MODULE_OPTION + * \brief w莞ÕCxg|Cǧ + * \param count ^C}JEg + * \param unit Pb̃^C}JEglBcount unit ŕbPʂ̎ƂȂ܂B + * \param type ΏۂƂCxg|Cgtypel + * \param eventinfo Cxg|Cg̏ + * \param err G[iȗj + * \return frame ID + * + * w莞̎OɂCxg|CgACxg|Cgƃt[ԍ擾܂B + * ̊֐́AEasyPlayernh̏Ԃ MVEASY_STATUS_WAIT_PREP ȍ~ɂȂƂɎgpł܂B + * + * ̑ΏۂƂȂ̂ type Ŏw肵lvCxg|CgłB + * type -1w肵ꍇ́ASẴCxg|CgΏۂƂȂ܂B + * + * ΏۂƂȂCxg|CgłȂꍇ́At[ԍ-1Ԃ܂B + * + * \sa CriMvEasyPlayer::SearchNextEventPointByTime(); + */ + CriSint32 SearchPrevEventPointByTime(CriUint64 count, CriUint64 unit, CriSint32 type, + CriMvEventPoint &eventinfo, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Gets the list of all event points in the movie + * + * \param err Optional error code + * + * \return Pointer to the list of event points, or NULL if there are no event points + * + * CRI Movie considers a cue point list to be the number of event points in a movie, and a pointer to + * an array of event point structures. Event points allow an application to associate arbitrary actions + * with specific points in a movie. + * + * The returned pointer points to an area inside of the EasyPlayer's work buffer. An application should + * not attempt to write to it. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * The returned information is valid through the MVEASY_STATUS_STOP state. Once the EasyPlayer handle + * has been destroyed, or the movie has been restarted (by calling CriMvEasyPlayer::Start(), + * CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()), the cuepoint information will be + * invalid. + * + */ + /*JP + * \ingroup MODULE_OPTION + * \brief L[|CgiCxg|Cgꗗj̎擾 + * \param err G[iȗj + * \return Cue point info (Event point list) + * + * L[|CgiCxg|Cgꗗj擾܂B + * ̊֐́AEasyPlayernh̏Ԃ MVEASY_STATUS_WAIT_PREP ȍ~ɂȂƂɎgpł܂B + * + * ̊֐Ŏ擾L[|CǵAĐnh̃[Nobt@𒼐ڎQƂĂ܂B
+ * Đ~Ԃł̎QƂ͉”\łA̍ĐJn͎QƂ֎~܂B
+ * ̃L[|Cgʂ̃ɃRs[ꍇ͕̏ς܂B + * + */ + CriMvCuePointInfo* GetCuePointInfo(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets a function that will be called when a cue point is reached + * + * \param func Callback function + * \param usrobj Pointer to user-provided data + * \param err Optional error code + * + * Beginning with version 2.0, CRI Movie allows a movie to specify arbitrary actions to + * happen at various points on the timeline. These are referred to as \a cue \a points, or, + * more generally, as \a event \a points. If a cue point callback has been installed for the + * movie, it will be called whenever a cuepoint has been reached. + * + * The \a usrobj parameter specifies a pointer to arbitrary data, that will be passed as the + * third parameter to the callback. + * + * The prototype of the callback function is + * + * void callback(CriMvEasyPlayer *mveasy, CriMvEventPoint *eventinfo, void *usrobj) + * + * where + * + * mveasy is the EasyPlayer object
+ * eventinfo is the event info structure that was reached
+ * usrobj is the pointer to user data that was passed to SetFileRequestCallback().
+ * + * \remarks + * Do not call any movie playback functions (for example, CriMvEasyPlayer::Stop()) from the callback + * function. If you need to do this, set a flag from the callback and refer to it in your main loop. + * + * \sa CriMvEventPoint + */ + /*JP + * \ingroup MODULE_OPTION + * \brief L[|CgR[obN֐̓o^ + * \param func L[|CgR[obN֐ + * \param usrobj [UIuWFNg + * \param err G[iȗj + * + * L[|Cg̃R[obN֐o^܂B + * ̃R[obN֐́A[r̍ĐeCxg|CgŎw肳ꂽo߂ɔ܂B + * R[obN֐̌Ăяo CriMvEasyPlayer::Update() s܂B + * + * L[|CgR[obNAR[obN֐̑Q eventinfo ɂ̓Gxg|Cg񂪁A + * Rusrobjɂ́Ao^Ɏw肵[UIuWFNgn܂B + * + * L[|CgR[obN֐ł́A[rĐRg[֐iႦ CriMvEasyPlayer::Stop()j + * ĂяoĂ͂܂B + * + * \sa CriMvEventPoint + */ + void SetCuePointCallback(void (*func)(CriMvEasyPlayer *mveasy, CriMvEventPoint *eventinfo, void *usrobj), + void *usrobj, CriError &err=CriMv::ErrorContainer); + + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Resets movie handle parameters to their default values + * + * \param err Optional error code + * + * This function will reset most parameters back to their default values. Call this when you are + * reusing an EasyPlayer handle and need to quickly undo changes to a number of parameters. + * + * Note that this will not remove a subaudio interface (set by CriMvEasyPlayer::AttachSubAudioInterface()). + * CriMvEasyPlayer::DetachSubAudioInterface() must be called instead. + * + * \remarks + * This function can be called once the EasyPlayer handle status is either MVEASY_STATUS_STOP or + * MVEASY_STATUS_PLAYEND. + * + * + *
Setting API Reset by ResetAllParameters() Reset by Stop() + *
SetFile YES (*1) + *
SetData YES (*1) + *
Pause YES YES + *
SetMasterTimer YES NO + *
SetNumberOfFramePools YES NO + *
SetBufferingTime YES NO + *
SetReloadThresholdTime YES NO + *
SetMaxBitrate YES NO + *
SetAudioTrack YES NO + *
SetLoopFlag YES NO + *
SetStreamingParameters YES NO + *
AttachSubAudioInterface NO NO + *
SetSubAudioTrack YES NO + *
ReplaceCenterVoice YES NO + *
SetFileRequestCallback YES NO + *
SetSeekPosition YES NO + *
SetCuePointCallback YES NO + *
+ * + * (*1) Normally, values set by SetFile() or SetData() are not reset by a call to Stop(). However, + * if a file request callback has been set (via CriMvEasyPlayer::SetFileRequestCallback()), this + * setting will be reset. + * + * \sa CriMvEasyPlayer::Stop(), CriMvEasyPlayer::SetFileRequestCallback() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief p[^̃Zbg + * \param err G[iȗj + * + * Đnhɐݒ肳ꂽp[^ނZbg܂B
+ * TuI[fBIpC^tF[X̓Zbg܂̂ŁAAvP[VŖI + * CriMvEasyPlayer::DetachSubAudioInterface() ĂяoĂB + * + * {֐̓nhԂ MVEASY_STATUS_STOP ܂ MVEASY_STATUS_PLAYEND ̎ɌĂяoĂB + * + * + *
ݒ֐ ResetAllParametersɂ
Zbg
Stopɂ
Zbg + *
SetFile o (*1) + *
SetData o (*1) + *
Pause o o + *
SetMasterTimer o x + *
SetNumberOfFramePools o x + *
SetBufferingTime o x + *
SetReloadThresholdTime o x + *
SetMaxBitrate o x + *
SetAudioTrack o x + *
SetLoopFlag o x + *
SetStreamingParameters o x + *
AttachSubAudioInterface x x + *
SetSubAudioTrack o x + *
ReplaceCenterVoice o x + *
SetFileRequestCallback o x + *
SetSeekPosition o x + *
SetCuePointCallback o x + *
+ * (*1) ʏ̓Zbg܂Bt@CvR[obNo^Ăꍇ̓Zbg܂B + * + * \sa CriMvEasyPlayer::Stop() + */ + void ResetAllParameters(CriError &err=CriMv::ErrorContainer); + + /* Đp[Nobt@щʃW[̉iIȌĂяopj */ + void ReleasePlaybackWork(CriError &err=CriMv::ErrorContainer); + +public: /* for DEBUG */ + /*//EN + * \ingroup MODULE_OPTION + * + * \brief Sets the maximum movie data read size + * + * \param max_chunk_size The maximum read size, in bytes + * \param err Optional error code + * + * This is a DEBUG function and should not normally need to be used by applications. + * + * Sets the maximum read size. CRI Movie will attempt to read this many bytes each time it + * needs to load more movie data from disk. + * + * If this function is called, it must be called before calling any of the playback functions + * (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()). + * + * To revert to the default behavior, pass 0 as \a max_chunk_size. + * + * \remarks + * If this function is called, the new value for \a max_chunk_size will not be reflected in the + * CriMvStreapingParameters structure. A call to CriMvEasyPlayer::GetMovieInfo() will return the + * original value that was set in the movie header. + * + * \remarks + * If you call CriMvEasyPlayer::SetStreamingParameters(), this function can not be used. + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::SetMinBufferSize() + */ + /*//JP + * \ingroup MODULE_OPTION + * \brief ő`NTCY̎w + * \param max_chunk_size ő`NTCY[byte] + * \param err G[iȗj + * + * [rf[^̍ő`NTCYw肵܂B
+ * ݂̃Cuł́A{֐̓AvP[VgpKv͂܂B
+ * + * {֐Őݒ肵ő`NTCÝACriMvEasyPlayer::GetMovieInfo ֐Ŏ擾郀[rɂ͔f܂B + * CriMvEasyPlayer::GetMovieInfo ֐Ŏ擾ł̂̓[rf[^̖{̏łB
+ * + * {֐̌ĂяóA CriMvEasyPlayer::Prepare ֐܂ CriMvEasyPlayer::Start ֐̑O܂łɎsĂB + * + * ő`NTCY 0w肵ꍇAő`NTCY̓[rf[^̎’lƂȂ܂B
+ * ܂AAvP[V CriMvEasyPlayer::SetStreamingParameters ֐Ăяoꍇ͖{֐ + * ݒ肵lA CriMvEasyPlayer::SetStreamingParameters ֐̎w肪D悳܂B + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::SetMinBufferSize() + */ + void SetMaxChunkSize(CriUint32 max_chunk_size, CriError &err=CriMv::ErrorContainer); + + /*//EN + * \ingroup MODULE_OPTION + * + * \brief Sets the minimum movie data buffer size + * + * \param min_buffer_size The minimum buffer size, in bytes + * \param err Optional error code + * + * This is a DEBUG function and should not normally need to be used by applications. + * + * Sets the minimum buffer size used for reading movie data from disk. + * + * If this function is called, it must be called before calling any of the playback functions + * (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()). + * + * To revert to the default behavior, pass 0 as \a max_chunk_size. + * + * \remarks + * If this function is called, the new value for \a min_buffer_size will not be reflected in the + * CriMvStreapingParameters structure. A call to CriMvEasyPlayer::GetMovieInfo() will return the + * original value that was set in the movie header. + * + * \remarks + * If you call CriMvEasyPlayer::SetStreamingParameters(), this function can not be used. + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::SetMaxChunkSize() + */ + /*//JP + * \ingroup MODULE_OPTION + * \brief ŏobt@TCY̎w + * \param min_buffer_size ŏobt@TCY[byte] + * \param err G[iȗj + * + * [rf[^̍ŏobt@TCYw肵܂B
+ * ݂̃Cuł́A{֐̓AvP[VgpKv͂܂B
+ * + * {֐Őݒ肵ŏobt@TCÝACriMvEasyPlayer::GetMovieInfo ֐Ŏ擾郀[rɂ͔f܂B + * CriMvEasyPlayer::GetMovieInfo ֐Ŏ擾ł̂̓[rf[^̖{̏łB
+ * + * {֐̌ĂяóA CriMvEasyPlayer::Prepare ֐܂ CriMvEasyPlayer::Start ֐̑O܂łɎsĂB + * + * ŏobt@TCY 0w肵ꍇAŏobt@TCY̓[rf[^̎’lƂȂ܂B
+ * ܂AAvP[V CriMvEasyPlayer::SetStreamingParameters ֐Ăяoꍇ͖{֐ + * ݒ肵lA CriMvEasyPlayer::SetStreamingParameters ֐̎w肪D悳܂B + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::SetMaxChunkSize() + */ + void SetMinBufferSize(CriUint32 min_buffer_size, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Retrieves various movie playback statistics + * + * \param playinfo Playback statistics structure + * \param err Optional error code + * + * This is a DEBUG function and is not normally needed by applications. + * + * Retrieves a number of performance statistics dealing with movie playback, including how often + * a frame could not be retrieved and how close the plaback framerate is to the movie's expected + * playback. + * + * This information is updated on every call to CriMvEasyPlayer::IsNextFrameOnTime(). In order for + * the values to be accurate, an application should call IsNextFrameOnTime() once each time through + * its main loop. Calling IsNextFrameOnTime() too often or not often enough will result in + * misleading statistics. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief [rĐ̎擾 + * \param playinfo [riԂlj + * \param err G[iȗj + * + * {֐͒ʏAAvP[V͎gp܂BfobOp̊֐łB + * + * ݍĐĂ郀[r̍Đ CriMvPlaybackInfo \̂擾ł܂B
+ * ̏񂩂rfIt[̎擾ԊuArfIt[̃fR[hxȂǂm邱Ƃł܂B
+ * + * Đ̓AvĂяo CriMvEasyPlayer::IsNextFrameOnTime() ōXV܂B
+ * AvP[V CriMvEasyPlayer::IsNextFrameOnTime()ĂяoȂꍇAC[vŕ + * Ăяoꍇ͏񂪐XVȂ̂ŒӂĂB
+ * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + void GetPlaybackInfo(CriMvPlaybackInfo & playinfo, CriError & err = CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Gets the result of the last attempt to retrieve a video frame + * + * \param err Optional error code + * + * \return The result of the last frame retrieval + * + * Returns one of the following values: + * + * + * + * + * + * + * + *
Value Meaning
CRIMV_LASTFRAME_OK The frame was successfully retrieved.
CRIMV_LASTFRAME_TIME_EARLY It is too soon to display this frame. The frame time + * is greater than the current playback time.
CRIMV_LASTFRAME_DECODE_DELAY The frame has not been decoded yet, or CRI Movie is not + * done decoding it.
CRIMV_LASTFRAME_DISCARDED The frame was discarded, by calling + * CriMvEasyPlayer::DiscardNextFrame()
+ * + * \remarks + * The result is determined by calling CriMvEasyPlayer::IsNextFrameOnTime(), not the GetFrameOnTimeXXX() + * functions. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::DiscardNextFrame() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ÕrfIt[擾̌ʂ擾 + * \param err G[iȗj + * \return t[擾ʂ̗񋓒l + * + * {֐͒ʏAAvP[V͎gp܂BfobOp̊֐łB + * + * ÕrfIt[擾̌ʂԂ܂B + * rfIt[̃fR[hԂɍĂ̂ǂ`FbN邱Ƃo܂B + * + * :
+ * rfIt[擾̌ʂƂ́A{IɃAvP[VĂяo CriMvEasyPlayer::IsNextFrameOnTime() ̌ʂ + * XV܂BGetFrameOnTime֐̌ʂł͂܂B + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriMvLastFrameResult GetLastFrameResult(CriError & err = CriMv::ErrorContainer); + + /* [Unofficial] */ + /* Set the number of decoded frames to keep internally during the MVEASY_STATUS_PREP status. */ + /* Adjust the number if you need to reduce latesy for the first frame */ + void SetNumberOfFramesForPrep(CriUint32 num_frames, CriError & err = CriMv::ErrorContainer); + + /* [Unofficial] + * \ingroup MODULE_OPTION + * \brief ĐI/~ʒmR[obN֐̓o^ + * \param func ĐI/~ʒmR[obN֐ + * \param usrobj [UIuWFNg + * \param err G[iȗj + * + * ĐIэĐ~ʒmR[obN֐o^܂B + * ̃R[obN֐́Awb_/Đ/ĐԂĐ~/ĐIԂ + * JڂɈxĂяo܂B + * R[obN֐̌Ăяo CriMvEasyPlayer::Update() s܂B + * + * o^R[obN֐ł́A[rĐRg[֐iႦ CriMvEasyPlayer::Stop()j + * ĂяoĂ͂܂B + * + * : MVEASY_STATUS_PLAYENDԂMVEASY_STATUS_STOPԂւ̑Jڎɂ̓R[obN֐͌Ăяo܂B + */ + void SetStopCompleteCallback(void (*func)(CriMvEasyPlayer *mveasy, void *usrobj), + void *usrobj, CriError &err=CriMv::ErrorContainer); + + /* For FAST_LATENCY */ + /*************************************************************************************/ + /* RtBOw̃nh쐬֐ */ + static CriMvEasyPlayer* CRIAPI Create(CriHeap heap, + CriMvHandleConfig *config, + CriMvFileReaderInterface *freader, + CriMvSystemTimerInterface *stimer, + CriMvSoundInterface *sound, + CriError &err=CriMv::ErrorContainer); + + /* For Sofdec2 */ + /*************************************************************************************/ + enum MetaFlag { + MVEASY_META_FLAG_CUE = 0x0001, + MVEASY_META_FLAG_SEEK = 0x0002, + MVEASY_META_FLAG_ALL = MVEASY_META_FLAG_CUE + MVEASY_META_FLAG_SEEK, + + /* Keep enum 4bytes */ + MVEASY_META_FLAG_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + enum ReferFrameResult { + MVEASY_REFER_FRAME_RESULT_OK = (1), + MVEASY_REFER_FRAME_RESULT_SHORT_INPUT = (2), + MVEASY_REFER_FRAME_RESULT_SHORT_CPUTIME = (3), + MVEASY_REFER_FRAME_RESULT_DEMUX_STUCK = (4), + + /* Keep enum 4bytes */ + MVEASY_REFER_FRAME_RESULT_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /* [Ũ[N̈nŁAnh쐬֐ */ + static CriMvEasyPlayer* CRIAPI Create(void *work, CriSint32 work_size, + CriMvHandleConfig *config, + CriMvFileReaderInterface *freader, + CriMvSystemTimerInterface *stimer, + CriMvSoundInterface *sound, + CriError &err=CriMv::ErrorContainer); + + /* Đp[N̈TCY̌vZ */ + CriSint32 CalcPlaybackWorkSize(const CriMvStreamingParameters *stmprm, CriError & err = CriMv::ErrorContainer); + + /* Đp[N̈̐ݒ֐ */ + void SetPlaybackWork(void *work, Sint32 work_size, CriError & err = CriMv::ErrorContainer); + + /* ^f[^[NpR[obN֐ */ + void SetMetaDataWorkAllocator(CriMvMetaDataWorkMallocFunc allocfunc, CriMvMetaDataWorkFreeFunc freefunc,void *usrobj, CriMvMetaFlag meta_flag); + + /* Ŏw肵t[̕\ */ + CriBool IsFrameOnTime(const CriMvFrameInfo *frameinfo, CriError &err=CriMv::ErrorContainer); + + /* t[̎QƁ@*/ + ReferFrameResult ReferFrame(CriMvFrameInfo &frameinfo, CriError &err=CriMv::ErrorContainer); + + /* YUV•ʃobt@tH[}bgł̃obt@擾 */ + CriBool LockFrameYUVBuffersWithAlpha(CriMvYuvBuffers &yuvbuffers, CriMvFrameInfo &frameinfo, CriMvAlphaFrameInfo &alpha_frameinfo, CriError &err=CriMv::ErrorContainer); + + /* LockFrameYUVBuffersWithAlphaŃbNt[̉ */ + CriBool UnlockFrameBufferWithAlpha(CriMvFrameInfo *frameinfo, CriMvAlphaFrameInfo *alpha_frameinfo, CriError &err=CriMv::ErrorContainer); + + /* 32bitARGBobt@tH[}bgւ̃Rs[֐ */ + CriBool CopyFrameToBufferARGB32(CriUint8 *dstbuf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *srcbufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf, CriError &err=CriMv::ErrorContainer); + + /* 32bitARGBobt@tH[}bgփ݂̂̃Rs[֐ */ + CriBool CopyAlphaToBufferARGB32( + const CriMvFrameInfo *src_vinf, + CriUint8 *dst_buf, + CriUint32 dst_pitch, + CriUint32 dst_bufsize, + CriError &err=CriMv::ErrorContainer + ); + +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_PC)|| defined(XPT_TGT_TRGP6K) + CriBool CopyFrameToBufferRGB565(CriUint8 *dstbuf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *srcbufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf, CriError &err=CriMv::ErrorContainer); +#endif + + /* YUV•ʃobt@tH[}bg̃Rs[֐ */ + CriBool CopyFrameToBuffersYUV(CriMvYuvBuffers *dstbufs, + const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf, CriError &err=CriMv::ErrorContainer); + + /* [hobt@TCY̋w */ + void SetReadBufferSize(CriUint32 buffer_size, CriError &err=CriMv::ErrorContainer); + + CriUint32 GetMinBufferSize(CriError &err=CriMv::ErrorContainer); + /**************************************************************************************/ + void SetVideoFramerate(CriUint32 framerate_n, CriUint32 framerate_d); + + void SetCompareFrameTimeCallback( + CriBool (*func)(CriMvEasyPlayer *mveasy, CriMvFrameInfo *frameinfo, CriUint64 count, CriUint64 unit, void *usrobj), + void *usrobj, CriError &err=CriMv::ErrorContainer); + void SetSeekFrameAndOffset(CriSint32 seek_frame_id, CriUint64 seek_byte, CriError &err=CriMv::ErrorContainer); + + enum InputMode { + MVEASY_INPUT_UNDEFINED, + MVEASY_INPUT_STREAMING, /* Xg[~O */ + MVEASY_INPUT_MEMORY, /* ڎQƁijrij */ + + /* Keep enum 4bytes */ + MVEASY_INPUT_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + /* : ̊֐̂߂ InputMode `bpublicֈړ */ + void SetMemoryPlaybackType(InputMode memplay_type, CriError &err=CriMv::ErrorContainer); + + /* fR[hXLbv̎s[h */ + //void SetAutoSkipDecode(CriBool sw, CriFloat32 margin_msec, CriError &err=CriMv::ErrorContainer) + + /* t@Cv̍ăR[obNv */ + void DeferFileRequest(CriError &err=CriMv::ErrorContainer); + + /* for specific use */ + void SetHeaderAndBodyData(const CriUint64Adr header_ptr, CriSint64 header_size, + const CriUint64Adr body_ptr, CriSint64 body_size); + CriSint32 CalcFramepoolWorkSize(const CriMvStreamingParameters *stmprm, CriError & err = CriMv::ErrorContainer); + void SetFramepoolWork(void *work, CriSint32 work_size, CriError & err = CriMv::ErrorContainer); + void SetFramepoolWorkAllocator(CriMvFramepoolWorkMallocFunc allocfunc, CriMvFramepoolWorkFreeFunc freefunc, void *usrobj); + void SetCapacityOfPictureSize(CriSint32 video_picsize, CriSint32 alpha_picsize, CriError &err); + void GetUsrCapacityOfPictureSize(CriSint32 *video_picsize, CriSint32 *alpha_picsize); + void SetMaxMovieSize(CriUint32 max_width, CriUint32 max_height, CriError &err); + void GetMaxMovieSize(CriUint32 *max_width, CriUint32 *max_height); + CriBool PlaybackResourceAllocated() const; + CriBool CanReusePlaybackResource(const CriMvStreamingParameters *stmprm) const; + CriBool GetReusePlaybackResourceFlag() const; + +private: + /* CRI internal use only */ + + void initializeHandleParameters(void); + void initializeCompareFrameParameters(void); + void resetHandleParameters(void); + CriBool startInputAndDecoding(void); + CriBool isEndReadFile(void); + void reinputDataForLooping(void); + void executeFileCloseServer(void); + void supplyDataFromStreamer(void); + void executeFileReadServer(void); + void executeFileOpenServer(void); + void executeCuePointServer(void); + //void executeAutoSkipDecode(void); + void executeWaitStatusServer(CriError &err = CriMv::ErrorContainer); + void surveilTerminationInput(void); + CriBool isAvailableCenterVoice(const CriMvStreamingParameters *stmprm); + CriBool isAvailableSubAudio(const CriMvStreamingParameters *stmprm); + CriBool attachCenterVoice(void); + void detachCenterVoice(void); + + CriBool attachSubAudioHandle(CriHeap heap); + void detachSubAudioHandle(void); + + void getAudioTime(CriUint64 &out_count, CriUint64 &out_unit, CriUint64 s_count, CriUint64 s_unit); + + CriBool allocAndCreateModules(void); + void startModules(void); + void requestStopModules(void); + CriBool closeFileIfOpening(void); + CriBool isCompleteStopModules(void); + void tryCleanupModules(CriMvPlyStatus mvstat); + CriBool tryFreeAndDestroySubmodules(void); + void freeAndDestroyModules(void); + + CriUint32 adjustNumTrackAudioOut(void); + + /* Xg[~Op̃p[^擾 */ + /* GetMovieInfo()Ƃ̈Ⴂ̓[Uwlǂ܂Ŕf邩B + * Ⴆ΁Aő`NTCY͂̊֐ł̓[UwlƂ邪AGetMovieInfoƃt@C̒lB + * ̊֐́AʼnʃW[쐬уmۂ鎞ɎgB */ + CriBool GetStreamingParameters(CriMvStreamingParameters &stmprm, CriError &err=CriMv::ErrorContainer); + + void setNormalErrorStatus(const CriChar8 *errmsg); + + CriBool compareFrameTimeSimple(CriMvEasyPlayer *mveasy, CriMvFrameInfo *frameinfo, CriUint64 count, CriUint64 unit, void *usrobj); + static CriBool compareFrameTimeFluctuation(CriMvEasyPlayer *mveasy, CriMvFrameInfo *frameinfo, CriUint64 count, CriUint64 unit, void *usrobj); + + Bool isNextFrameOnTime(CriBool update_stats, CriError &err); + Bool checkFrameTime(CriMvFrameInfo *frameinfo); + void updateGetFrameInfo(CriBool time_ready, CriBool acquired_frame, CriBool discard_frame, CriUint64 frame_count, CriUint64 frame_unit); + + /* for DEBUG */ + void crimveasy_SetSeekInfo(void); + + void executeUpdate(CriError &err); + +private: + static CriUint32 crimveasy_SupplyPcmDataByFloat32(void *obj, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_SupplyPcmDataBySint16(void *obj, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_CalcAvailableNumSmpls(CriMvEasyPlayer *mveasy); + static CriUint32 crimveasy_GetWave16(CriMvEasyPlayer *mveasy, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_GetWave32(CriMvEasyPlayer *mveasy, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl); + + static CriUint32 crimveasy_SupplySubAudioDataByFloat32(void *obj, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_GetSubAudioWave32(CriMvEasyPlayer *mveasy, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_SupplySubAudioDataBySint16(void *obj, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_GetSubAudioWave16(CriMvEasyPlayer *mveasy, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl); + +public: + CriMvPly mvply; /* Temporally allowed to access for debug */ + +private: + CriHeap heap; + CriBool user_stmprm_flag; + CriMvStreamingParameters stmprm; + CriBool alloced_submodules_flag; + CriMvFrameInfo frameinfo; + CriMvAlphaFrameInfo alpha_frame; + CriMvFileReaderInterface *freader; + CriMvSoundInterface *sndout; + CriMvSystemTimerInterface *stimer; + TimerType timertype; + Status pre_ezstat; + CriBool req_decode_header_flag; + CriBool req_prepare_flag; + CriBool pause_flag; + CriUint32 npools; + CriSint32 track_play_audio; + CriUint32 num_track_audio_data; + CriUint32 num_track_audio_out; + CriBool loop_flag; + CriUint64 time_count; + CriUint64 time_unit; + CriSint64 total_read; + CriSint64 fsize_byte; + CriChunk read_crick; + CriBool exe_open; + CriBool exe_close; + CriBool exe_read; + + CriUint64 time_syslog_count; /* VXe^C}̋L^ */ + CriUint64 time_syslog_unit; + CriUint64 time_ofs_count; /* I[fBIĨVXe^C} */ + CriUint64 time_ofs_unit; + CriUint64 time_prev_audio_count; /* I[fBIω`FbNp */ + CriUint64 time_prev_audio_unit; + + CriFloat32 user_buffering_sec; /* 0.0f means AUTO */ + CriUint32 user_max_bitrate; /* 0 means AUTO */ + CriUint32 user_max_chunk_size; /* 0 means AUTO */ + CriUint32 user_min_buffer_size; /* 0 means AUTO */ + CriSint32 user_read_buffer_size; /* CRIMV_READ_BUFFER_SIZE_AUTO means AUTO */ + CriSint32 user_video_capacity_of_picsize; /* 0 means AUTO */ + CriSint32 user_alpha_capacity_of_picsize; /* 0 means AUTO */ + CriUint32 user_max_width; + CriUint32 user_max_height; + + CriSint32 usr_subtitle_channel; + CriMvSubtitleInfo sbtinfo; + CriFloat32 sbt_start_msec; + CriFloat32 sbt_end_msec; + CriUint8 *sbtbuf; + + enum InputSrc { + MVEASY_INPUT_SRC_UNDEFINED, + MVEASY_INPUT_SRC_FILE, + MVEASY_INPUT_SRC_MEMORY, + /* Keep enum 4bytes */ + MVEASY_INPUT_SRC_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + InputSrc input_src; + CriMvFileReaderInterface *ext_reader; + CriMvFileReaderInterface *mem_reader; + + enum InputSupplyStatus { + MVEASY_SUPPLY_STOP, + MVEASY_SUPPLY_REQ_OPEN, + MVEASY_SUPPLY_OPENING, + MVEASY_SUPPLY_READING, + MVEASY_SUPPLY_REQ_CLOSE, + MVEASY_SUPPLY_CLOSING, + + /* Keep enum 4bytes */ + MVEASY_SUPPLY_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + InputMode memplay_type; /* ĐXg[邩jri邩 */ + InputMode input_mode; + InputSupplyStatus supply_stat; + CriBool change_file_mode; + CriChar8 file_name[CRIMV_MAX_FILE_NAME]; + CriUint64 file_offset; + CriSint64 file_range; + CriUint8 *dataptr; + CriUint32 datasize; + CriBool terminate_flag; + CriSint32 reinput_cnt; + + enum NextEntryState { + MVEASY_NEXT_ENTRY_NONE, + MVEASY_NEXT_ENTRY_READY, + MVEASY_NEXT_ENTRY_DEFER, + /* Keep enum 4bytes */ + MVEASY_NEXT_ENTRY_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + NextEntryState next_entry_state; + + CriUint32 center_ch; + CriSint32 usr_voice_track; // by SetCenterVoice() + CriSint32 voice_attached_track; + + // Sub Audio + CriMvSoundInterface *if_subaudio; + CriSint32 usr_subaudio_track; + CriSint32 attached_subaudio_track; + + void (*cbfunc_file_request)(CriMvEasyPlayer *mveasy, void *usrobj); + void *usrobj_file_request; + + CriBool (*cbfunc_compare_ftime)(CriMvEasyPlayer *mveasy, CriMvFrameInfo *frameinfo, CriUint64 count, CriUint64 unit, void *usrobj); + void *usrobj_compare_ftime; + + /* Seek Playback */ + CriSint32 seek_frame_id; + CriUint64 seek_byte; + + /* CuePoint */ + void (*cbfunc_cuepoint)(CriMvEasyPlayer *mveasy, CriMvEventPoint *eventinfo, void *usrobj); + void *usrobj_cuepoint; + + /* Playback Statistics */ + CriBool start_getfrm; + CriUint64 last_getfrm_count; + CriFloat32 sum_diff_time; + CriMvPlaybackInfo playinfo; + CriMvLastFrameResult last_frm_result; + + /* Block flag for simultanious calls on multi-threads */ + CriSint32 execute_decode_block_flag; + CriSint32 update_block_flag; + + /* Stop Completion Notification */ + void (*cbfunc_stopcomplete)(CriMvEasyPlayer *mveasy, void *usrobj); + void *usrobj_stopcomplete; + + /* For Sofdec2 */ + void *playback_work; + CriSint32 playback_work_size; + void *mvply_work; + CriHeap heap_mveasy; + CriHeap heap_extra_sound; + CriBool reuse_modules_flag; + + /* For Debug */ + volatile CriUint8 end_sequence_info; + + /* Handle Protection */ + void *cshn; + void *cs_work; + + /* Skip Decoding */ + //CriBool skip_auto_flag; + //CriFloat32 margin_msec; + +public: + enum FrameCompareMode { + MVEASY_COMPARE_MODE_JUST, /* mɎr */ + MVEASY_COMPARE_MODE_DELAY_GET, /* ^C}O|t[͂ȂׂnȂ */ + MVEASY_COMPARE_MODE_FAST_GET, /* ^C}𐅑t[͂Ȃׂn */ + + /* Keep enum 4bytes */ + MVEASY_COMPARE_MODE_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + FrameCompareMode compare_mode; + CriFloat32 accuracy_system_tmr_msec; /* VXex milli sec */ + CriFloat32 accuracy_audio_tmr_msec; /* I[fBIx milli sec */ + CriFloat32 fluctuation_system; /* VXeiSyncFrame)̗h炬 milli sec */ + CriFloat32 fluctuation_adjust; /* h炬␳ */ +// CriFloat32 fluctuation_system_msec; /* VXe炬 milli sec */ +// CriFloat32 fluctuation_audio_msec; /* I[fBI炬 milli sec */ +// CriFloat32 fluctuation_adjust; /* 炬␳{ */ +// CriSint32 fluctuation_system_usec; /* VXe炬 micro sec */ +// CriSint32 fluctuation_audio_usec; /* I[fBI炬 micro sec */ +// CriFloat32 fluctuation_adjust_multi; /* 炬␳{ */ +// CriSint32 fluctuation_adjust_add; /* 炬␳ItZbg */ + +private: + CriBool req_stop_modules; + CriBool error_flag; + CriBool req_start_modules; + +protected: + CriMvEasyPlayer(CriHeap heap, + CriMvFileReaderInterface *freader, + CriMvSystemTimerInterface *stimer, + CriMvSoundInterface *sound, + CriError &err=CriMv::ErrorContainer); + virtual ~CriMvEasyPlayer(); + +private: + CriMvEasyPlayer(void); //disabled +}; + + + + +#endif /* CRI_MOVIE_H_INCLUDED */ diff --git a/3rdParty/cri/XboxOne/include/cri_movie_core.h b/3rdParty/cri/XboxOne/include/cri_movie_core.h new file mode 100644 index 00000000..705bbbf6 --- /dev/null +++ b/3rdParty/cri/XboxOne/include/cri_movie_core.h @@ -0,0 +1,2554 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2005-2013 CRI Middleware Co., Ltd. + * + * Library : CRI Movie + * Module : Library User's Header + * File : cri_movie_core.h + * Date : 2013-11-21 + * Version : (see CRIMVPLY_VER) + * + ****************************************************************************/ +/*! + * \file cri_movie_core.h + */ +#ifndef CRI_MOVIE_CORE_H_INCLUDED /* Re-definition prevention */ +#define CRI_MOVIE_CORE_H_INCLUDED + +/* Version No. */ +#define CRIMVPLY_VER "3.50" +#define CRIMVPLY_NAME "criMvPly" + +/*************************************************************************** + * Include file + ***************************************************************************/ +#include +#include +#include + +/*************************************************************************** + * MACRO CONSTANT + ***************************************************************************/ + +/*EN + * \brief Audio OFF setting of Audio Track + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +/*JP + * \brief I[fBIĐOFF̎wl + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +#define CRIMV_AUDIO_TRACK_OFF (-1) + +/*EN + * \brief Default setting of Audio Track + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +/*JP + * \brief I[fBI`l̃ftHgl + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +#define CRIMV_AUDIO_TRACK_AUTO (100) + +/*EN + * \brief Maximum number of PCM tracks in one audio stream + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief I[fBIf[^̍őPCMgbN + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_PCM_BUFFER_MAX (8) + +/*EN + * \brief Subtitle OFF setting + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ +/*JP + * \brief ĐOFF̎wl + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ +#define CRIMV_SUBTITLE_CHANNEL_OFF (-1) + +/*EN + * \brief Maximum number of video tracks in a movie file + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief [rt@C̍őrfIXg[ + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_MAX_VIDEO_NUM (1) + +/*EN + * \brief Maximum number of audio tracks in a movie file + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief [rt@C̍őI[fBIXg[ + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_MAX_AUDIO_NUM (32) + +/*EN + * \brief Maximum number of alpha tracks in a movie file + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief [rt@C̍őAt@Xg[ + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_MAX_ALPHA_NUM (1) + +#if defined(XPT_TGT_PC) +/*EN + * \brief Number of extra threads for multicore decoding + * \ingroup MDL_MV_OPTION + * The number of additional decoding threads that CRI Movie library internally creates. + * The threads are intended to run on multiple processors in parallel. + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +/*JP + * \brief }`RAfR[hp̒lj̃fR[hXbh + * \ingroup MDL_MV_OPTION + * CRI MovieCuō쐬lj̃fR[h̐łB̃Xbh́A}`RAPC + * fR[h񕪎U邽߂ɍ܂B + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +#define CRIMV_NUM_EXT_DECTHREAD_PC (3) + +/*EN + * \brief Default affnity mask of a thread + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +/*JP + * \brief XbhAtBjeB}XÑftHgݒl + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +#define CRIMV_DEFAULT_AFFNITY_MASK_PC (0xFFFFFFFF) + + +/*EN + * \brief Default priority of a thread + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +/*JP + * \brief Xbh̃ftHgDx + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +#define CRIMV_DEFAULT_THREAD_PRIORITY_PC (0x8000000) +#endif + +/*EN + * \brief Default value of the read buffer size + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetReadBufferSize() + */ +/*JP + * \brief [hobt@TCYftHgl + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetReadBufferSize() + */ +#define CRIMV_READ_BUFFER_SIZE_AUTO (-1) + + +/*************************************************************************** + * Library Spec Defenition + ***************************************************************************/ + +/* */ + +/* 2007-09-06:URUSHI I[fBĨTuW[ * + * MvPlỹI[fBICriMvPlyAmngƂVȃNXɐ؂oB* + * CriMvPlyAmng̓f}`vNTSgbNf[^󂯎āA * + * gbNƂɊUꂽAdecɏn܂B * + * ړI͈ȉ̓ * + * 1) I[fBIgbN̓Iؑ * + * 2) [vĐł̈قȂ`uڂ̓ */ + +#define NUM_MAX_ADEC (2) /* Adec̍ő吔 */ +/* ADEC̃CfbNX` */ +/* indexgCriMvPlyAmngAdecRg[ĂB */ +#define MAIN_ADEC_IDX (0) // CgbNp +#define SUB_ADEC_IDX (1) // {CXgbNp + +/* I[fBI̓Iؑ֋@\T|[g邩 */ +//#define ENABLE_DYNAMIC_AUDIO_SWITCH + +#if defined(ENABLE_DYNAMIC_AUDIO_SWITCH) + #define CRIMVPLYAMNG_TRACK_OFF (512) // ؂ւgbNԍ̃ftHgliؑւneej + + /* gbN̓Iؑւ̂߂̏Ԓ` */ + typedef enum _crimvplyamng_track_state { + CRIMVPLYAMNG_TRACK_STATE_FIXED = (1), // ftHg + CRIMVPLYAMNG_TRACK_STATE_PREP_SWITCHING, // [Uؑւ𖽗߂Aؑւ̏iKî߂̊ԂZbgj + CRIMVPLYAMNG_TRACK_STATE_SWITCHING // ؑ֌Ɛ̎sȂĐؑւsȂ + } CriMvPlyAmngTrackState; +#endif + +/* AĐA2–ڈȍ~̃wb_擾ł悤ɂ邽 */ +#define CRIMVPLY_HEAD_CONTAINER_NUM (2) + +/* ēǂݍ臒l̃ftHgl */ +#define CRIMV_DEFAULT_RELOAD_THRESHOLD (0.8f) // 0.8[sec] + +/* Đ̒t[ftHgl */ +#define CRIMV_DEFAULT_NUM_FRAMES_FOR_PREP (-1) /* ftHgFsgp (t[v[̗p) */ + +/* [N̈̊mۂCRI HeapgpȂ */ +#define CRIMV_REMOVE_CRIHEAP + +/* @ŗLt[ */ +#define CRIMV_FRAME_DETAILS_NUM (2) + +/* CriVavfios Ŏw肷Ot@C̃pX̏ */ +#if defined(XPT_TGT_IOS) + #define CRIMVPLY_VAVFIOS_MAX_FILEPATH (256) +#endif + +/*************************************************************************** + * Process MACRO + ***************************************************************************/ +#define criMv_SetDefaultHandleConfig(p_config) \ +{\ + (p_config)->readbuffer_size = 0;\ +} + +/*************************************************************************** + * Enum declaration + ***************************************************************************/ +/*EN + * \brief Speaker index of CRI Movie PCM output + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief CRI Movie PCMo͂̃Xs[J[zu + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_PCM_BUFFER_L = 0, /*EN< The LEFT channel of CRI Movie output */ + /*JP< CRI Movie I[fBIo͂ LEFT `l */ + CRIMV_PCM_BUFFER_R = 1, /*EN< The RIGHT channel of CRI Movie output */ + /*JP< CRI Movie I[fBIo͂ RIGHT `l */ + CRIMV_PCM_BUFFER_LS = 2, /*EN< The Surround LEFT channel of CRI Movie output */ + /*JP< CRI Movie I[fBIo͂ Surround LEFT `l */ + CRIMV_PCM_BUFFER_RS = 3, /*EN< The Surround RIGHT channel of CRI Movie output */ + /*JP< CRI Movie I[fBIo͂ Surround RIGHT `l */ + CRIMV_PCM_BUFFER_C = 4, /*EN< The CENTER channel of CRI Movie output */ + /*JP< CRI Movie I[fBIo͂ CENTER `l */ + CRIMV_PCM_BUFFER_LFE = 5, /*EN< The LFE channel of CRI Movie output */ + /*JP< CRI Movie I[fBIo͂ LFE `l */ + CRIMV_PCM_BUFFER_EXT1 = 6, /*EN< The EXT1(Rear Left) channel of CRI Movie output */ + /*JP< CRI Movie I[fBIo͂ EXT1(Rear Left) `l */ + CRIMV_PCM_BUFFER_EXT2 = 7, /*EN< The EXT2(Rear Right) channel of CRI Movie output */ + /*JP< CRI Movie I[fBIo͂ EXT2(Rear Right) `l */ + + /* Keep enum 4bytes */ + CRIMV_PCM_BUFFER_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvPcmBufferIndex; + + +/*EN + * \brief Composite mode of alpha movie + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief At@[r̍[h + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_COMPO_OPAQ = 0, /*EN< Opacity, no alpha value */ + /*JP< sAAt@Ȃ */ + CRIMV_COMPO_ALPHFULL = 1, /*EN< Full alpha blending (8bits-alpha data) */ + /*JP< tAlphaiAt@pf[^8rbg) */ + CRIMV_COMPO_ALPH3STEP = 2, /*EN< 3 Step Alpha */ + /*JP< 3lAt@ */ + CRIMV_COMPO_ALPH32BIT = 3, /*EN< Full alpha blending (32bits color + alpha data) */ + /*JP< tAlphaAiJ[ƃAt@f[^32rbgj */ + CRIMV_COMPO_ALPH1BIT = 4, /*EN< Alpha blending (24bits color + 1->8bits alpha) */ + /*JP< tAlphaAiJ[ƃAt@f[^32bitAl2lj */ + CRIMV_COMPO_ALPH2BIT = 5, /*EN< Alpha blending (24bits color + 2->8bits alpha) */ + /*JP< tAlphaAiJ[ƃAt@f[^32bitAl4lj */ + CRIMV_COMPO_ALPH3BIT = 6, /*EN< Alpha blending (24bits color + 3->8bits alpha) */ + /*JP< tAlphaAiJ[ƃAt@f[^32bitAl8lj */ + CRIMV_COMPO_ALPH4BIT = 7, /*EN< Alpha blending (24bits color + 4->8bits alpha) */ + /*JP< tAlphaAiJ[ƃAt@f[^32bitAl16lj*/ + + /* Keep enum 4bytes */ + CRIMV_COMPO_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvAlphaType; + + +/*EN + * \brief Result of the last video frame retrieval + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief ÕrfIt[擾̌ + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_LASTFRAME_OK = 0, /*EN< Succeeded */ + /*JP< 擾 */ + CRIMV_LASTFRAME_TIME_EARLY = 1, /*EN< Failed. The frame is not yet the time to draw */ + /*JP< 擾sBt[\ĐԂɒBĂȂ */ + CRIMV_LASTFRAME_DECODE_DELAY = 2, /*EN< Failed. The frame to draw is not decoded yet */ + /*JP< 擾sBrfIt[̃fR[hԂɍȂ */ + CRIMV_LASTFRAME_DISCARDED = 3, /*EN< Failed. The video frame is discarded by app */ + /*JP< 擾sBAvɂĔjꂽ */ + //CRIMV_LASTFRAME_NO_INPUT_DATA = 4, //Not supported yet + //CRIMV_LASTFRAME_SKIPPED = 5, //Not supported yet + //CRIMV_LASTFRAME_DEMUX_STUCKED = 6, //Not supported yet + + /* Keep enum 4bytes */ + CRIMV_LASTFRAME_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvLastFrameResult; + +#if defined(XPT_TGT_PS3PPU) +/*EN + * \brief Graphic Environment type for PS3 + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief PS3̃OtBbN‹ + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_GRAPHIC_ENV_GCM = 0, /*EN< GCM. (or same ARGB 32bit texture format of GCM) */ + /*JP< GCM‹ (܂̓eNX`tH[}bgGCMƓ‹) */ + CRIMV_GRAPHIC_ENV_PSGL = 1, /*EN< PSGL. (or same ARGB 32bit texture format of PSGL) */ + /*JP< PSGL‹ (܂̓eNX`tH[}bgPSGLƓ‹) */ + + /* Keep enum 4bytes */ + CRIMV_GRAPHIC_ENV_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvGraphicEnv; +#endif + + +/* CRI Movie Interanl handle status + * + * The possible legal states of a CriMvPly handle. Over the course of your application + * the CriMvPly handle will walk through the following states in roughly the following + * order. In states that are waiting states, you can request the + * CriMvPly handle to advance to the next state by calling the criMvPly_IncrementState() + * function. You can check the status of a valid CriMvPly handle at any time + * by calling criMvPly_GetStatus(). + * + * It is not possible to jump from a state to an arbitrary other state. Normal play + * proceeds from the CRIMVPLY_STATUS_STOP state through the CRIMV_PLY_STATUS_PLAYEND + * state in that order. Premature termination can be requested with the criMvPly_Stop() + * function. + * + * \sa criMvPly_IncrementState(), criMvPly_GetStatus(), criMvPly_Stop() + */ +typedef enum { + CRIMVPLY_STATUS_STOP = 0, /* Standstill. No processing is occurring. + * CriMvPly handles are created into this state. + */ + /* ~ */ + CRIMVPLY_STATUS_DECHDR = 1, /* The CriMvPly structure is now parsing the header + * of the file, including information on height and width + * of the video stream. + */ + /* wb_͒ */ + CRIMVPLY_STATUS_WAIT_PREP = 2, /* The header has been decoded and criMvPly_GetStreamingParameters() + * will now provide valid values. Typically you will call + * criMvPly_AllocateWorkBuffer() with this information at this point. + */ + /* PREPԂւIncrementState҂
+ AllocateWorkBufferĂ玟ւ */ + CRIMVPLY_STATUS_PREP = 3, /* Transition to this state to acknowledge to the + * CriMvPly handle that you have allocated your work buffers. */ + /* Đ */ + CRIMVPLY_STATUS_WAIT_PLAYING = 4, /* The audio and video decoders are now ready to begin playback.*/ + /* PLAYINGԂւIncrementState҂
+ ̏ԂŊɃrfIƃI[fBĨfR[hʂ͎擾łB*/ + CRIMVPLY_STATUS_PLAYING = 5, /* The decoders are currently decoding and playing output. */ + /* Đ */ + CRIMVPLY_STATUS_WAIT_PLAYEND = 6, /* The library is waiting for you to acknowledge the end of the movie. You + * have informed the CriMvPly structure that an end-of-file condition exists, + * but final frames of video and audio may still be pending in your application. */ + /* PLAYENDԂւIncrementState҂ */ + CRIMVPLY_STATUS_PLAYEND = 7, /* You have acknowledged the end of the movie. Teardown can occur at this point. */ + /* ĐI */ + CRIMVPLY_STATUS_STOP_PROCESSING = 8, /* A request to stop has been received by the CriMvPly structure, + * that is, you have called criMvPly_Stop(), and a stop is now pending. */ + /* ~ */ + CRIMVPLY_STATUS_WAIT_STOP = 9, /* The CriMvPly handle has acknowledged the stop request and + * you may now call criMvPly_IncrementState() to transition to + * the CRIMVPLY_STATUS_STOP state. */ + /* STOPԂւIncrementState҂ */ + CRIMVPLY_STATUS_ERROR = 10, /* An error has occurred. */ + /* G[ */ + + /* Keep enum 4bytes */ + CRIMVPLY_STATUS_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvPlyStatus; + + +/* Sofdec2 */ +typedef enum { + CRIMVPLY_META_FLAG_OFF = 0x0000, + CRIMVPLY_META_FLAG_CUE = 0x0001, + CRIMVPLY_META_FLAG_SEEK = 0x0002, + CRIMVPLY_META_FLAG_ALL = CRIMVPLY_META_FLAG_CUE + CRIMVPLY_META_FLAG_SEEK, + + /* Keep enum 4bytes */ + CRIMVPLY_META_FLAG_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvMetaFlag; + +/* Color Conversion*/ +typedef enum{ + CRIMV_COLORSPACE_CONVERSION_TYPE_ITU_R_BT601_LIMITED = 0, + CRIMV_COLORSPACE_CONVERSION_TYPE_ITU_R_BT601_FULLRANGE = 1, + + /* Keep enum 4bytes */ + CRIMV_COLORSPACE_CONVERSION_TYPE_ENUM_SINT32 = 0x7FFFFFFF +}CriMvColorSpaceConversionType; + +typedef void *(*CriMvMetaDataWorkMallocFunc)(void *obj, CriUint32 size); +typedef void (*CriMvMetaDataWorkFreeFunc)(void *obj, void *mem); + +/* OUTER_FRAMEPOOL_WORK */ +#define CriMvFramepoolWorkMallocFunc CriMvMetaDataWorkMallocFunc +#define CriMvFramepoolWorkFreeFunc CriMvMetaDataWorkFreeFunc + +/*************************************************************************** + * Data type declaration + ***************************************************************************/ + +/*EN + * \brief Audio parameters + * \ingroup MDL_MV_INFO + * + * \sa CriMvStreamingParameters, CriMvWaveInfo + */ +/*JP + * \brief I[fBIp[^ + * \ingroup MDL_MV_INFO + * + * I[fBIXg[̃p[^ + * \sa CriMvStreamingParameters, CriMvWaveInfo + */ +typedef struct { + CriUint32 sampling_rate; /*EN< Sampling rate */ + /*JP< TvOg */ + CriUint32 num_channel; /*EN< Number of channels. Monaural = 1, Stereo = 2 */ + /*JP< I[fBI`l */ + CriUint32 total_samples; /*EN< Total number of samples */ + /*JP< Tv */ + CriUint32 output_buffer_samples; /*EN< Output wave buffer size */ + /*JP< TEho̓obt@̃Tv */ + CriUint32 codec_type; /*EN< Codec type */ + /*JP< R[fbN */ + +} CriMvAudioParameters; + +/*EN + * \brief Video Parameters + * \ingroup MDL_MV_INFO + * \sa CriMvStreamingParameters + */ +/*JP + * \brief rfIp[^ + * \ingroup MDL_MV_INFO + * rfIXg[̃p[^ + * \sa CriMvStreamingParameters + */ +typedef struct { + CriUint32 max_width; /*EN< Maximum video width for stream. (multiple of 8) */ + /*JP< [rő啝iW̔{j */ + CriUint32 max_height; /*EN< Maximum video height for stream. (multiple of 8)*/ + /*JP< [rő卂iW̔{j */ + CriUint32 disp_width; /*EN< Width of the image to draw. */ + /*JP< \f̉sNZi[j */ + CriUint32 disp_height; /*EN< Height of the image to draw. */ + /*JP< \f̏csNZi[j */ + CriUint32 num_frame_pool; /*EN< Number of frame pools required for stream */ + /*JP< t[v[ */ + CriUint32 framerate; /*EN< Frame rate per second [x1000]. */ + /*JP< t[[g[x1000] */ + CriUint32 framerate_n; /*EN< Frame rate (in rational as numerator). framerate_n/framerate_d = framerate */ /* UTODO: ϐ */ + /*JP< t[[g̕q(L`)Bframerate_n/framerate_d = framerate */ + CriUint32 framerate_d; /*EN< Frame rate (in rational as denominator). */ + /*JP< t[[g̕(L`)B */ + CriUint32 total_frames; /*EN< Total number of video frames */ + /*JP< t[ */ + + CriUint32 material_width; /*EN< Width of the video source resolustion before encoding. */ + /*JP< GR[hÕrfIfނ̉sNZ */ + CriUint32 material_height; /*EN< Height of the video source resolustion before encoding. */ + /*JP< GR[hÕrfIfނ̏csNZ */ + CriUint32 screen_width; /*EN< Screen width set by encoding and cropping. + * This parameter is only available when you encoded the movie with "Widescreen TV Support" option. + * Normally this value is 0. */ + /*JP< GR[hɎw肵XN[B + * ̒l̓GR[hɁuCherx@\vgpꍇ̂ݗLɂȂ܂B + * ʏ͂OłB */ + + CriUint32 codec_type; /*EN< Video Codec Type. If you encoded the movie for PS2, this value is 2. + * Normally this value is 1 or 0(no info). + * If the codec_type is 1, the CRI Movie for ONLY PS2 can play the movie file. */ + /*JP< rfIR[fbNʁBPS2pɃGR[hꍇ 2ɂȂ܂B + * ʏ 1܂ 0(񖳂)łB + * R[fbNʂQ̃[ŕAPS2ŃCuŁû݁vД\łB */ + CriUint32 codec_dc_option; /*EN< Video Codec DC Option. If you encoded the movie for PS2, this value is 10. + * Normally this value is 11 or 0(no info). + * If the codec_type is 11, the CRI Movie for PS2 can NOT play the movie file. */ + /*JP< rfIR[fbNDCIvVʁBPS2pɃGR[hꍇ10ɂȂ܂B + * ʏ11܂ 0(񖳂)łB + * R[fbNDCIvV11̃[ŕAPS2ŃCuuł́vĐł܂B */ + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< Fϊ^CvB */ + CriSint32 capacity_of_picsize; /*EN< Capacity size of video pictures. */ + /*JP< sN`TCYl */ + CriUint32 average_bitrate; /*EN< Average bitrate. */ + /*JP< σrbg[g */ +} CriMvVideoParameters; + +/*EN + * \brief Alpha Parameters + * \ingroup MDL_MV_INFO + * \sa CriMvStreamingParameters + */ +/*JP + * \brief At@p[^ + * \ingroup MDL_MV_INFO + * At@Xg[̃p[^ + * \sa CriMvStreamingParameters + */ +typedef struct { + CriUint32 max_width; /*EN< Maximum alpha width for stream */ + /*JP< At@t[̍ő啝 */ + CriUint32 max_height; /*EN< Maximum alpha height for stream */ + /*JP< At@t[̍ő卂 */ + CriUint32 disp_width; /*EN< valid alpha width */ + /*JP< At@t[̎L */ + CriUint32 disp_height; /*EN< valid alpha height */ + /*JP< At@t[̎L */ + CriUint32 framerate; /*EN< Frame rate per second [x1000]. */ + /*JP< At@̃t[[g[x1000] */ + CriUint32 framerate_n; /*EN< Frame rate (in rational as numerator). framerate_n/framerate_d = framerate */ /* UTODO: ϐ */ + /*JP< t[[g̕q(L`)Bframerate_n/framerate_d = framerate */ + CriUint32 framerate_d; /*EN< Frame rate (in rational as denominator). */ + /*JP< t[[g̕(L`)B */ + CriUint32 total_frames; /*EN< Total number of alpha frames */ + /*JP< t[ */ + CriMvAlphaType alpha_type; /*EN< Alpha Composite Type. */ + /*JP< At@ʁB */ + CriUint32 codec_type; /*EN< Internal use only. Do not access this */ + /*JP< Cugpϐ */ + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< Fϊ^CvB */ + CriSint32 capacity_of_picsize; /*EN< Capacity size of video pictures. */ + /*JP< sN`TCYl */ + CriUint32 average_bitrate; /*EN< Average bitrate. */ + /*JP< σrbg[g */ +} CriMvAlphaParameters; + + +/*EN + * \brief Streaming Parameters + * \ingroup MDL_MV_INFO + * This structure includes streaming parameters and playing parameters. + * \sa CriMvEasyPlayer::GetMovieInfo() + */ +/*JP + * \brief Xg[~OĐp[^ + * \ingroup MDL_MV_INFO + * Xg[~OĐp[^B
+ * Xg[̂̏ƁAĐ̂߂ɕKvȃp[^̗܂łB + * \sa CriMvEasyPlayer::GetMovieInfo() + */ +typedef struct { + /* Stream */ + CriUint32 is_playable; /*EN< Flag of the movie file is playable or not. 1 is playable. 0 is not playable.*/ + /*JP< Д\tOi1: Д\A0: Đsj */ + CriFloat32 buffering_time; /*EN< Amount of time to buffer in the stream, in seconds */ + /*JP< ǂݍ݃f[^̃obt@OԁBP[sec]B */ + CriUint32 max_bitrate; /*EN< Maximum bits per second for stream. This value includes video and audio both. */ + /*JP< őrbg[g(GƉ̍v) */ + CriUint32 max_chunk_size; /*EN< Maximum chunk size of incoming stream (USF) file */ + /*JP< őUSF`NTCY */ + CriUint32 min_buffer_size; /*EN< Minimum buffer size for reading */ + /*JP< ŒKvȓǂݍ݃obt@TCYB
I[fBIƃrfI̍v */ + CriSint32 read_buffer_size; /*EN< Input buffer size for reading data */ + /*JP< [hobt@TCY */ + /* Video */ + CriUint32 num_video; /*EN< Number of simultaneous video streams */ + /*JP< rfIfR[_̐B݂1ŒB*/ + CriMvVideoParameters video_prm[CRIMV_MAX_VIDEO_NUM]; /*EN< Video parameters see CriMvVideoParameters struct for details */ + /*JP< rfIp[^ */ + /* Audio */ + CriUint32 num_audio; /*EN< Number of simultaneous audio streams */ + /*JP< I[fBIfR[_̐B݂1ŒB*/ + CriSint32 track_play_audio; /*EN< Track of audio playback. */ + /*JP< ĐI[fBI`lԍB-1wōĐB */ + CriMvAudioParameters audio_prm[CRIMV_MAX_AUDIO_NUM]; /*EN< Audio parameters see CriMvAudioParameters struct for details */ + /*JP< I[fBIp[^ */ + /* Subtitle */ + CriUint32 num_subtitle; /*EN< Number of subtitles */ + /*JP< `l */ + CriSint32 channel_play_subtitle; /*EN< Channel for playing subtitles */ + /*JP< Đ鎚`lԍ */ + CriUint32 max_subtitle_size; /*EN< Maximum size of subtitle data */ + /*JP< f[^̍őTCY*/ + + /* Composite mode */ + CriUint32 num_alpha; /*EN< Number of alpha channels (current spec allows only one) */ + /*JP< At@fR[_̐B݂1ŒB */ + CriMvAlphaParameters alpha_prm[CRIMV_MAX_ALPHA_NUM]; /*EN< Alpha parameters see CriMvAlphaParameters struct for details */ + /*JP< At@p[^ */ + + CriBool seekinfo_flag; /*EN< Flag of the movie file inclues seek info */ + /*JP< V[NtO */ + CriUint32 format_ver; /*EN< Format version */ + /*JP< tH[}bgo[W */ +} CriMvStreamingParameters; + + +/*EN + * \brief Input Buffer Information + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetInputBufferInfo(), + * CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::SetBufferingTime() + */ +/*JP + * \brief ̓obt@ + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetInputBufferInfo(), + * CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::SetBufferingTime() + */ +typedef struct { + CriUint32 buffer_size; /*EN< Input buffer size [byte] */ + /*JP< ̓obt@TCY[byte] */ + CriUint32 data_size; /*EN< Data size in input buffer[byte] */ + /*JP< ̓obt@ɂf[^TCY[byte] */ + CriUint32 reload_threshold; /*EN< Re-load threshold. When data size is less than re-load threshold, next read is requested. */ + /*JP< ēǂݍ臒l[byte]Bf[^TCY̒lȉɂȂƓǂݍ݂s܂B */ +} CriMvInputBufferInfo; + + +// TEMP: for internal use +typedef struct { + CriUint8 *imageptr; + CriUint32 bufsize; // [Byte] + CriUint32 line_pitch; // [Byte] + CriUint32 line_size; // [Byte] + CriUint32 num_lines; +} CriMvImageBufferInfo; + +/*EN + * \brief Video Frame Information + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB(), CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers, + * CriMvEasyPlayer::GetFrameOnTimeAsYUV422(), CriMvEasyPlayer::DiscardNextFrame() + */ +/*JP + * \brief rfIt[ + * \ingroup MDL_MV_INFO + * rfIt[ + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB(), CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers, + * CriMvEasyPlayer::GetFrameOnTimeAsYUV422(), CriMvEasyPlayer::DiscardNextFrame() + */ +typedef struct { + CriUint8 *imageptr; /*EN< Pointer to image data */ + /*JP< 摜f[^̃|C^ */ + CriSint32 frame_id; /*EN< Frame ID ot the playback */ + /*JP< t[IDi[v^AĐ͒ʎZj */ + CriUint32 width; /*EN< Width of movie frame [pixel] (multiple of 8) */ + /*JP< [r̉[pixel] (W̔{) */ + CriUint32 height; /*EN< Height of movie frame [pixel] (multiple of 8) */ + /*JP< [r̍[pixel] (W̔{) */ + CriUint32 pitch; /*EN< Pitch of movie frame [byte]*/ + /*JP< [r̃sb`[byte] */ + CriUint32 disp_width; /*EN< Width of the image to draw. */ + /*JP< \f̉sNZi[j */ + CriUint32 disp_height; /*EN< Height of the image to draw. */ + /*JP< \f̏csNZi[j */ + CriUint32 framerate; /*EN< Frames per second times 1000 */ + /*JP< t[[g1000{̒l */ + CriUint32 framerate_n; /*EN< Frame rate (in rational as numerator). framerate_n/framerate_d = framerate */ /* UTODO: ϐ */ + /*JP< t[[g̕q(L`)Bframerate_n/framerate_d = framerate */ + CriUint32 framerate_d; /*EN< Frame rate (in rational as denominator). */ + /*JP< t[[g̕(L`)B */ + CriUint64 time; /*EN< Frame time ('time / tunit' indicates time in seconds) */ + /*JP< Btime / tunit ŕb\B */ + CriUint64 tunit; /*EN< Unit of time measurement */ + /*JP< P */ + CriUint32 cnt_concatenated_movie; /*EN< Number of concatenated movie data */ + /*JP< [r̘A */ + CriSint32 frame_id_per_data; /*EN< Frame ID of the movie data */ + /*JP< [rf[^Ƃ̃t[ԍ */ + + CriBool csc_flag; /*EN< This is temporary variable. Please don't access. */ + /*JP< eXg̕ϐłBANZXȂłB */ + + CriMvAlphaType alpha_type; /*EN< Composite mode */ + /*JP< At@̍[h*/ + + void *details_ptr[CRIMV_FRAME_DETAILS_NUM]; // for internal use + + CriSint32 num_images; // TEMP: for internal use + CriMvImageBufferInfo image_info[4]; // TEMP: for internal use + + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< Fϊ^CvB */ + CriUint32 total_frames_per_data; /*EN< Total frames of the movie data*/ + /*JP< [rf[^Pʂ̑t[ */ + CriUint32 cnt_skipped_frames; /*EN< Number of skipped frames to decode */ + /*JP< fR[hXLbvꂽt[ */ +} CriMvFrameInfo; + +/*EN + * \brief Subtitle Information + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetSubtitleOnTime() + */ +/*JP + * \brief + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetSubtitleOnTime() + */ +typedef struct { + CriUint8 *dataptr; /*EN< Pointer to subtitle data */ + /*JP< f[^̃|C^ */ + CriUint32 data_size; /*EN< Size of subtitle data */ + /*JP< f[^TCY */ + CriSint32 channel_no; /*EN< Channel number of subtitle data */ + /*JP< f[^̃`lԍ */ + CriUint64 time_unit; /*EN< Unit of time measurement */ + /*JP< P */ + CriUint64 in_time; /*EN< Display start time */ + /*JP< \Jn*/ + CriUint64 duration_time; /*EN< Display duration time */ + /*JP< \ */ + CriUint32 cnt_concatenated_movie; /*EN< Number of concatenated movie data */ + /*JP< [r̘A */ + CriUint64 in_time_per_data; /*EN< Display start time per movie data*/ + /*JP< [rf[^Ƃɕ\Jn*/ +} CriMvSubtitleInfo; + +/*EN + * \brief Event Point Info + * \ingroup MDL_MV_INFO + * Event point info is the each timing info was embeded to movie data as cue point info. + * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +/*JP + * \brief Cxg|Cg + * \ingroup MDL_MV_INFO + * L[|Cg@\Ń[rf[^ɖߍ܂ꂽX̃^C~OłB + * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +typedef struct { + CriChar8 *cue_name; /*EN< The name string of event point. Char code depends on cue point text. */ + /*JP< Cxg|CgBR[h̓L[|CgeLXgɏ]܂B */ + CriUint32 size_name; /*EN< The data size of name string */ + /*JP< Cxg|Cg̃f[^TCY */ + CriUint64 time; /*EN< Timer counter */ + /*JP< ^C}JEg */ + CriUint64 tunit; /*EN< Counter per 1 second. "count / unit" indicates the timer on the second time scale. */ + /*JP< Pb̃^C}JEglBcount unit ŕbPʂ̎ƂȂ܂B */ + CriSint32 type; /*EN< Event point type */ + /*JP< Cxg|Cg */ + CriChar8 *param_string; /*EN< The string of user parameters. Char code depends on cue point text. */ + /*JP< [Up[^BR[h̓L[|CgeLXgɏ]܂B */ + CriUint32 size_param; /*EN< The data size of user parameters string */ + /*JP< [Up[^̃f[^TCY */ + CriUint32 cnt_callback; /*EN< The counter of calling cue point callback. */ + /*JP< L[|CgR[obŇĂяoJE^ */ +} CriMvEventPoint; + +/*EN + * \brief Cue Point Info + * \ingroup MDL_MV_INFO + * Cue point info includes the number of event points and the list. + * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +/*JP + * \brief L[|Cg + * \ingroup MDL_MV_INFO + * L[|CǵACxg|CǧƈꗗłB
+ * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +typedef struct { + CriUint32 num_eventpoint; /*EN< The number of event points */ + /*JP< Cxg|Cg */ + CriMvEventPoint *eventtable; /*EN< The list of event points */ + /*JP< Cxg|Cgꗗ */ +} CriMvCuePointInfo; + +/*EN + * \brief YUV Texture Buffer Parameters + * \ingroup MDL_MV_INFO + * The output buffer parameters for CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers(). + * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() outputs data for pixel shader.
+ * If an application doesn't play alpha movie, CRI Movie library doesn't use alpha buffer parameters.
+ * \sa CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() + */ +/*JP + * \brief YUV•ʃobt@ + * \ingroup MDL_MV_INFO + * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() ̏o̓obt@łB
+ * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() Pixel Shader ̃fR[hʂo͂܂B
+ * At@[rĐsȂꍇis̒ʏĐj́AAlphaeNX`֘Ãp[^͎gp܂B
+ * \sa CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() + */ +typedef struct { + CriUint8 *y_imagebuf; /*EN< Pointer to the buffer of Y texture */ + /*JP< YeNX`̃obt@|C^ */ + CriUint32 y_bufsize; /*EN< Size of the buffer of Y texture [byte] */ + /*JP< YeNX`̃obt@TCY[byte] */ + CriUint32 y_pitch; /*EN< Pitch of the buffer of Y texture [byte] */ + /*JP< YeNX`̃sb`[byte] */ + CriUint8 *u_imagebuf; /*EN< Pointer to the buffer of U texture */ + /*JP< UeNX`̃obt@|C^ */ + CriUint32 u_bufsize; /*EN< Size of the buffer of U texture [byte] */ + /*JP< UeNX`̃obt@TCY[byte] */ + CriUint32 u_pitch; /*EN< Pitch of the buffer of U texture [byte] */ + /*JP< UeNX`̃sb`[byte] */ + CriUint8 *v_imagebuf; /*EN< Pointer to the buffer of V texture */ + /*JP< VeNX`̃obt@|C^ */ + CriUint32 v_bufsize; /*EN< Size of the buffer of V texture [byte] */ + /*JP< VeNX`̃obt@TCY[byte] */ + CriUint32 v_pitch; /*EN< Pitch of the buffer of V texture [byte] */ + /*JP< VeNX`̃sb`[byte] */ + CriUint8 *a_imagebuf; /*EN< Pointer to the buffer of Alpha texture */ + /*JP< AlphaeNX`̃obt@|C^ */ + CriUint32 a_bufsize; /*EN< Size of the buffer of Alpha texture [byte] */ + /*JP< AlphaeNX`̃obt@TCY[byte] */ + CriUint32 a_pitch; /*EN< Pitch of the buffer of Alpha texture [byte] */ + /*JP< AlphaeNX`̃sb`[byte] */ +} CriMvYuvBuffers; + + +/*EN + * \brief Playback Information + * \ingroup MDL_MV_INFO + * The output playback information of CriMvEasyPlayer::GetPlaybackInfo(). + * These parameters represents current movie playback information such as decode delay of movie data and + * interval of video frames retrieval. + * \sa CriMvEasyPlayer::GetPlaybackInfo() + */ +/*JP + * \brief Đ + * \ingroup MDL_MV_INFO + * CriMvEasyPlayer::GetPlaybackInfo() ̏o͍ĐłB
+ * t[̎擾ԊufR[h̒xȂǂ̌ݍĐĂ郀[r̍Đ\܂B
+ * \sa CriMvEasyPlayer::GetPlaybackInfo() + */ +typedef struct { + CriUint64 cnt_app_loop; /*EN< Loop count of application. Precisely, this is a number of calls of CriMvEasyPlayer::Update(). The count up will start after app is able to acquire the first video frame */ + /*JP< AvP[Ṽ[vJEgB̓Iɂ CriMvEasyPlayer::Update() ̌Ăяo񐔂ɂȂ܂Bŏ̃t[擾”\ɂȂƃJEgn܂܂B*/ + CriUint64 cnt_frame_interval[4]; /*EN< Interval of video frames retrieval. These values are count up when CriMvEasyPlayer::IsNextFrameOnTime() returns TRUE. + * + * The interval of video frames retrieval indicates a number of the loop count when your application calls CriMvEasyPlayer::IsNextFrameOnTime() in the main loop. + * In case that the application waits for vertical retrace, 1 interval equals about 16.7 msec. + * The index of array represents the count of intervals as follows: + * + *
Index Interval of video frames retrieval + *
0 Every main loop + *
1 2 main loops + *
2 3 main loops + *
3 4 or more main loops + *
+ * With these values, you can check if the application gets video frames with appropriate intervals. Please use the values as measuring playback smoothness + * + * In order to use these values, the application must meet the following conditions: + * - The main loop should work periodically and stably (Ideally sync with vertical retrace) + * - The application should call CriMvEasyPlayer::IsNextFrameOnTime() once in everly main loop + * + * For example, if the application runs at 59.94fps by waiting for vertical retrace and a framerate of playing movie file is 29.97fps, + * only cnt_frame_interval[1] should be increased. + */ + /*JP< t[̎擾ԊuB̒ĺA CriMvEasyPlayer::IsNextFrameOnTime() TRUEԂɃJEgAbv܂B
+ * + * t[̎擾ԊuƂ́AAvP[VC[vŃt[擾֐ǂ񂾎̃[v̉񐔂Ӗ܂B + * C[vVSyncƓĂꍇ́A1 Interval = 16.7msecƂƂɂȂ܂B + * z̃CfbNX́Aȉ̂悤Ɏ擾Ԋu\܂B
+ * + *
CfbNX t[̎擾Ԋu + *
0 C[v + *
1 2 C[v + *
2 3 C[v + *
3 4 C[vȏ + *
+ * ̒l邱ƂŁAAvԊuŃt[擾ł̂ǂ`FbN邱Ƃł܂B[r炩ɍĐłĂ邩̖ڈɂĂB
+ * + * OƂāAȉ̏AvĂKv܂B + * - AvVSyncȂǁA̎ň肵ē삵Ă + * - C[vŖ CriMvEasyPlayer::IsNextFrameOnTime() Ăяo + * + * L̏ɂāAႦ΃Av59.94fpsœ삵ĂԂŁAt[[g29.97fps̃[rĐꍇAcnt_frame_interval[1]݂̂ + * ԊuŃt[̎擾oƂɂȂ܂B + */ + CriUint64 cnt_time_early; /*EN< A count of how many times CriMvEasyPlayer::IsNextFrameOnTime() returns FALSE due to the determination if it is the time to provide the next video frame */ + /*JP< CriMvEasyPlayer::IsNextFrameOnTime() At[\ɂFALSEԂ񐔁B*/ + CriUint64 cnt_decode_delay; /*EN< A count of how many times CriMvEasyPlayer::IsNextFrameOnTime() returns FALSE due to the delay of decoding movie data */ + /*JP< CriMvEasyPlayer::IsNextFrameOnTime()ArfIt[̃fR[hxɂFALSEԂ */ + CriFloat32 time_max_delay; /*EN< Maximum delay time [msec] of the actual time a video frame retrieved against the original time should be retrieved */ + /*JP< rfIt[擾ۂ̎ƁA{\ׂƂ̍őx [msec]B */ + CriFloat32 time_average_delay; /*EN< Average delay time [msec] of the actual time a video frame retrieved against the original time should be retrieved */ + /*JP< rfIt[擾ۂ̎ƁA{\ׂƂ̕ϒx [msec]B */ +} CriMvPlaybackInfo; + +#if defined(XPT_TGT_PS3PPU) +/*EN + * \brief Parameters of SPURS and PPU for decoding + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupSpursParameters_PS3(), CriMv::CalcSpursWorkSize_PS3() + */ +/*JP + * \brief fR[hɎgSPURSPPŨp[^ + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupSpursParameters_PS3(), CriMv::CalcSpursWorkSize_PS3() + */ +typedef struct { + void *spurs_handler; /*EN< SPURS handler */ + /*JP< SPURSnh */ + void *spurs_work; /*EN< SPURS work area. The size is spurs_worksize. The alignment is 128 byte. */ + /*JP< SPURSp[Nobt@Bobt@TCY spurs_worksize 128oCgEB */ + CriSint32 spurs_worksize; /*EN< SPURS work size. This size is calculated by CriMv::CalcSpursWorkSize_PS3 function. */ + /*JP< SPURSp[NTCYBCriMv::CalcSpursWorkSize_PS3 ֐Ŏ擾lB */ + CriSint32 spurs_max_contention; /*EN< SPURS max contention */ + /*JP< SPURS Ń[rfR[hpɎgSPU̍ő吔 */ + CriUint8 *spurs_task_priority; /*EN< SPURS task priority x 8 */ + /*JP< SPURS ̃^XNvCIeBzBzvf͂WB */ + + CriUint32 ppu_num; /*EN< The number of PPU for decoding (0-2) */ + /*JP< The number of PPU for decoding (0-2) */ + CriSint32 ppu_thread_prio; /*EN< PPU Thread Priority. This priority is used for decoding thread in the case of ppu_num equal 2. */ + /*JP< PPU Thread Priority. ̒l ppu_num 2w肵ꍇɍ쐬XbhɎgB */ +} CriMvProcessorParameters_PS3; + +// [NOT SUPPORT on normal library] +// for SPU Thread +typedef struct { + CriUint32 ppu_num; /* The number of PPU for decoding (0-2) */ + CriSint32 ppu_prio; /* PPU Thread Priority */ + CriUint32 spu_num; /* The number of SPU for decoding (0-6) */ + CriSint32 spu_grp_prio; /* SPU Thread Group Priority */ +} CriMvSpuThreadParameters_PS3; + +#endif + +#if defined(XPT_TGT_XBOX360) +/*EN + * \brief Parameters of Xbox360 processors for decoding + * \ingroup MDL_MV_BASIC + * + * \sa CriMvEasyPlayer::SetUsableProcessors_XBOX360() + */ +/*JP + * \brief fR[hɎgXbox360vZbT̃p[^ + * \ingroup MDL_MV_BASIC + * + * \sa CriMvEasyPlayer::SetUsableProcessors_XBOX360() + */ +typedef struct { + CriBool processor0_flag; /*EN< Processor 0 (Core 0, Thread 0) usable flag */ + /*JP< vZbT0 (RA0Xbh0) gp”\tO */ + CriBool processor1_flag; /*EN< Processor 1 (Core 0, Thread 1) usable flag */ + /*JP< vZbT1 (RA0Xbh1) gp”\tO */ + CriBool processor2_flag; /*EN< Processor 2 (Core 1, Thread 0) usable flag */ + /*JP< vZbT2 (RA1Xbh0) gp”\tO */ + CriBool processor3_flag; /*EN< Processor 3 (Core 1, Thread 1) usable flag */ + /*JP< vZbT3 (RA1Xbh1) gp”\tO */ + CriBool processor4_flag; /*EN< Processor 4 (Core 2, Thread 0) usable flag */ + /*JP< vZbT4 (RA2Xbh0) gp”\tO */ + CriBool processor5_flag; /*EN< Processor 5 (Core 2, Thread 1) usable flag */ + /*JP< vZbT5 (RA2Xbh1) gp”\tO */ + CriSint32 thread_priority; /*EN< Priority of decoding threads on the active processors */ + /*JP< evZbTŃfR[hsXbh̗Dx */ +} CriMvProcessorParameters_XBOX360; +#endif + +#if defined(XPT_TGT_VITA) +/*EN + * \brief AVC Decoder Parameters + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupAvcDecoderParameters_VITA() + */ +/*JP + * \brief AVCfR[_p[^ + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupAvcDecoderParameters_VITA() + */ +typedef struct { + CriUint32 horizontal; /*EN< Maximum width for decoding (in pixel) */ + /*JP< őfR[h摜̉ (PʁFsNZ) */ + CriUint32 vertical; /*EN< Maximum height for decoding (in pixel) */ + /*JP< őfR[h摜̍ (PʁFsNZ) */ + CriUint32 n_ref_frames; /*EN< Maximum reference frames on decoding (default:3) */ + /*JP< fR[h̍őQƉ摜̖ */ + CriUint32 n_decoders; /*EN< Maximum number of avc decoders (max:1) */ + /*JP< ɎgpAVCŃR[_̍ő吔 (1Œ) */ + +} CriMvAvcDecoderParameters_VITA; +#endif + +/*--------------------------------------------------------------------------*/ +/* */ +/*--------------------------------------------------------------------------*/ +typedef enum { + CRIMV_PCM_FORMAT_SINT16 = 0, + CRIMV_PCM_FORMAT_FLOAT32 = 1, + + /* Keep enum 4bytes */ + CRIMV_PCM_FORMAT__MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvPcmFormat; +/* + * \brief 16bit wave data information + * \ingroup MDL_MV_INFO + * Information about a 16-bit waveform. + */ +/* 16bit Waveform */ +typedef struct { + CriUint32 num_channel; /* Number of Channels. monaural = 1, stereo = 2 */ + /* Number of Channels. monaural = 1, stereo = 2 */ + CriUint32 num_samples; /* Number of sample */ + /* Tv */ + CriUint32 sampling_rate; /* Sampling rate */ + /* TvOg */ +} CriMvWaveInfo; + +/* I[fBIwb_ */ +typedef struct { + /* Xg[~Op[^Ƌ */ + CriUint32 sampling_rate; + CriUint32 num_channel; + CriUint32 total_samples; + CriUint32 codec_type; + + CriUint32 metadata_count; + CriUint32 metadata_size; + + /* wb_ŗL */ + CriUint32 a_input_xsize; +} CriMvPlyAudioHeader; + +/* rfIwb_ */ +typedef struct { + /* wb_ŗL */ + CriUint32 width; + CriUint32 height; + CriUint32 disp_width; + CriUint32 disp_height; + CriUint32 framerate_n; + CriUint32 framerate_d; + CriUint32 total_frames; + + CriUint32 material_width; /* width of video original source. 0 means no info. */ + CriUint32 material_height; /* height of video original source. 0 means no info. */ + CriUint32 screen_width; /* screen width for Wii */ + + CriUint32 codec_type; + CriUint32 codec_dc_option; /* 11 or 10 */ + + CriUint32 metadata_count; + CriUint32 metadata_size; + + CriUint32 pre_padding; + CriUint32 color_conversion_type; + CriSint32 max_picture_size; + CriSint32 average_bitrate; +} CriMvPlyVideoHeader; + +/* Tu^Cgwb_ */ +typedef struct { + CriBool is_subtitle_data; + CriUint32 num_channel; + CriUint64 time_unit; + CriUint32 max_subtitle_size; +} CriMvPlySubtitleHeader; + +/* L[|Cgwb_ */ +typedef struct { + CriBool is_cuepoint_data; + CriUint32 metadata_count; + CriUint32 metadata_size; + CriUint32 num_eventpoint; + CriUint64 time_unit; +} CriMvPlyCuePointHeader; + +/* At@wb_ */ +typedef struct { + /* wb_ŗL */ + CriUint32 width; + CriUint32 height; + CriUint32 disp_width; + CriUint32 disp_height; + CriUint32 framerate_n; + CriUint32 framerate_d; + CriUint32 total_frames; + + CriMvAlphaType alpha_type; + CriUint32 codec_type; + + CriUint32 metadata_count; + CriUint32 metadata_size; + + CriUint32 pre_padding; + CriUint32 color_conversion_type; + CriSint32 max_picture_size; + CriSint32 average_bitrate; +} CriMvPlyAlphaHeader; + +/* At@݂̂̃t[ */ +typedef struct { + CriUint8 *imageptr; /*EN< Pointer to image data */ + /*JP< 摜f[^̃|C^ */ + CriSint32 frame_id; /*EN< Frame ID */ + /*JP< t[ID */ + CriUint32 width; /*EN< Width of movie frame [pixel] */ + /*JP< [r̉[pixel] */ + CriUint32 height; /*EN< Height of movie frame [pixel] */ + /*JP< [r̍[pixel] */ + CriUint32 disp_width; /*EN< Width of image [pixel] */ + /*JP< Lȉf̉[pixel] */ + CriUint32 disp_height; /*EN< Height of image [pixel] */ + /*JP< Lȉf̍[pixel] */ + CriUint32 pitch; /*EN< Pitch of movie frame [byte]*/ + /*JP< [r̃sb`[byte] */ + CriUint64 time; /*EN< Frame time ('time / tunit' indicates time in seconds) */ + /*JP< Btime / tunit ŕb\B */ + CriUint64 tunit; /*EN< Unit of time measurement */ + /*JP< P */ + CriSint32 frame_id_per_data; /*EN< Frame ID of the movie data */ + /*JP< [rf[^Ƃ̃t[ԍ */ + CriMvAlphaType alpha_type; /*EN< Composite mode */ + /*JP< At@̍[h*/ + void *detail_ptr; /* TEMP: for internal use */ + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< Fϊ^CvB */ +} CriMvAlphaFrameInfo; + +// ǗpB[r[Uɓn͂Ƃقړ낤B +/* Information of USF File */ +typedef struct { + CriBool is_usf_file; + CriUint32 max_chunk_size; + CriUint32 min_buffer_size; + CriUint32 bitrate; + CriUint32 format_version; + /* Video */ + CriUint32 num_video; + CriMvPlyVideoHeader videohead[CRIMV_MAX_VIDEO_NUM]; + /* Audio */ + CriUint32 num_audio; + CriMvPlyAudioHeader audiohead[CRIMV_MAX_AUDIO_NUM]; + /* Subtitle */ + CriUint32 num_subtitle; + CriMvPlySubtitleHeader subtitlehead; + /* Alpha */ + CriUint32 num_alpha; + CriMvPlyAlphaHeader alphahead[CRIMV_MAX_ALPHA_NUM]; + /* CuePoint */ + CriUint32 num_cuepoint; + CriMvPlyCuePointHeader cuepointhead; +} CriMvPlyHeaderInfo; + +/* Video Elementary Stream */ +typedef struct { + CriUint32 fcid; + CriSint32 track_no; // `Ñ`lԍ + void *vdec; +} CriMvPlyVideo; + +typedef struct { + CriUint32 fcid; + CriSint32 track_no; // `Ñ`lԍ + void *dec; +} CriMvPlyAlpha; + +/* [rwb_Ǘ邽߂̍\ */ +typedef struct { + CriMvPlyHeaderInfo info; + CriBool write_new_head_flag; // CRID‚Ď̃wb_ޏłH + CriUint32 num_remaining_adec_head; // KvȎc̃I[fBIwb_̐ + CriUint32 num_remaining_vdec_head; // KvȎc̃rfĨwb_̐ + CriUint32 num_remaining_subtitle_head; // KvȎc̎̃wb_̐ + CriUint32 num_remaining_alpha_head; // KvȎc̃At@̃wb_ + CriUint32 num_remaining_cuepoint_head; // KvȎc̃L[|Cg̃wb_ + /* 2010-08-19: TEMP: CONCAT_KAI: Don't refer this member. */ + CriUint64 accumulated_tcount; +} CriMvHeaderInfoContainer; + +typedef struct { + CriBool is_play_audio; + CriUint32 fcid; + CriUint32 track_no; // `Ñ`lԍ + void *adec; // ۂ̃I[fBIR[fbN + CriUint32 num_channel; // f[^̃`l + CriUint32 sampling_rate; // TvOg + CriUint32 output_buffer_samples; + CriSj sji; // UNI + CriSj sjo[CRIMV_PCM_BUFFER_MAX]; // RBF + CriUint32 sjo_bufsize[CRIMV_PCM_BUFFER_MAX]; + CriBool term_supply; // f[^IʒmtO + CriBool is_working; // Rec`N + +#if defined(ENABLE_DYNAMIC_AUDIO_SWITCH) + CriUint32 next_track_no; // [Uw肵ؑ֐̃gbNԍ + CriUint32 last_track_switch_time; // ؑ֌̃gbN̍ŌɃ`NƂ + CriUint32 last_track_switch_tunit; // L̒P (in Hz?) + CriMvPlyAmngTrackState switch_state; // gbNؑւɂ +#endif +} *CriMvPlyAdec, CriMvPlyAdecObj; + +typedef struct { + + CriMvPlyAdec mvply_adecs[NUM_MAX_ADEC]; + CriSint32 num_adecs; + CriUint32 size_smpl; + CriSj sji; + CriUint32 chunk_num_per_server; + + CriBool (*cbfunc_nofify_found_header)(void *usrobj, CriChunk *ckc, CriUint8 chno); + void *usrobj_nofify_found_header; + +} *CriMvPlyAmng, CriMvPlyAmngObj; + + +/* V[NubN */ +typedef struct { + CriSint32 top_frame_id; +} CriMvSeekBlockInfo; + +/* Xg[}p */ +typedef struct { + CriUint32 max_chunk_size; + CriUint32 average_bitrate; +} CriMvStreamerInfo; + + +/* nh쐬pRtBO\ */ +typedef struct { + CriUint32 readbuffer_size; +} CriMvHandleConfig; + + +/*JP CRI Movie nh */ +/*EN + * A handle for a single movie. If multiple movies are to be played simultaneously, + * create a CriMvPly handle for each movie. + * + * \sa criMvPly_Create(), criMvPly_Destroy() */ +typedef struct { + /*** Member variable is ***/ + CriBool used; + CriMvPlyStatus stat; + CriBool request_stop; + CriBool restrain_supply; + CriBool term_supply; + void *cs_work; + void *cshn; + /* USF Header */ + + CriMvHeaderInfoContainer headinfo_container[CRIMVPLY_HEAD_CONTAINER_NUM]; + Uint16 cur_dechead_idx; + CriUint32 cnt_dechead; /* wb_͂ƂɍXV */ + CriUint32 cnt_concat; /* GetFrameōXV */ + + CriMvPlyHeaderInfo headinfo; + CriUint32 num_headck; /* wb_͏`N */ + CriFloat32 def_buffering_time; + CriUint32 def_max_stream; + CriUint32 def_sound_output_buffer_samples; + CriSint32 def_track_play_audio; /* -1 ŃI[fBIĐ */ + + /* fQ[gp[^\ */ + CriSint32 size_dlgparams; + CriUint8 *ptr_dlgparams; + + CriBool is_prepare_work; + CriMvStreamingParameters stmprm; /* Xg[~Op[^̋L^ */ + /* Demultiplexer */ + CriSint32 inputtype; /* Xg[~OHjriĐ */ + CriBool is_usf_data; /* ̓t@CUSFt@CH */ + void *demux; /* USFf}`vNTnh */ + CriUint32 max_demuxout; /* f}`vNTo͂̍őʐ */ + CriUint32 num_demuxout; /* f}`vNTo͂ɐݒς݂̎ʐ */ + CriSj headanaly_in_sj; // RBF + CriSj headanaly_out_sj; // UNI + CriSj read_sj; // RBF + CriChunk readck; + + CriSj memplay_sj; // UNI (for memory playback) + CriChunk movie_on_mem; /* w̃[rf[^LpiPj */ + CriUint32 offset_content; /* w擪f[^̃Rec{̂܂ł̃TCY */ + + /* === nh쐬Ɋm === */ + CriHeap heap_gen; + /* wb_͗p̓ǂݍݗ̈ */ + CriUint32 headanaly_bufsize; + /* nh͍ŏ10kbytemۂĎg܂킷B̓Iɂ̓wb_͗pB */ + CriHeap local_heap; /* nhpHeap */ + CriSint32 local_bufsize; /* nhpHeapp̃obt@TCY */ + CriUint8 *local_bufptr; /* nhpHeapp̃obt@|C^ */ + /* === ^[Nobt@ (wb_͎Ɋm) === */ + CriHeap heap_meta; + /* === [Nobt@쐬Ɋm === */ + CriHeap heap_core; + /* ǂݍ݃obt@ */ + CriUint32 size_readbuf_main; + CriUint32 size_readbuf_ext; + /* Video Decoder */ + CriMvPlyVideo video; + CriUint32 framerate_n; + CriUint32 framerate_d; + /* Audio Decoder */ + CriMvPlyAmng audio_mngr; + CriMvPcmFormat pcmfmt; + CriUint32 size_smpl; + CriHeap heap_audio2; + /* Subtitle */ + CriSj sjo_subtitle; + CriSint32 concat_subtitle_cnt; /* ̘A */ + CriSint32 ch_subtitle; /* ̘A */ + /* Alpha */ + CriMvPlyAlpha alpha; + + /* ܂Ԃ`NΉpigǂɊ֌WȂϐ͒`j */ + CriUint32 bufsize_read_main; /* SJ̃obt@{̃TCY */ + CriUint32 bufsize_read_ext; /* SĴ̂肵TCY */ + CriUint8 *read_sj_bufptr; /* RBSJ̐擪obt@AhX */ + + /* Xg[~Op[^ɓƂiAH */ + CriSint32 seek_frame_id; /* V[Nt[IDiGOP̓r̉”\j */ + CriSint32 video_gop_top_id; /* V[ÑrfIGOP擪t[ID : 0ȉŃV[N */ + CriSint32 alpha_gop_top_id; /* V[ÑAt@GOP擪t[ID : 0ȉŃV[N */ + CriBool seek_video_prep_flag; /* V[NĐ̃rfItOiGOPr܂Ői񂾂Hj */ + CriBool seek_alpha_prep_flag; /* V[NĐ̃At@tOiGOPr܂Ői񂾂Hj */ + CriBool seek_audio_prep_flag; /* V[NĐ̃I[fBItOiV[Nw莞܂Ŏ̂ĂHj */ + + CriSint32 dechdr_stage; /* DECHDR̐i݋ */ + CriSint32 sji_meta_bufsize; /* ^f[^p̓obt@TCY */ + CriSj sji_meta; /* ^f[^pSJ */ + CriUint32 cnt_meta_ck; /* ^f[^pSJ */ + void *video_seektbl_ptr; + CriUint32 video_seektbl_size; + CriSint32 video_gop_num; + void *alpha_seektbl_ptr; + CriUint32 alpha_seektbl_size; + CriSint32 alpha_gop_num; + + void *audio_header_ptr[CRIMV_MAX_AUDIO_NUM]; + CriUint16 audio_header_size[CRIMV_MAX_AUDIO_NUM]; + + void *cuepoint_meta_ptr; + CriUint32 cuepoint_meta_size; + CriMvCuePointInfo cuepoint_info; + + CriMvInputBufferInfo ibuf_info; + CriFloat32 reload_sec_threshold; + + CriSint32 num_frames_for_prep; + + /* For Sofdec2 */ + CriHeap heap_playback; + CriMvMetaDataWorkMallocFunc cbfunc_meta_alloc; + CriMvMetaDataWorkFreeFunc cbfunc_meta_free; + void* usrobj_meta_data; + void* meta_data_work_allocated; /* [UAP[^Ŋmۂꂽ^f[^[N */ + void* event_table_work_allocated; /* [UAP[^ŊmۂꂽCxge[u */ + CriMvStreamerInfo streamer_info; + + /* OUTER_FRAMEPOOL_WORK */ + CriMvFramepoolWorkMallocFunc cbfunc_framepool_alloc; + CriMvFramepoolWorkFreeFunc cbfunc_framepool_free; + void* usrobj_framepool; + void* framepool_work_allocated; /* [UAP[^Ŋmۂꂽt[v[[NiKvj */ + void* framepool_work_set; /* ڃobt@w肳ꂽt[v[[Nisvj */ + + /* For Debug */ + volatile CriUint8 end_sequence_info; + CriUint64Adr header_ptr; + CriSint64 header_size; + CriUint64Adr body_ptr; + CriSint64 body_size; + + CriBool sync_flag; + + CriBool error_flag; + +#if defined(XPT_TGT_IOS) + CriChar8 vavfios_filepath[CRIMVPLY_VAVFIOS_MAX_FILEPATH]; +#endif + + /* For Tools */ + void *extended_mvinfo_config; + + /* nh쐬RtBO֘A */ + CriBool use_hn_config_flag; /* nh쐬RtBOw肪ǂ */ + CriMvHandleConfig hn_config; + +} *CriMvPly, CriMvPlyObj; + +/*************************************************************************** + * Function Declaration + ***************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Cu */ +/* + * \brief Cȕ + * \param Ȃ + * \return Ȃ + * \par : + * Cȕs܂B
+ * Aŏꍇ́Aŏ̂P̂ݏs܂B + */ +/* + * \ingroup MODULE_INIT + * \brief Initialize library + * + * This function initializes the CRI Movie library, including internal audio, + * streaming and video subsystems. This function must be + * called before any other function in this library will work properly. + * This function initializes only the first time it is called; if it is + * called again, it simply increments an internal counter and returns; it + * does not re-initialize, nor does it create an error condition. + * + * Therefore, it is safe to call criMvPly_Initialize() and criMvPly_Finalize() + * at the beginning and end, respectively, within each of the independent + * modules in your program. If you match these functions call for call, + * only the first criMvPly_Initialize() function and the last criMvPly_Finalize() + * functions should have any effect. + * + * \sa criMvPly_Finalize() + */ +void CRIAPI criMvPly_Initialize(void); + +/* CuI */ +/* + * \brief CuI + * \param Ȃ + * \return Ȃ + * \par : + * CȕIs܂B
+ * 񏉊Ăꍇ́A񐔂IsĂB + */ +/* + * \ingroup MODULE_INIT + * \brief Finalize library + * + * This function deallocates any resources in use by the library. + * It should be called the same number of times that the criMvPly_Initialize() + * function is called. If the criMvPly_Initialize() function is called n + * times, on the nth time the criMvPly_Finalize() function is called, + * criMvPly_Finalize() releases any resources allocated by CRI Movie. + * + * Therefore, it is safe to call criMvPly_Initialize() and criMvPly_Finalize() + * at the beginning and end, respectively, within each of the independent + * modules in your program. If you match these functions call for call, + * only the first criMvPly_Initialize() function and the last criMvPly_Finalize() + * functions should have any effect. + * + * \sa criMvPly_Initialize() + */ +void CRIAPI criMvPly_Finalize(void); + +/* nh쐬 */ +/* + * \brief nh쐬 + * \param heap : mۂɎgpHeapnh + * \return CriMvPlynh + * \par : + * CRI Movie nh쐬܂B
+ * KvȃnhǗ̈HeapnhgĎIɊmۂ܂B
+ * 쐬̃nhԂSTOPԂłB + */ +/* + * \ingroup MODULE_INIT + * \brief Create a handle + * \param heap A valid CriHeap handle + * \return A valid CriMvPly handle, or NULL if the handle cannot be allocated + * + * This function creates a CriMvPly handle in the CRIMVPLY_STATUS_STOP state. + * Memory for the handle is allocated from the CriHeap structure that you provide. + * Any memory allocation failure during this function results in a text error message to output, and the program hangs. + * Make sure to initialize and create your heap with criHeap_Initialize() and + * criHeap_Create() before calling this function. + * + * \sa CriMvPly, CriMvPlyStatus, criHeap_Initialize(), criHeap_Create() + */ +CriMvPly CRIAPI criMvPly_Create(CriHeap heap); + +/* RtBOw̃nh쐬 */ +/* config NULLw̏ꍇ̓RtBOw薳Ɠl */ +CriMvPly CRIAPI criMvPly_CreateWithConfig(CriHeap heap, CriMvHandleConfig *config); + +/* nhj */ +/* + * \brief nhj + * \param mvply : CRI Movie nh + * \return Ȃ + * \par : + * CRI Movie nh̔js܂B
+ * nh쐬ɈŎw肵HeapnhgāAnhǗ̈܂B
+ * [Nobt@mۂ܂܂̏ꍇ́A[Nobt@mێɎw肵Heapnhgă[Nobt@܂B
+ * nh̔j́AnhԂSTOPPLAYEND̎ɂsł܂B + */ +/* + * \ingroup MODULE_INIT + * \brief Destroy a handle + * \param mvply A valid CriMvPly handle to be destroyed + * + * This function destroys the CriMvPly handle previously created + * with criMvPly_Create(). + * + * You can only destroy the handle if it is in either the CRIMVPLY_STATUS_STOP or the + * the CRIMVPLY_STATUS_PLAYEND states. Attempting to destroy the handle in + * any other state will produce an error message. You can check the status of + * the handle at any time with criMvPly_GetStatus(). + * + * Any work buffers allocated via criMvPly_AllocateWorkBuffer(), if they are + * still associated with the handle, are freed when criMvPly_Destroy() is called. + * + * \sa CriMvPly, CriMvPlyStatus, criMvPly_GetStatus(), criMvPly_AllocateWorkBuffer() + */ +void CRIAPI criMvPly_Destroy(CriMvPly mvply); + +/* Xg[~Op[^̎擾 */ +/* + * \brief Xg[~Op[^̎擾 + * \param mvply : CRI Movie nh + * \param stmprm : Xg[~Op[^ + * \return Ȃ + * \par : + * wb_͂̌ʂƂɁA[rĐɕKvȃXg[~Op[^擾܂B
+ * nhԂWAIT_PREPɂȂƎ擾ł悤ɂȂ܂B
+ * ̃p[^ƂcriMvPly_AllocateWorkBuffer֐ĂяoƂł܂B
+ * KvȂ΂̃p[^̒lύXāAႦΉ胀[rʼnĐȂAƂƂ”\łB
+ */ +/* + * \ingroup MODULE_BUFFER + * \brief Get streaming parameters + * \param mvply A valid CriMvPly handle + * \param stmprm An empty CriMvStreamingParameters structure to be filled with data + * + * This function permits you to get detailed information about the stream and + * dynamically allocate resources just before the video and audio sequence + * begins playback. + * + * This function does nothing if the current state of the CriMvPly handle is + * CRIMVPLY_STATUS_DECHDR or CRIMVPLY_STATUS_STOP. The only useful state in + * which to call criMvPly_GetStreamingParameters() is the CRIMVPLY_WAIT_PREP + * status. When the CriMvPly handle is in the CRIMVPLY_WAIT_PREP status, + * calling this function will cause the CriMvStreamingParameters field to be + * filled with data. + * + * Some of the CriMvStreamingParameters, such as buffering time and the + * maximum number of files to read, are copied from the CriMvPly structure. + * However, maximum bitrate, video size, audio stream rate and channel + * info are calculated from the incoming stream. + * + * After calling criMvPly_GetStreamingParameters(), you can programmatically + * override any of the fields in the CriMvStreamingParameters struct yourself + * before calling criMvPly_AllocateWorkBuffer() with it. For example, you might + * need to read a stream containing both audio and video, but only output the + * video from the stream. In this case you could allocate trivial audio buffers + * for output by modifying the CriMvStreamingParameters struct accordingly after + * calling this function. + * + * \sa criMvPly_AllocateWorkBuffer(), CriMvPly, CriMvStreamingParameters + */ + void CRIAPI criMvPly_GetStreamingParameters(CriMvPly mvply, CriMvStreamingParameters *stmprm); + +/* [Nobt@̊m */ +/* + * \brief [Nobt@̊m + * \param mvply : CRI Movie nh + * \param heap : + * \param stmprm : Xg[~Op[^ + * \return Ȃ + * \par : + * HeapnhgāAǂݍ݃obt@rfI^I[fBĨ[Nobt@mۂ܂B
+ * ̊֐Ăяo”\Ȃ̂́ASTOPԂWAIT_PREPԂ݂̎̂łB
+ * nhɑ΂ĂQxĂяoƁAPxڂ̃[Nobt@SĉĂA߂ă[Nobt@mۂ܂B
+ * criMvPly_Start֐Ƀ[Nobt@mۂĂƂł܂B + */ +/* + * \ingroup MODULE_BUFFER + * \brief Allocate internal streaming work buffers + * \param mvply A CriMvPly handle + * \param heap A CriHeap handle + * \param stmprm An initialized CriMvStreamingParameters structure + * + * This function allocates internal streaming buffers for the CriMvPly movie + * player from the CriHeap. The amount of memory required is based + * on the maximum bitrate of the stream, the requested buffering time, the + * maximum chunk size, and the height and width of the incoming video frame. + * However, a small amount of memory is allocated for the + * video and audio decoders from the CriHeap as well. + * + * The CriHeap handle passed as a parameter to this function need not + * be the same CriHeap handle you passed to the criMvPly_Create() function. + * You may prefer to use either one or two heaps. + * + * This function can be called only if the CriMvPly handle is in the + * CRIMVPLY_STATUS_STOP or the CRIMVPLY_STATUS_WAIT_PREP status. Calling + * this function any other time will produce an error message. + * + * If this function is called twice without calling criMvPly_FreeWorkBuffer(), + * it releases the previously allocated buffers before allocating them again. + * + * This function must be called sometime before criMvPly_Start(). + * + * \if ps2 + * \par PS2 only: + * The PS2 implementation of this function additionally allocates buffers for + * internal DMA tags. If these allocations fail due to lack of memory, the + * library will hang. + * \endif + * + * \sa CriMvPly, CriHeap, CriMvPlyStatus, CriMvStreamingParameters, criMvPly_FreeWorkBuffer(), + * criMvPly_Start() + */ +CriBool CRIAPI criMvPly_AllocateWorkBuffer(CriMvPly mvply, CriHeap heap, CriMvStreamingParameters *stmprm); + +/* [Nobt@̉ */ +/* + * \brief [Nobt@̉ + * \param mvply : CRI Movie nh + * \return Ȃ + * \par : + * criMvPly_AllocateWorkBuffer֐Ŋmۂ[Nobt@Sĉ܂B
+ * ̊֐Ăяo”\Ȃ̂́ASTOP^WAIT_PREP^PLAYENDԂ݂̎̂łB
+ * CRI Movie Ver.0.60 ł͖łB + */ +/* + * \ingroup MODULE_BUFFER + * \brief Release streaming work buffer + * \param mvply A valid CriMvPly handle + * + * This function releases streaming work buffers allocated from the CriHeap + * previously associated with criMvPly_AllocateWorkBuffer(). + * This function should only be called at CRIMVPLY_STATUS_STOP, + * CRIMVPLY_STATUS_WAIT_PREP or CRIMVPLY_STATUS_PLAYEND states. However, this + * function does not verify the current stream status before releasing + * all the buffers; it merely deallocates them. Expect interesting crashes + * if you call this function while playing a movie. + * + * You can verify the current CriMvPly handle status with criMvPly_GetStatus() if + * necessary. + * + */ +void CRIAPI criMvPly_FreeWorkBuffer(CriMvPly mvply); + +/* ĐI[fBI`l̐ݒ */ +/* + * \brief ĐI[fBI`l̐ݒ + * \param mvply : CRI Movie nh + * \param ch : I[fBI`lԍ + * \return Ȃ + * \par : + * CriMvStreamingParameters\̂̃o track_play_audiõftHglݒ肵܂B
+ * criMvPly_GetStreamingParameters֐CriMvStreamingParameters\̂擾Ƃɂ̒li[܂B
+ * ݒ肵ĂȂꍇAbuffering_timeɂ0܂B + * -1w肷ƃI[fBIĐȂݒɂȂ܂B + */ +void CRIAPI criMvPly_SetAudioTrack(CriMvPly mvply, CriSint32 track); + +/* obt@O(P[sec])̐ݒ */ +/* + * \brief obt@O(P[sec])̐ݒ + * \param mvply : CRI Movie nh + * \param time : obt@O + * \return Ȃ + * \par : + * CriMvStreamingParameters\̂̃obuffering_timẽftHglݒ肵܂B
+ * criMvPly_GetStreamingParameters֐ CriMvStreamingParameters\̂擾Ƃɂ̒li[܂B
+ * ݒ肵ĂȂꍇAbuffering_timeɂ1.0bĂ܂B + */ +/* + * \ingroup MODULE_BUFFER + * \brief Set default buffering time (unit[sec]) + * \param mvply A valid CriMvPly handle + * \param time Buffering time in seconds + * + * This function tells the CriMvPly handle how much time of the stream to buffer in + * memory. Buffering is necessary to cover seeks, error retries, latency and + * other various hiccups in most data sources. + * + * This value is stored in the buffering_time field of the CriMvStreamingParameters + * struct. It is set to a default of 1.0 seconds when the CriMvPly handle is created. + * This is typically safe for most DVD type file systems. + * + * \sa CriMvPly, CriMvStreamingParameters + */ +//void CRIAPI criMvPly_SetBufferingTime(CriMvPly mvply, CriFloat32 time); + +/* ǂݍ݃t@C̐ݒ */ +/* + * \brief ǂݍ݃t@C̐ݒ + * \param mvply : CRI Movie nh + * \param max_stm : ǂݍ݃t@C + * \return Ȃ + * \par : + * CriMvStreamingParameters\̂̃omax_simultaneous_read_files̃ftHglݒ肵܂B
+ * criMvPly_GetStreamingParameters֐ CriMvStreamingParameters\̂擾Ƃɂ̒li[܂B
+ * ݒ肵ĂȂꍇAmax_simultaneous_read_filesɂ1Ă܂B + */ +/* + * \ingroup MODULE_BUFFER + * \brief Set maximum number of simultaneous streams + * \param mvply A valid CriMvPly handle + * \param max_stm The maximum number of simultaneous streams + * + * This function sets the default value of the "max_simultaneous_read_files" field of + * the CriMvStreamingParameters struct. Currently, setting this value has no effect. + */ +//void CRIAPI criMvPly_SetMaxSimultaneousStreams(CriMvPly mvply, CriUint32 max_stm); + +/* TEho̓obt@Tv̐ݒ */ +/* + * \brief GetWave16ŗvőTv̐ݒ + * \param mvply : CRI Movie nh + * \param max_smpl : őTv + * \return Ȃ + * \par : + * CriMvAudioParameters\̂̃ooutput_buffer_samples̃ftHglݒ肵܂B
+ * criMvPly_GetStreamingParameters֐ CriMvStreamingParameters\̂擾Ƃɂ̒li[܂B
+ * ݒ肵ĂȂꍇAoutput_buffer_samplesɂ16*1024Ă܂B + */ +/* + * \ingroup MODULE_AUDIO + * \brief Set default sound output buffer samples + * \param mvply A valid CriMvPly handle + * \param smpls : sound output buffer samples + * + * This function sets the default value of the "output_buffer_samples" field in the + * CriMvAudioParameters struct. The default value is 16384, which is set when + * criMvPly_Create() is called. + * + * This function only has an effect if it is called before the + * criMvPly_AllocateWorkBuffer() function is called, since this is when the audio + * output buffer is allocated. + * + * \sa CriMvAudioParameters, criMvPly_Create(), criMvPly_AllocateWorkBuffer(), + * criMvPly_GetWave16() + */ +//void criMvPly_SetMaxSamplesOfGetWave16(CriMvPly mvply, CriUint32 max_smpl); +void CRIAPI criMvPly_SetSoundOutputBufferSamples(CriMvPly mvply, CriUint32 smpls); + +/* nhԂ̎擾 */ +/* + * \brief nhԂ̎擾 + * \param mvply : CRI Movie nh + * \return nh + * \par : + * nhԂ擾܂B + */ +/* + * \ingroup MODULE_STATE + * \brief Get the handle status + * \param mvply A valid CriMvPly handle + * \return One of the CriMvPlyStatus enum values + * + * This function gets the current status of the CRI Movie handle. Check the + * following link for possible return values. + * + * \sa CriMvPlyStatus + */ +CriMvPlyStatus CRIAPI criMvPly_GetStatus(CriMvPly mvply); + +/* WAITԂ玟̏Ԃւ̑Jڒʒm */ +/* + * \brief WAITԂ玟̏Ԃւ̑Jڒʒm + * \param mvply : CRI Movie nh + * \return Ȃ + * \par : + * nhԂWAIT_**** Ԃ玟̏ԂɑJڂ܂BԂɉĎ̂悤Ɏgp܂B
+ * EWAIT_PREP : criMvPly_AllocateWorkBuffer֐Ń[NmۂĂяoĂB
+ * EWAIT_PLAYING : rfIt[AI[fBIf[^擾ĕ\Eo͂̏łA + * o͂JnāA{֐ĂяoĂB
+ * EWAIT_PLAYEND : Ō̃rfIt[̕\AŌ̃I[fBIf[^̏o͂IĂяoĂB
+ * EWAIT_STOP : rfII[fBȈo͂~ĂԂɂȂAĂяoĂB
+ * {֐ĂяoƊeԂ͑Ɏ̏ԂɑJڂ܂B
+ * {֐ WAIT_**** ȊȌԂŌĂяoĂAԂ͉ς܂B + */ +/* + * \ingroup MODULE_STATE + * \brief Notify transition from WAIT status + * \param mvply A valid CriMvPly handle + * + * This function notifies the CriMvPly handle that your application is ready to + * go from the current WAIT state to the next state. There are exactly four states + * in which it is appropriate to call this function: + * + * - CRIMVPLY_STATUS_WAIT_PREP After your application has allocated buffers with + * criMvPly_AllocateWorkBuffer() + * - CRIMVPLY_STATUS_WAIT_PLAYING After your application has prerolled stream data (if + * necessary) + * - CRIMVPLY_STATUS_WAIT_PLAYEND After your application has displayed the last frames of audio and + * video from the stream + * - CRIMVPLY_STATUS_WAIT_STOP After your application suspends playback from the stream + * + * You can check the current status of the CriMvPly handle by calling the criMvPly_GetStatus() + * function. This function has no effect if called in states other than those listed above. + * + * \sa CriMvPly, CriMvPlyStatus + */ +void CRIAPI criMvPly_IncrementState(CriMvPly mvply); + +/* Ԃ̍XV */ +/* + * \brief CriMvPlyW[̃T[o֐ + * \param mvply : CRI Movie nh + * \return Ȃ + * \par : + * Ƀf}`vNT̃f[^̍XVs܂B
+ * {֐̓AvP[ṼCXbhłŖĂяo悤ɂĂB
+ */ +void CRIAPI criMvPly_Update(CriMvPly mvply); + +/* ĐJn */ +/* + * \brief ĐJn + * \param mvply : CRI Movie nh + * \return ĐJnłꍇCRI_TRUE, sꍇCRI_FALSE + * \par : + * Đ̂߂̏Jn܂B
+ * {֐ďoAnhԂDECHDRɑJڂ܂B
+ */ +/* + * \ingroup MODULE_STATE + * \brief Start of playback processing + * \param mvply A valid CriMvPly handle + * + * This function initiates playback processing. This function should be called + * after the CriMvPly handle is created and the data source has been opened, + * but before the work buffers are allocated with criMvPly_AllocateWorkBuffer(). + * This function sets the current status of the CriMvPly handle to + * CRIMVPLY_STATUS_DECHDR, which prepares it to decode the header information + * from the data source. + * + * \sa CriMvPly, CriMvPlyStatus, criMvPly_AllocateWorkBuffer() + */ +CriBool CRIAPI criMvPly_Start(CriMvPly mvply); + +/* Đ~NGXg(A) */ +/* + * \brief Đ~NGXg(A) + * \param mvply : CRI Movie nh + * \return Ȃ + * \par : + * Đ~̃NGXg𔭍sđA܂B
+ * {֐ďoAnhԂSTOP_PROCESSINGԂɑJڂ܂B
+ * ~̂߂̏IƁAnhԂWAIT_STOPɑJڂ܂B
+ * WAIT_STOPԂɂȂAcriMvPly_IncrementState֐STOPԂɑJڂāA + * AvP[V̒~sĂB + */ +/* + * \ingroup MODULE_STATE + * \brief Non-blocking request to stop playback + * \param mvply A currently playing CriMvPly handle + * + * This function records a request to terminate playback. Termination of + * playback is not synchronous to this function; this function sets the current + * state of the CriMvPly handle to CRIMVPLY_STATUS_STOP_PROCESSING. After + * movie processing is halted, the state of the handle transitions to + * CRIMWPLY_STATUS_WAIT_STOP. + * + * This function is useful for prematurely terminating a movie, e.g. "press + * X to skip this movie". + * + * Video frames will keep being delivered until you detect a CRIMVPLY_STATUS_WAIT_STOP + * state in the CriMvPly handle, and then call criMvPly_IncrementState to transition + * back to the CRIMVPLY_STATUS_STOP state. + * + * \note Pausing is not accomplished through this function. The system clock, including + * whether or not to pause or advance frames, is controlled entirely through user + * code. So the effect of "pausing" a CriMvPly handle can be accomplished by simply + * not updating your system clock as long as your pause is in effect. + * + * \sa CriMvPly, CriMvPlyStatus + */ +void CRIAPI criMvPly_Stop(CriMvPly mvply); + +/* T[o(nhw) */ +/* + * \brief T[o(nhw) + * \param mvply : CRI Movie nh + * \return Ȃ + * \par : + * CRI Movie nhw肵ăT[os܂B
+ * eWAIT_**** Ԃւ̏ԑJڂ̓T[o֐Ŏs܂B + */ +/* + * \ingroup MODULE_VIDEO + * \brief Execute heartbeat functions for a handle + * \param mvply A valid CriMvPly handle + * + * This function executes heartbeat functions for the specified CriMvPly handle only, + * including handoff and parsing of input buffers and audio decoding. Additionally, + * it checks for buffer situations in which the CriMvPly handle should transition to + * one of the four WAIT states of CriMvPlyStatus, and it makes these transitions if + * necessary. + * + * However, video decoding does NOT occur in criMvPly_Execute(). + * + * Expect that criMvPly_Execute() will take a relatively low CPU load. Typically, + * this function should be called on every vertical blank. However, it may be called + * more frequently in a CriMvPly wait state, in conjunction with criMvPly_IncrementState(), + * in order to "force" a transition into the next state without waiting for + * another vertical blank. This type of transition is not generically + * necessary. + * + * \sa CriMvPly, CriMvPlyStatus, criMvPly_ExecuteAll() + */ +void CRIAPI criMvPly_Execute(CriMvPly mvply); + +/* t@Cǂݍ݃obt@̋󂫃`N擾 */ +/* + * \brief t@Cǂݍ݃obt@̋󂫃`N擾 + * \param mvply : CRI Movie nh + * \param ck : `N + * \return Ȃ + * \par : + * t@Cǂݍ݃obt@̋󂫗̈擾܂B
+ * 擾󂫗̈i`NƌĂт܂j́Af[^݂ʒm邳 + * ̂܂܎gp܂̂ŁAAvP[VŋLĂB
+ * PxɎ擾ł`N͂P‚݂̂łB
+ * `N擾łۂ́A`ÑTCYŔł܂B
+ * f[^݂̏IAcriMvPly_PutInputChunk֐ŏ݃TCYʒmĂB
+ */ +/* + * \ingroup MODULE_SUPPLY + * \brief Get a free chunk from file reading buffer + * \param mvply A valid CriMvPly handle + * \param ck A CriChunk structure to be filled with data by this function + * + * This function selects an empty internal buffer for your data source to read its data into. + * An area of this type is referred to as a "chunk." + * After calling this function, the ck->data and ck->size + * fields will provide a valid pointer and size, respectively, that your data + * source should copy its data into. + * If no buffers can internally be allocated, this function will return 0 as the + * ck->size field. If this occurs, your program should choke input until a free + * buffer can be allocated. + * Typical data sources are native file reading, sequential memory access, or + * playback from a network source. + * The ck->size field is dynamically calculated when criMvPly_AllocateWorkBuffer() + * is called; it is calculated based on expected data rate and video resolutions + * embedded in the stream file. + * + * After you receive a valid chunk from criMvPly_GetInputChunk(), + * you can fill the provided chunk up to the ck->size limit. After you + * fill the chunk with valid data, call the criMvPly_PutInputChunk() function + * to queue the data for processing. The functions criMvPly_GetInputChunk() and + * criMvPly_PutInputChunk() should be called in equal pairs; calling these + * functions out of order will produce odd results. No dynamic chunk reordering + * is permitted; serial calls with out-of-order chunks will be + * flagged at run-time as an error. + * + * This function will only return a valid chunk if the CriMvPly handle is in + * one of two playback states: CRIMVPLY_STATUS_PLAY or CRIMVPLY_STATUS_DECHDR. + * You can verify the current playback state with criMvPly_GetStatus(). + * + * \sa criMvPly_GetStatus(), criMvPly_PutInputChunk(), criMvPly_AllocateWorkBuffer(), + * CriChunk, CriMvPlyStatus + */ +void CRIAPI criMvPly_GetInputChunk(CriMvPly mvply, CriChunk *ck); + +/* t@Cǂݍ݃obt@ւ̃f[^ݒʒm */ +/* + * \brief t@Cǂݍ݃obt@ւ̃f[^ݒʒm + * \param mvply : CRI Movie nh + * \param ck : + * \param inputsize : + * \return Ȃ + * \par : + * criMvPly_GetInputChunk֐Ŏ擾󂫗̈i`NƌĂт܂j + * f[^ݏIAinputsizeɃf[^TCYĖ{֐ĂяoĂB
+ * ̍ہA`N criMvPly_GetInputChunk֐Ŏ擾̂Ɠ`NKw肵ĂB + */ +/* + * \ingroup MODULE_SUPPLY + * \brief Put a data chunk into file read buffer + * \param mvply A valid CriMvPly handle + * \param ck A CriChunk structure containing source data + * \param inputsize The number of bytes actually supplied + * + * This function informs the CriMvPly handle that the CriChunk structure + * now contains valid data from the data source. Typically, you would call + * this function after your asynchronous file read reports that the buffer is + * full of data. + * + * The inputsize field should contain the number of bytes actually provided. + * This value can be less than or equal to ck->size. In an end-of-file condition, + * be sure to supply the actual number of bytes remaining in the file, and not + * merely the size of the input buffer, to criMvPly_PutInputChunk(). + * Do not modify the contents of the CriChunk after calling this function; + * instead, call criMvPly_GetInputChunk() to get a new chunk for further input. + * + * This function invalidates the CriChunk provided if the function is called + * while the CriMvPly handle is in the CRIMVPLY_STATUS_STOP, the + * CRIMVPLY_STATUS_WAIT_PREP, or the CRIMVPLY_STATUS_STOP_PROCESSING state. + * You can verify the current playback state with criMvPly_GetStatus(). + * + * After you receive a valid chunk from criMvPly_GetInputChunk(), + * you can fill the provided chunk up to the ck->size limit. After you call + * fill the chunk with valid data, call the criMvPly_PutInputChunk() function + * to queue the data for processing. The function criMvPly_GetInputChunk() and + * criMvPly_PutInputChunk() should be called in equal pairs; calling these + * functions out of order will produce odd results. No dynamic chunk reordering + * is permitted; serial calls with out-of-order chunks will be + * flagged at run-time as an error. + * + * After putting the final chunk of data in the stream, call + * criMvPly_TerminateSupply() to indicate that an end-of-file condition exists. + * + * \sa criMvPly_GetStatus(), criMvPly_GetInputChunk(), criMvPly_AllocateWorkBuffer(), + * criMvPly_TerminateSupply(), CriChunk, CriMvPlyStatus + */ +void CRIAPI criMvPly_PutInputChunk(CriMvPly mvply, CriChunk *ck, CriUint32 inputsize); + +/* t@CǂݍݏI̒ʒm */ +/* + * \brief t@CǂݍݏI̒ʒm + * \param mvply : CRI Movie nh + * \return Ȃ + * \par : + * ĐSẴf[^ǂݍŁA criMvPly_PutInputChunk֐ŒʒmIA + * {֐Ńt@CǂݍݏI̒ʒmKsĂB
+ * Iʒmꂽ_œǂݍ݃obt@ɏ܂ꂽSẴf[^fR[hIƁA + * nhԂWAIT_PLAYENDɑJڂ܂B
+ * {֐ĂяoȂAWAIT_PLAYENDԂɂȂ邱Ƃ͂܂B + */ +/* + * \ingroup MODULE_SUPPLY + * \brief Notify end of reading data + * \param mvply A valid CriMvPly structure + * + * After you put all the source data into the CriMvPly handle with + * criMvPly_PutInputChunk(), indicate the end of the movie file by calling + * criMvPly_TerminateSupply(). After calling this function, the CriMvPly + * handle's status is changed by the library to CRIMVPLY_STATUS_WAIT_PLAYEND + * and the library completes processing of whatever frames it has internally + * buffered. + * + * If you do not call this function, the CriMvPly handle will never transition + * to the CRIMVPLY_STATUS_WAIT_PLAYEND state, making teardown impossible. + * + * \sa criMvPly_PutInputChunk(), CriMvPly, CriMvPlyStatus + */ +void CRIAPI criMvPly_TerminateSupply(CriMvPly mvply); + +#if 0//defined(XPT_TGT_EE) +/* RGB32tH[}bg̃rfIt[̎擾 */ +/* + * \if ps2 + * \brief RGB32tH[}bg̃rfIt[̎擾 + * \param mvply : CRI Movie nh + * \param imagebuf : rfIt[obt@ + * \param bufsize : obt@TCY + * \param frameinfo : t[ + * \return 擾łꍇTRUE, łȂꍇFALSE + * \par : + * Ŏw肵obt@ɁAPS2̃}NubNRGBA32tH[}bgŃt[擾܂B
+ * CriMvFrameInfo\̂ɂ́A擾t[ɂ‚Ă̏񂪊i[܂B
+ * t[擾ł̂́AnhԂWAIT_PLAYING^PLAYING݂̎̂łB
+ * ȊȌԂŌĂяoA܂͓̓f[^s̏ꍇɂ́A{֐̓t[̎擾ɎsAɕA܂B
+ * t[擾łȂꍇ́A֐lFALSEԂ܂B
+ * ۂ̃rfIfR[h{֐œ߁At[擾łꍇɂ́Ȁd֐ƂȂ܂B + * \endif + */ +/* + * \if ps2 + * \ingroup MODULE_VIDEO + * \brief Get a video frame in PS2 macroblock RGB32 format + * \param mvply A valid CriMvPly handle + * \param imagebuf a pointer to the video buffer in memory to receive the frame + * \param bufsize video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * The format of this buffer is specific to the PS2. This function will only return + * a valid frame if the CriMvPly handle is in the CRIMVPLY_STATUS_WAIT_PLAYING or the + * CRIMVPLY_STATUS_PLAYING state. + * + * This function is an EE-intensive activity, and the amount of time required + * is variable, depending on the complexity and size of the video frame being decoded. + * Therefore the preferred method of calling this function is in a low priority thread, + * separate from your I/O, buffer management, and criMvPly_Execute() routines. + * + * If this function returns true, the preferred display time of the video frame is calculated + * as: + * + * \code + * frameinfo.time / frameinfo.tunit + * \endcode + * + * Humans notice audio stuttering much more readily than a dropped video frame during + * a video decode process. If the frame reported by criMvPly_GetFrameRGBA32_PS2() + * arrives after your system clock says the frame should be displayed, you should + * simply drop the frame without bothering to DMA it to video memory. + * + * Here is an example showing how to drop frames in this case: + * + * \dontinclude crimvt01_simple_playback_ps2.c + * \skip Get video frame + * \until *tutor_update_video_frame_on_display_time* + * + * It is not preferred, but it is possible, to call this function in a single-threaded + * playback model. In this case, it is important to allocate more heap space + * and service the CriMvPly handle with criMvPly_Execute() or criMvPly_ExecuteAll() + * frequently, as well as criMvPly_GetWave16() frequently. This helps to cover + * for the case where other I/O needs to occur when a frame is currently being decoded by + * criMvPly_GetFrameRGBA32_PS2(). + * + * \image html crimvply_getframergba32_ps2.png The DMA reordering step on PS2 + * + * In order to get acceptable performance on the PS2, a macroblock reordering step + * must take place during the DMA transfer from EE RAM to video RAM. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameRGBA32_PS2(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 bufsize, CriMvFrameInfo *frameinfo); + +CriBool CRIAPI criMvPly_DecodeFrameRGBA32_PS2(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +#endif + +#if defined(XPT_TGT_PC) || defined(XPT_TGT_XBOX360) || defined(XPT_TGT_WII) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) +/* + * \if pc + * \ingroup MODULE_VIDEO + * \brief Get a video frame in YUV422 format + * \param mvply A valid CriMvPly handle + * \param imagebuf A pointer to the video buffer in memory to receive the frame + * \param pitch Number of bytes in one row of the video buffer + * \param bufsize Video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * + * This function is a CPU-intensive activity, and the amount of time required + * is variable, depending on the complexity and size of the video frame being decoded. + * Therefore the preferred method of calling this function is in a low priority thread, + * separate from your I/O, buffer management, and criMvPly_Execute() routines. + * + * If this function returns true, the preferred display time of the video frame is calculated + * as: + * + * \code + * frameinfo.time / frameinfo.tunit + * \endcode + * + * It is not preferred, but it is possible, to call this function in a single-threaded + * playback model. In this case, it is important to allocate more heap space + * and service the CriMvPly handle with criMvPly_Execute() or criMvPly_ExecuteAll() + * frequently, as well as criMvPly_GetWave16() frequently. + * + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameYUV422(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +#endif + +/* 16bit WAVEtH[}bg̃I[fBIf[^擾 */ +/* + * \brief 16bit WAVEtH[}bg̃I[fBIf[^擾 + * \param mvply : CRI Movie nh + * \param nch : `l + * \param waveptr : I[fBIf[^obt@ + * \param wavesmpl : vTv(obt@TCY) + * \param waveinfo : 16bit Waveform + * \return 擾łTv + * \par : + * 16bitWAVEtH[}bgŃI[fBIf[^擾܂Bwaveptrɂ́Anch̃obt@|C^i[ + * zw肵ĂB
+ * CriMvWaveInfo\̂ɂ́A擾I[fBIf[^ɂ‚Ă̏񂪊i[܂B
+ * ̓f[^sȂǂŗvꂽTṽfR[hłȂꍇ܂B
+ * (@\) {֐̏dȂĂłAȂׂvꂽ̃I[fBIf[^擾郂[hB + */ +/* + * \ingroup MODULE_AUDIO + * \brief Get 16bit wave audio data + * \param mvply A currently playing CriMvPly handle + * \param nch The number of audio channels to get in this call + * \param waveptr An array of audio data buffers to copy audio data into + * \param wavesmpl The number of requested wave data samples (must be less than buffer size) + * \param waveinfo A structure filled by this function with info about this wave + * \return The number of wave data samples actually copied into the buffer + * + * This function copies currently decoding audio data into your output buffer + * for you to send to the audio output. The output format is a sixteen-bit PCM + * format. The data provided is "current", e.g. you should try to minimize latency. + * while delivering the audio data to the output device. + * + * This function will return an empty audio buffer if the input to the CriMvPly + * handle is starving for data, or if criMvPly_Execute() or criMvPly_ExecuteAll() + * has not been called recently. + * + * Note that this function actually copies data. However, the expected bandwidth + * for moving audio data in memory is minimal -- about 176400 bytes per second for + * a stereo stream, which is typically a fraction of 1% of the bandwidth available + * on modern game systems. + * + * For debugging tips on stuttering, see \ref crim_section_stuttering . + */ +CriUint32 CRIAPI criMvPly_GetWave16(CriMvPly mvply, CriUint32 nch, CriSint16 *waveptr[], + CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); +CriUint32 CRIAPI criMvPly_GetWave32(CriMvPly mvply, CriUint32 nch, CriFloat32 *waveptr[], + CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); + + +#if defined(XPT_TGT_EE) +/* XNb`pbhRAMgpݒ */ +/* XNb`pbhRAM̎gpݒ(nh쐬OɌĂяo) */ +/* + * \brief XNb`pbhRAMgpݒ + * \param sw : + * \return Ȃ + * \par : + * XNb`pbhRAM̎gpݒs܂B
+ * ftHgOFFłB + */ +/* + * \if ps2 + * \ingroup MODULE_INIT + * \brief Enable or disable PS2 scratch pad (SPRAM) usage + * \param sw : ON to enable scratch pad use, OFF to disable + * + * This function determines whether the video decode step uses the PS2 + * SPRAM memory area for its work. The performance of this library is + * increased by around 30% when using SPRAM; however, this use might + * conflict with graphics engines that depend on exclusive access to SPRAM. + * However, on the PS2, the video decode step occurs synchronously to the + * criMvPly_GetFrameRGBA32_PS2() function, so you can take appropriate external + * locking measures to intelligently synchronize SPRAM utilization. + * The value set by criMvPly_SetUseScratchPadRAM_PS2() is internally checked + * exactly once, during the criMvPly_Create() step; calling this function + * after criMvPly_Create() has no effect. The default setting for this + * function is OFF. + * \endif + */ +void CRIAPI criMvPly_SetUseScratchPadRAM_PS2(CriBool sw); +#endif + + +/* ̍ĐJn */ +/* + * \brief ̍ĐJn + * \param mvply : CRI Movie nh + * \param memptr : ̃[rf[^̐擪AhX + * \param memsize : ̃[rf[^̃TCY + * \return Ȃ + * \par : + * ̃[rĐJn܂B
+ * {֐̌ĂяoOɁA炩߃[rf[^̑SĂɓǂݍłĂB + */ +/* + * \ingroup MODULE_STATE + * \brief Start playback from movie file on memory + * \param mvply A currently playing CriMvPly handle + * \param memptr A address of movie file + * \param memsize The size of movie file + * + * Start playback from memory.
+ * Please read movie file to memory before playback. + */ +void CRIAPI criMvPly_StartMemory(CriMvPly mvply, CriUint8* memptr, CriUint32 memsize); + + +/* + * YUV•ʃobt@ւ̃t[擾 + */ +/* + * \if xbox360 + * \ingroup MODULE_VIDEO + * \brief Get a video frame to Y,U,V independently texture buffers + * \param mvply A valid CriMvPly handle + * \param yuvbuffers Information about Y,U,V independently texture buffers + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the Y,U,V texture buffers. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameYUVBuffers(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, CriMvFrameInfo *frameinfo); + + +/* + * rfĨfR[h + */ +/* + * \ingroup MODULE_VIDEO + * \param mvply The movie player handle + * \return returns the number of decoded frames + * + */ +CriUint32 CRIAPI criMvPly_DecodeVideo(CriMvPly mvply); + +/* + * wb_̃fR[h + */ +/* + * + * \ingroup MODULE_VIDEO + * \param mvply The movie player handle + * + */ +void CRIAPI criMvPly_DecodeHeader(CriMvPly mvply); + +/* + * fR[hXLbvw + * \par : + * ̊֐s񐔂Ǎ̃fR[hɎIɂPBsN`XLbvB
+ * XLbvwõt[́Aۂ̃XLbvsĂȂĂ + * \̓XLbv̂Ƃĕ␳B + */ +/* + * \ingroup MODULE_VIDEO + * \param mvply The movie player handle + * \return returns the number of decoded frames + * + * After calling SkipFrame function, Decoding function skip B-picture. + * To avoid that application judge continuous wrong skip, After calling + * SkipFrame function, next frame time will be adjusted. + */ +void CRIAPI criMvPly_SkipFrame(CriMvPly mvply); + + +#if 0 +/* + * YUVA8tH[}bg̃t[擾 + */ +/* + * \if ps3 + * \ingroup MODULE_VIDEO + * \brief Get a video frame in YUVA8 format. + * \param mvply A valid CriMvPly handle + * \param imagebuf A pointer to the video buffer in memory to receive the frame + * \param pitch Number of bytes in one row of the video buffer + * \param bufsize Video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameYUVA8_PS3(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +#endif + +/* + * ARGB8888tH[}bgŃt[擾 + */ +/* + * \if ps3 + * \ingroup MODULE_VIDEO + * \brief Get a video frame in ARGB8888 format. + * \param mvply A valid CriMvPly handle + * \param imagebuf A pointer to the video buffer in memory to receive the frame + * \param pitch Number of bytes in one row of the video buffer + * \param bufsize Video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameARGB8888(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +void CRIAPI criMvPly_InitializeFrameARGB8888(void); + + +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) +/* + * RGB565tH[}bgŃt[擾 + */ +/* + * \ingroup MODULE_VIDEO + * \brief Get a video frame in RGB565 format + */ +CriBool CRIAPI criMvPly_GetFrameRGB565(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +void CRIAPI criMvPly_InitializeFrameRGB565(void); +#endif + +/* + * ̃t[̏񂾂擾 + */ +/* + * \ingroup MODULE_VIDEO + * \brief Get a information of next video frame (without actual video frame). + */ +CriUint8* CRIAPI criMvPly_GetNextFrameInfo(CriMvPly mvply, CriMvFrameInfo *frameinfo); + +/* + * ̃t[̂Ă + */ +CriBool CRIAPI criMvPly_DiscardNextFrame(CriMvPly mvply, CriMvFrameInfo *frameinfo); + +/* + * Đ(PREPWAIT_PLAYING)ɂȂ܂łɒt[̎w + * ̊֐ĂяoȂ΁At[ = t[v[ + */ +void CRIAPI criMvPly_SetNumberOfFramesForPrep(CriMvPly mvply, CriSint32 nframes); + +/* + * For Debug use. + */ +void CRIAPI criMvPly_SetSeekPosition(CriMvPly mvply, CriSint32 seek_frame_id, CriSint32 video_gop_top_id); +void CRIAPI criMvPly_SetSeekAlphaPosition(CriMvPly mvply, CriSint32 alpha_gop_top_id); +void CRIAPI criMvPly_CalcSeekPosition(CriMvPly mvply, void *seektbl_ptr, CriUint32 seektbl_size, Sint32 frame_id, Uint64 *offset, Sint32 *gop_top_id); + +/* for specific use */ +/* {fBAhX̐ݒ */ +void CRIAPI criMvPly_SetBodyData(CriMvPly mvply, const CriUint64Adr body_ptr, CriSint64 body_size); + +/* SJуobt@TCY̎擾iobt@TCYA[hTCYNULLwŏȗj */ +CriSj CRIAPI criMvPly_GetInputSj(CriMvPly mvply, CriUint32 *buffer_size, CriUint32 *reload_threshold); + +/* O^CvwɂCxg|Cg̎擾 */ +//Bool criMvPly_SearchEventPointByName(CriMvPly mvply, Char8 *cue_name, Sint32 type, CriMvEventPoint *eventinfo); +/* Cxg|Cg񂩂t[IDւ̕ϊ */ +//Sint32 criMvPly_CalcFrameIdFromCuePoint(CriMvPly mvply, CriMvEventPoint *eventinfo); + +CriBool CRIAPI criMvPly_AttachSubAudio(CriMvPly mvply, CriHeap heap, CriUint32 track); +CriUint32 CRIAPI criMvPly_GetSubAudioWave16(CriMvPly mvply, CriUint32 nch, CriSint16 *waveptr[], CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); +CriUint32 CRIAPI criMvPly_GetSubAudioWave32(CriMvPly mvply, CriUint32 nch, CriFloat32 *waveptr[], CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); +void CRIAPI criMvPly_DetachSubAudio(CriMvPly mvply); + +void CRIAPI criMvPly_GetSubtitle(CriMvPly mvply, CriUint8 *bufptr, CriUint32 bufsize, CriMvSubtitleInfo *info); +void CRIAPI criMvPly_GetNextSubtitleInfo(CriMvPly mvply, CriMvSubtitleInfo *info); + +/* ̓obt@̃f[^ʂ[byte] */ +CriUint32 CRIAPI criMvPly_PeekInputBufferData(CriMvPly mvply); +/* ̃[rSJɒlj */ +void CRIAPI criMvPly_AddInputMemory(CriMvPly mvply, CriUint8* memptr, CriUint32 memsize); + + +/* 擾łI[fBIf[^̃Tv𒲂ׂ */ +CriUint32 CRIAPI criMvPly_GetDataSizeMainAudio(CriMvPly mvply, CriUint32 nch); +/* 擾łI[fBIf[^̃Tv𒲂ׂ */ +CriUint32 CRIAPI criMvPly_GetDataSizeSubAudio(CriMvPly mvply, CriUint32 nch); + +/* C̃I[fBI̍ĐIĂ邩ǂ𒲂ׂ */ +CriBool CRIAPI criMvPly_IsEndMainAudioPlayback(CriMvPly mvply); +/* TũI[fBI̍ĐIĂ邩ǂ𒲂ׂ */ +CriBool CRIAPI criMvPly_IsEndSubAudioPlayback(CriMvPly mvply); + +/* CI[fBIǂ𒲂ׂ (fR[ho̓obt@) */ +CriBool CRIAPI criMvPly_IsActiveMainAudioPlayback(CriMvPly mvply); + +/* [NmۑOɐݒύX邱 */ +void CRIAPI criMvPly_SetPcmFormat(CriMvPly mvply, CriMvPcmFormat pcmfmt); + +#if defined(XPT_TGT_PC) +/* [PC] }`vZbT̎w */ +//void CRIAPI criMvPly_SetProcessorParameters_PC(CriMvPly mvply, Sint32 thread_num, Uint32 *affinity_masks, Sint32 *priorities); +#endif + +#if defined(XPT_TGT_XBOX360) +/* [Xbox360] }`vZbT̎w */ +void CRIAPI criMvPly_SetProcessorParameters_XBOX360(CriMvPly mvply, Sint32 thread_num, CriUint32 processor_mask, CriSint32 *priorities); +#endif + +#if defined(XPT_TGT_PS3PPU) +/* [PS3] SPURS̎w */ +void CRIAPI criMvPly_SetupSpursParameters_PS3(const CriMvProcessorParameters_PS3 *processor_param); + /* [PS3] SPUXbhɂ}`vZbT̎w */ +void CRIAPI criMvPly_SetupSpuThreadParameters_PS3(const CriMvSpuThreadParameters_PS3 *spu_thread_param); +void CRIAPI criMvPly_SetGraphicEnv(CriMvGraphicEnv env); +CriMvGraphicEnv CRIAPI criMvPly_GetGraphicEnv(void); +#endif + +/* t[v[̎擾 */ +void CRIAPI criMvPly_GetFramePoolInfo(CriMvPly mvply, CriSint32 *num_input, CriUint32* num_data, CriUint32* num_ref, CriUint32* num_hold, CriUint32* num_free); + +/* Đł`l؂ւ */ +void CRIAPI criMvPly_SetSubtitleChannel(CriMvPly mvply, CriSint32 chno); + +/* |C^擾ăt[v[̃obt@bN */ +CriBool CRIAPI criMvPly_LockFrameBuffer(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, CriMvFrameInfo *frameinfo); +/* bNĂt[v[ */ +CriBool CRIAPI criMvPly_UnlockFrameBuffer(CriMvPly mvply, CriMvFrameInfo *frameinfo); + +/* + * For Sofdec2 + */ +CriMvPly CRIAPI criMvPly_CreateWithWork(void *work, CriSint32 size, CriMvHandleConfig *config); +CriSint32 CRIAPI criMvPly_CalcHandleWorkSize(CriMvHandleConfig *config); +CriSint32 CRIAPI criMvPly_CalcPlaybackWorkSize(CriMvPly mvply, CriMvStreamingParameters *stmprm); +CriBool CRIAPI criMvPly_AllocateWorkBufferWithWork(CriMvPly mvply, void *work ,Sint32 work_size, CriMvStreamingParameters *stmprm); +void CRIAPI criMvPly_SetMetaDataWorkAllocator(CriMvPly mvply, CriMvMetaDataWorkMallocFunc allocfunc, CriMvMetaDataWorkFreeFunc freefunc, void *usrobj, CriMvMetaFlag meta_flag); +CriSint32 criMvPly_CalcSubAudioWorkSize(CriMvPly mvply, const CriMvAudioParameters *aprm); +CriBool criMvPly_CopyFrameYUVBuffers(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, + const CriMvFrameInfo *frameinfo,const CriMvAlphaFrameInfo *alpha_frameinfo); +CriBool criMvPly_CopyFrameARGB8888Buffer(CriMvPly mvply, CriUint8 *dst_buf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *src_bufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf); +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) || defined(XPT_TGT_TRGP6K) +CriBool criMvPly_CopyFrameRGB565Buffer(CriMvPly mvply, CriUint8 *dst_buf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *src_bufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf); +#endif +CriBool criMvPly_LockAlphaFrameBuffer(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, CriMvAlphaFrameInfo *alpha_frameinfo); +CriBool criMvPly_UnlockAlphaFrameBuffer(CriMvPly mvply, CriMvAlphaFrameInfo *alpha_frameinfo); +CriSint32 criMvPly_GetNumPictureData(CriMvPly mvply); +const CriMvPlyHeaderInfo* criMvPly_GetCurrentStreamInfo(CriMvPly mvply); +/* for debug */ +CriBool CRIAPI criMvPly_GetAlphaFrame(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriMvAlphaFrameInfo *alpha_frameinfo); + +/* OUTER_FRAMEPOOL_WORK */ +/* t[v[p[NvZBnhNULLwOKB */ +CriSint32 criMvPly_CalcFramepoolWorkSize(CriMvPly mvply, const CriMvStreamingParameters *stmprm); +/* t[v[p[Nݒ */ +void criMvPly_SetFramepoolWork(CriMvPly mvply, void *work, CriSint32 work_size); +/* t[v[p[NAP[^ݒ */ +void criMvPly_SetFramepoolWorkAllocator(CriMvPly mvply, CriMvFramepoolWorkMallocFunc allocfunc, CriMvFramepoolWorkFreeFunc freefunc, void *usrobj); + +/* V[NubN̎擾 */ +/* <> + * - seektbl_ptr : UTFAhX + * - seektbl_size : UTFTCY + * - num_seekblock : o͔z̗vf + * + * - blockinfo : V[NubNzւ̃|C^inum_seekblock̗̈mۂēnƁj + */ +void criMvPly_GetSeekBlockInfo(CriMvPly mvply, void *seektbl_ptr, CriUint32 seektbl_size, CriSint32 num_seekblock, CriMvSeekBlockInfo *blockinfo); + +/* t[[g̋w */ +void criMvPly_SetVideoFramerate(CriMvPly mvply, CriUint32 framerate_n, CriUint32 framerate_d); + +/* L̐ݒ */ +void criMvPly_SetSyncFlag(CriMvPly mvply, CriBool sync_flag); + +/* Д\̖₢킹 */ +CriBool criMvPly_IsPlayable(CriMvPly mvply, const CriMvStreamingParameters *stmprm); + + + +#ifdef __cplusplus +} +#endif + +#endif /* CRI_MOVIE_CORE_H_INCLUDED */ diff --git a/3rdParty/cri/XboxOne/include/cri_movie_xboxone.h b/3rdParty/cri/XboxOne/include/cri_movie_xboxone.h new file mode 100644 index 00000000..519d1c30 --- /dev/null +++ b/3rdParty/cri/XboxOne/include/cri_movie_xboxone.h @@ -0,0 +1,96 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2013 CRI Middleware Co., Ltd. + * + * Library : CRI Movie + * Module : Library User's Header + * File : cri_movie_xboxone.h + * Date : 2013-11-25 + * + ****************************************************************************/ +/*! + * \file cri_movie_xboxone.h + */ +#ifndef CRI_MOVIE_XBOXONE_H_INCLUDED /* Re-definition prevention */ +#define CRI_MOVIE_XBOXONE_H_INCLUDED + +/*************************************************************************** + * Include file + ***************************************************************************/ +#include +#include + +#include +#include + +/*************************************************************************** + * Variable Declaration + ***************************************************************************/ +namespace CriMv { + extern CriError ErrorContainer; +} + +/*************************************************************************** + * Prototype Functions + ***************************************************************************/ +namespace CriMv { + /*EN + * \ingroup MODULE_OPTION + * \brief Set processor parameters for decoding (Library Global) + * + * \param num_threads Number of additional threads for load distribution in decoding (Maximum 5 threads) + * \param affinity_mask Pointer to an array of thread affinity masks for each thread specified with num_threads. + * \param priorities Pointer to an array of thread priority for each thread specified with num_threads. + * \param err Optional error code + * + * This function sets the processor parameters for decoding as default setting of library global. + * Use it when you want to change processors or thread priority for decoding load distribution. + * + * If this function is called, it must be called before library initialization. + * + * On initialization, CRI Movie prepares 5 worker threads for distributed decoding.
+ * + * \a num_threads specifies how many worker threads CRI Movie should use.
+ * \a affinity_mask is an array of affinity masks for the worker threads. This array must have + * \a num_threads many elements. + * \a priorities is an array of thread priority for the worker threads. This array must have + * \a num_threads many elements. + * The format of \a affinity_mask and \a priorities is same as for the value passed to the OS standard API.
+ * + * If this function is not called, 5 distributed decoding threads will run in parallel by default. + * Also, processor assignment of the decoding threads is handled by the operating system, and their + * priority will be THREAD_PRIORITY_BELOW_NORMAL. + */ + /*JP + * \ingroup MODULE_OPTION + * \brief fR[hɎgljvZbTݒiCuŚj + * \param num_threads וUfR[hpɎgpljXbh̐ (őTj + * \param affinity_masks XbhAtBjeB}XN̔zւ̃|C^Bnum_threadsŎw肵XbhƂ̃}XNlB + * \param priorities ljXbh̗Dxzւ̃|C^B + * \param err G[iȗj + * + * fR[h𕪎Uď邽߂̃vZbTCuŜɎw肵܂B + * fR[hɍsvZbTXbhDxύXꍇɎgpĂB + * {֐̓CuOɌĂяoKv܂B + * + * CRI Movie͏̍ۂɂT‚̕UfR[hp̃[J[Xbhpӂ܂B + * num_threadsŁÂ̂‚̃XbhۂɎgp邩wł܂B + * AvP[V疾IɃvZbT蓖ĂsꍇAX̃Xbhɑ΂ + * AtBjeB}XNƃXbhDxݒ肵ĂB + * AtBjeB}XNƃXbhDx̒ĺAOSW֐̈ƓłB + * + * ̊֐Ă΂ȂꍇAT‚̃XbhŕfR[hs܂B + * fR[hXbh̃vZbT͊蓖Ă͑SOSCŁADxTHREAD_PRIORITY_BELOW_NORMALɂȂ܂B + */ + void SetUsableProcessors_XBOXONE( + CriSint32 num_threads, + const DWORD_PTR *affinity_masks, + const int *priorities, + CriError &err = CriMv::ErrorContainer); +} + + + +#endif /* CRI_MOVIE_XBOXONE_H_INCLUDED */ diff --git a/3rdParty/cri/XboxOne/include/cri_sj.h b/3rdParty/cri/XboxOne/include/cri_sj.h new file mode 100644 index 00000000..9b7047b4 --- /dev/null +++ b/3rdParty/cri/XboxOne/include/cri_sj.h @@ -0,0 +1,189 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2006-2010 CRI Middleware Co., Ltd. + * + ****************************************************************************/ + +#ifndef _CRI_SJ_H_INCLUDED +#define _CRI_SJ_H_INCLUDED +/**************************************************************************** + * * + * CRI Stream Joint "CriSj" Library * + * * + * 2005-06-21 written by M.Oshimi * + * * + ****************************************************************************/ + +/**************************************************************************** + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" +#include "cri_heap.h" + +/**************************************************************************** + * MACRO CONSTANT * + ****************************************************************************/ + +/* Version number of CriSj */ +#define CRISJ_NAME_STRINGS "CRI Stream Joint" +#define CRISJ_VERSION_STRINGS "1.01.00" + +#define CRISJUNI_MAX_LINE (4) +#define CRICHUNK_MAX_SIZE (0xffffffff) + +/*********************************************************************** + * Process MACRO + ***********************************************************************/ + +/**************************************************************************** + * Data type declaration * + ****************************************************************************/ + +/* Xg[C */ +typedef enum { + CRISJ_LINE_FREE = (0), + CRISJ_LINE_DATA = (1), + CRISJ_LINE_HOLD = (2), + CRISJ_LINE_EXTRA = (3), + /* enum be 4bytes */ + CRISJ_LINE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriSjLine; + +/* `N */ +#ifndef TYPEDEF_CRICHUNK +#define TYPEDEF_CRICHUNK +typedef struct { + CriUint8 *data; /* f[^ */ + CriUint32 size; /* oCg */ +} CriChunk; +#endif + +/* CriSjnh */ +/* CriSj handle */ +typedef struct { + struct _crisj_function_table *vtbl; + const CriChar8 *name; +} CriSjObj, *CriSj; + +typedef struct _crisj_function_table { + /* nh̏ */ + void (*Destroy)(CriSj sj); + /* Zbg */ + void (*Reset)(CriSj sj); + /* `N̎擾 (FIFO̐擪擾) */ + void (*GetChunk)(CriSj sj, CriSjLine id, CriUint32 nbyte, CriChunk *ck); + /* `N߂@(FIFO̐擪ɑ}) */ + void (*UngetChunk)(CriSj sj, CriSjLine id, CriChunk *ck); + /* `N} (FIFO̍Ōɑ}) */ + void (*PutChunk)(CriSj sj, CriSjLine id, CriChunk *ck); + /* C擾ł鑍oCg̎擾 */ + CriUint32 (*GetTotalSize)(CriSj sj, CriSjLine id); +} CriSjVirtualFunctionTable; + +typedef enum { + CRISJ_UNIMODE_SEPARATE = (0), + CRISJ_UNIMODE_JOIN = (1), + /* enum be 4bytes */ + CRISJ_UNIMODE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriSjUniversalMode; + + +typedef struct CriSjRbfConfig { + CriBool use_cs; + CriUint32 buffer_size; + CriUint32 extra_size; + CriUint32 alignment; + const CriChar8 *buffer_name; +} CriSjRbfConfig; + +typedef struct CriSjMemConfig { + CriBool use_cs; + CriUint8 *data; + CriUint32 data_size; +} CriSjMemConfig; + +typedef struct CriSjUniConfig { + CriBool use_cs; + CriSjUniversalMode mode; + CriUint32 num_chunks; +} CriSjUniConfig; + +/**************************************************************************** + * Function Declaration * + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Oobt@^SJ̍쐬 */ +CriSint32 CRIAPI criSjRbf_CalculateWorkSize(const CriSjRbfConfig* config); +CriSj CRIAPI criSjRbf_Create(const CriSjRbfConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjRbf_CreateByHeap(const CriSjRbfConfig *config, CriHeap heap, CriHeapType heap_type); + +/* 풓^SJ̍쐬 */ +CriSint32 CRIAPI criSjMem_CalculateWorkSize(const CriSjMemConfig* config); +CriSj CRIAPI criSjMem_Create(const CriSjMemConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjMem_CreateByHeap(const CriSjMemConfig *config, CriHeap heap, CriHeapType heap_type); + +/* jo[TSJ̍쐬 */ +CriSint32 CRIAPI criSjUni_CalculateWorkSize(const CriSjUniConfig* config); +CriSj CRIAPI criSjUni_Create(const CriSjUniConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjUni_CreateByHeap(const CriSjUniConfig *config, CriHeap heap, CriHeapType heap_type); +/* `FCv[̎擾 */ +CriSint32 CRIAPI criSjUni_GetNumChainPool(CriSj sj); + +void CRIAPI criSj_Destroy(CriSj sj); +void CRIAPI criSj_Reset(CriSj sj); +void CRIAPI criSj_GetChunk(CriSj sj, CriSjLine line, CriUint32 nbyte, CriChunk *ck); +void CRIAPI criSj_UngetChunk(CriSj sj, CriSjLine line, CriChunk *ck); +void CRIAPI criSj_PutChunk(CriSj sj, CriSjLine line, CriChunk *ck); +CriUint32 CRIAPI criSj_GetTotalSize(CriSj sj, CriSjLine line); +void CRIAPI criSj_SplitChunk(CriChunk *ck, CriUint32 nbyte, CriChunk *ck1, CriChunk *ck2); + +/*** +* New APIs +***/ + +CriUint32 CRIAPI criSj_GetInputFreeSize(CriSj sj); +void CRIAPI criSj_GetInputChunk(CriSj sj, CriChunk *ck); +void CRIAPI criSj_PutInputChunk(CriSj sj, CriChunk *ck, CriUint32 input_size); +CriUint32 CRIAPI criSj_GetOutputDataSize(CriSj sj); +void CRIAPI criSj_GetOutputChunk(CriSj sj, CriChunk *ck); +void CRIAPI criSj_PutOutputChunk(CriSj sj, CriChunk *ck, CriUint32 output_size); + +CriUint32 CRIAPI criSj_PutOutputChunk2(CriSj sj, CriChunk *ck1, CriChunk *ck2, CriUint32 output_size); + + +/*** +* Old Interface (for compatibility) +***/ +typedef struct _CriSjConfig { + CriBool use_cs; + CriHeapType heap_type; +} CriSjConfig; + +CriSj CRIAPI criSj_CreateRingBuffer(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align); +CriSj CRIAPI criSj_CreateNamedRingBuffer(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriChar8 *bname); +CriSj CRIAPI criSj_CreateRingBufferWithConfig(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriSjConfig *config); +CriSj CRIAPI criSj_CreateNamedRingBufferWithConfig(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriChar8 *bname, const CriSjConfig *config); +CriSint32 CRIAPI criSjRbf_GetRequiredMemorySizeWithConfig(CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriSjConfig *config); + +CriSj CRIAPI criSj_CreateMemory(CriHeap heap, CriUint8 *data, CriUint32 dtsize, CriUint32 align); +CriSj CRIAPI criSj_CreateMemoryWithConfig(CriHeap heap, CriUint8 *data, CriUint32 dtsize, CriUint32 align, const CriSjConfig *config); +CriSint32 CRIAPI criSjMem_GetRequiredMemorySizeWithConfig(CriUint32 align, const CriSjConfig *config); + +CriSj CRIAPI criSj_CreateUniversal(CriHeap heap, CriSjUniversalMode mode, CriUint32 nchunk); +CriSj CRIAPI criSj_CreateUniversalWithConfig(CriHeap heap, CriSjUniversalMode mode, CriUint32 nchunk, const CriSjConfig *config); +CriSint32 CRIAPI criSjUni_GetRequiredMemorySizeWithConfig(CriSjUniversalMode mode, CriUint32 nchunk, const CriSjConfig *config); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif + +/* end of file */ diff --git a/3rdParty/cri/XboxOne/include/cri_xpt.h b/3rdParty/cri/XboxOne/include/cri_xpt.h new file mode 100644 index 00000000..5dbf4f36 --- /dev/null +++ b/3rdParty/cri/XboxOne/include/cri_xpt.h @@ -0,0 +1,26 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2004-2009 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header for XboxOne + * File : cri_xpt.h + * Date : 2013-03-04 + * Version : 1.16 + * + ****************************************************************************/ +#ifndef CRI_INCL_CRI_XPT_H +#define CRI_INCL_CRI_XPT_H + +#define XPT_TGT_XBOXONE +#define XPT_CCS_LEND +#define XPT_SUPPORT_MULTICHANNEL +#define CRI_TARGET_STR "XboxOne" + +#include "cri_xpts_xboxone.h" +#include "cri_xpt_post.h" + +#endif /* CRI_INCL_CRI_XPT_H */ +/* End Of File */ diff --git a/3rdParty/cri/XboxOne/include/cri_xpt_post.h b/3rdParty/cri/XboxOne/include/cri_xpt_post.h new file mode 100644 index 00000000..de333b7b --- /dev/null +++ b/3rdParty/cri/XboxOne/include/cri_xpt_post.h @@ -0,0 +1,256 @@ +/***************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 1998-2012 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header / Post-Process + * File : cri_xpt_post.h + * Date : 2012-05-15 + * Version : 2.07 + * + *****************************************************************************/ +#ifndef CRI_INCL_CRI_XPT_POST_H +#define CRI_INCL_CRI_XPT_POST_H + + +/***************************************************************************** + * }N` + * Macro definition + *****************************************************************************/ + +/* RpC̐ÓIAT[g + * C++ BoostSTATIC_ASSERTƓ̋@\CŎB + * ^ł邱Ƃ؂BȔꍇ̓RpCG[NāAR + * pC~B + * Static Asart when compiling + * This function is equal to STATIC_ASSERT of C++ Boost, and is imprementated + * by C language. If the condition is false, a compiler error is caused and + * it stop compiling. + */ +#define XPT_STATIC_ASSERT(cond) extern int xpt_static_assert_array[(cond)?1:-1] + + +/***************************************************************************** + * RpCIvV̌ + * Compiler option test + *****************************************************************************/ + +/* enum^̌ + * @enum^int^ɐ邱Ƃ؂B + * @K؂ȃG[bZ[W\̂ŁA”\ȂRpCIvVɂ + * @`FbNsBs”\ȏꍇAėpIȐÓIAT[gɂ`FbNB + * Enum type test + * It is verified that the enum type adjusts to the int type. + * To display an appropriate error message, it checks the compiler option + * if possible. General static asart test works if it is impossible. + */ +#if defined(__MWERKS__) /* CodeWarrior */ + //#if !__option(enumsalwaysint) + // #error ERROR cri_xpt_post.h : Compiler option 'Enums Always Int' should be ON. + //#endif +#elif defined(__GNUC__) + //#if Compiler option -fshort-enums is used + // #error ERROR cri_xpt_post.h : Compiler option '-fshort-enums' should not be used. + //#endif +#endif +//typedef enum {XPT_TEST_ENUM_0, XPT_TEST_ENUM_1, XPT_TEST_ENUM_2} XptTestEnum; +//XPT_STATIC_ASSERT(sizeof(XptTestEnum) == sizeof(Uint32)); /* enum should be 4byte. */ + +/***************************************************************************** + * 萔}N + * Macros of constant value + *****************************************************************************/ + +/* NULL |C^^ */ +#if !defined(CRI_NULL) +#ifdef __cplusplus +#define CRI_NULL (0) +#else +#define CRI_NULL ((void *)0) +#endif +#endif + +/* _萔PiUA^j */ +#if !defined(CRI_FALSE) +#define CRI_FALSE (0) +#endif +#if !defined(CRI_TRUE) +#define CRI_TRUE (1) +#endif + +/* _萔QiXCb`j */ +#if !defined(CRI_OFF) +#define CRI_OFF (0) +#endif +#if !defined(CRI_ON) +#define CRI_ON (1) +#endif + +/* ʔ̒萔iAsj */ +#if !defined(CRI_OK) +#define CRI_OK (0) /* */ +#endif +#if !defined(CRI_NG) +#define CRI_NG (-1) /* s */ +#endif + +/***************************************************************************** + * |C^܂64rbgAhXi[ł鐮^ + * l: |C^32bitROMAhX64bit̊‹ŁA҂𓧉ߓIɈB + * The integer type which can hold an pointer or an address up to 64 bits. + * NOTE: In the environment of pointer 32bit and ROM address space 64bit, + * this type can treat both transparently. + *****************************************************************************/ + +#if !defined(_TYPEDEF_CriUint64Adr) +#define _TYPEDEF_CriUint64Adr +typedef CriUint64 CriUint64Adr; /* |C^܂64rbgAhXi[ł鐮^ */ +#endif + +#if !defined(CRI_PTR_TO_UINT64ADR) +#define CRI_PTR_TO_UINT64ADR(ptr) ((CriUint64Adr)(ptr)) /* Convert pointer to CriUint64Adr */ +#endif + +#if !defined(CRI_UINT64ADR_TO_PTR) +#define CRI_UINT64ADR_TO_PTR(uint64adr) ((void *)(CriUintPtr)(uint64adr)) /* Convert CriUint64Adr to pointer */ +#endif + +#if !defined(CRI_XPT_DISABLE_UNPREFIXED_TYPE) + +/***************************************************************************** + * ݊ێ̂߂̒萔}N + * Macros for compatibility with old version + *****************************************************************************/ + +/* NULL |C^^ */ +#if !defined(NULL) +#define NULL (CRI_NULL) +#endif + +/* _萔PiUA^j */ +#if !defined(FALSE) +#define FALSE (CRI_FALSE) +#endif +#if !defined(TRUE) +#define TRUE (CRI_TRUE) +#endif + +/* _萔QiXCb`j */ +#if !defined(OFF) +#define OFF (CRI_OFF) +#endif +#if !defined(ON) +#define ON (CRI_ON) +#endif + +/* ʔ̒萔iAsj */ +#if !defined(OK) +#define OK (CRI_OK) +#endif +#if !defined(NG) +#define NG (CRI_NG) +#endif + +/***************************************************************************** + * ݊ێ̂߂̃f[^^錾 + * Types for compatibility with old version + *****************************************************************************/ + +#if !defined(_TYPEDEF_Uint8) +#define _TYPEDEF_Uint8 +typedef CriUint8 Uint8; /* ȂPoCg */ +#endif + +#if !defined(_TYPEDEF_Sint8) +#define _TYPEDEF_Sint8 +typedef CriSint8 Sint8; /* ‚PoCg */ +#endif + +#if !defined(_TYPEDEF_Uint16) +#define _TYPEDEF_Uint16 +typedef CriUint16 Uint16; /* ȂQoCg */ +#endif + +#if !defined(_TYPEDEF_Sint16) +#define _TYPEDEF_Sint16 +typedef CriSint16 Sint16; /* ‚QoCg */ +#endif + +#if !defined(_TYPEDEF_Uint32) +#define _TYPEDEF_Uint32 +typedef CriUint32 Uint32; /* ȂSoCg */ +#endif + +#if !defined(_TYPEDEF_Sint32) +#define _TYPEDEF_Sint32 +typedef CriSint32 Sint32; /* ‚SoCg */ +#endif + +#if !defined(_TYPEDEF_Uint64) +#define _TYPEDEF_Uint64 +typedef CriUint64 Uint64; /* ȂWoCg */ +#endif + +#if !defined(_TYPEDEF_Sint64) +#define _TYPEDEF_Sint64 +typedef CriSint64 Sint64; /* ‚WoCg */ +#endif + +#if !defined(_TYPEDEF_Uint128) +#define _TYPEDEF_Uint128 +typedef CriUint128 Uint128; /* Ȃ16oCg */ +#endif + +#if !defined(_TYPEDEF_Sint128) +#define _TYPEDEF_Sint128 +typedef CriSint128 Sint128; /* ‚16oCg */ +#endif + +#if !defined(_TYPEDEF_Float16) +#define _TYPEDEF_Float16 +typedef CriFloat16 Float16; /* QoCg */ +#endif + +#if !defined(_TYPEDEF_Float32) +#define _TYPEDEF_Float32 +typedef CriFloat32 Float32; /* SoCg */ +#endif + +#if !defined(_TYPEDEF_Float64) +#define _TYPEDEF_Float64 +typedef CriFloat64 Float64; /* WoCg */ +#endif + +#if !defined(_TYPEDEF_Fixed32) +#define _TYPEDEF_Fixed32 +typedef CriFixed32 Fixed32; /* Œ菬_32rbg */ +#endif + +/* X11 APIixtrapproto.hjƂ̋p */ +#if !defined(_TYPEDEF_Bool) && !defined(Bool) +#define _TYPEDEF_Bool +typedef CriBool Bool; /* _^i_萔lɂƂj */ +#endif + +#if !defined(_TYPEDEF_Char8) +#define _TYPEDEF_Char8 +typedef CriChar8 Char8; /* ^ */ +#endif + +#if !defined(_TYPEDEF_SintPtr) +#define _TYPEDEF_SintPtr +typedef CriSintPtr SintPtr; +#endif + +#if !defined(_TYPEDEF_UintPtr) +#define _TYPEDEF_UintPtr +typedef CriUintPtr UintPtr; +#endif + +#endif /* CRI_XPT_DISABLE_UNPREFIXED_TYPE */ + +#endif /* CRI_INCL_CRI_XPT_POST_H */ + +/* end of file */ diff --git a/3rdParty/cri/XboxOne/include/cri_xpts_xboxone.h b/3rdParty/cri/XboxOne/include/cri_xpts_xboxone.h new file mode 100644 index 00000000..589cc56c --- /dev/null +++ b/3rdParty/cri/XboxOne/include/cri_xpts_xboxone.h @@ -0,0 +1,132 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 1998-2011 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header for XboxOne + * File : cri_xpts_xboxone.h + * Date : 2013-03-04 + * Version : 2.05 + * + ****************************************************************************/ + +#ifndef CRI_INCL_CRI_XPTS_H +#define CRI_INCL_CRI_XPTS_H + +/***************************************************************************** + * {f[^^錾 + *****************************************************************************/ + +#if !defined(_TYPEDEF_CriUint8) +#define _TYPEDEF_CriUint8 +typedef unsigned __int8 CriUint8; /* ȂPoCg */ +#endif + +#if !defined(_TYPEDEF_CriSint8) +#define _TYPEDEF_CriSint8 +typedef signed __int8 CriSint8; /* ‚PoCg */ +#endif + +#if !defined(_TYPEDEF_CriUint16) +#define _TYPEDEF_CriUint16 +typedef unsigned __int16 CriUint16; /* ȂQoCg */ +#endif + +#if !defined(_TYPEDEF_CriSint16) +#define _TYPEDEF_CriSint16 +typedef signed __int16 CriSint16; /* ‚QoCg */ +#endif + +#if !defined(_TYPEDEF_CriUint32) +#define _TYPEDEF_CriUint32 +typedef unsigned __int32 CriUint32; /* ȂSoCg */ +#endif + +#if !defined(_TYPEDEF_CriSint32) +#define _TYPEDEF_CriSint32 +typedef signed __int32 CriSint32; /* ‚SoCg */ +#endif + +#if !defined(_TYPEDEF_CriUint64) +#define _TYPEDEF_CriUint64 +typedef unsigned __int64 CriUint64; /* ȂWoCg */ +#endif + +#if !defined(_TYPEDEF_CriSint64) +#define _TYPEDEF_CriSint64 +typedef signed __int64 CriSint64; /* ‚WoCg */ +#endif + +#if !defined(_TYPEDEF_CriUint128) +#define _TYPEDEF_CriUint128 +typedef struct { /* Ȃ16oCg */ + CriUint64 h; /* 64rbg */ + CriUint64 l; /* 64rbg */ +} CriUint128; +#endif + +#if !defined(_TYPEDEF_CriSint128) +#define _TYPEDEF_CriSint128 +typedef struct { /* ‚16oCg */ + CriSint64 h; /* 64rbg */ + CriUint64 l; /* 64rbg */ +} CriSint128; +#endif + +#if !defined(_TYPEDEF_CriFloat16) +#define _TYPEDEF_CriFloat16 +typedef signed __int16 CriFloat16; /* QoCg */ +#endif + +#if !defined(_TYPEDEF_CriFloat32) +#define _TYPEDEF_CriFloat32 +typedef float CriFloat32; /* SoCg */ +#endif + +#if !defined(_TYPEDEF_CriFloat64) +#define _TYPEDEF_CriFloat64 +typedef double CriFloat64; /* WoCg */ +#endif + +#if !defined(_TYPEDEF_CriFixed32) +#define _TYPEDEF_CriFixed32 +typedef signed __int32 CriFixed32; /* Œ菬_32rbg */ +#endif + +#if !defined(_TYPEDEF_CriBool) +#define _TYPEDEF_CriBool +typedef CriSint32 CriBool; /* _^i_萔lɂƂj */ +#endif + +#if !defined(_TYPEDEF_CriChar8) +#define _TYPEDEF_CriChar8 +typedef char CriChar8; /* ^ */ +#endif + +/***************************************************************************** + * |C^i[”\Ȑ^ + *****************************************************************************/ + +#if !defined(_TYPEDEF_CriSintPtr) +#define _TYPEDEF_CriSintPtr +typedef signed __int64 CriSintPtr; +#endif + +#if !defined(_TYPEDEF_CriUintPtr) +#define _TYPEDEF_CriUintPtr +typedef unsigned __int64 CriUintPtr; +#endif + +/***************************************************************************** + * ĂяoK + *****************************************************************************/ + +#if !defined(CRIAPI) +#define CRIAPI __cdecl +#endif + +#endif /* CRI_INCL_CRI_XPTS_H */ + +/* end of file */ diff --git a/3rdParty/cri/XboxOne/libs/cri_base_xboxone.lib b/3rdParty/cri/XboxOne/libs/cri_base_xboxone.lib new file mode 100644 index 0000000000000000000000000000000000000000..9b35306e4152d535e215b77dfa5f80f36a647f8b GIT binary patch literal 595226 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 z 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

+HEa&q6(ci9emtQxo;NRxBa#ZPYQXCpPN7i8|mq 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 Y#4#u-w95;lrDskPixEgmw;B8Y0uyTV8vp +#include "cri_xpt.h" +#include "cri_heap.h" + +/**************************************************************************** + * Macro Constants + ****************************************************************************/ +#if defined(XPT_UNSUPPORT_CPLUSPLUS_THROW) +#define CRI_ALLOCATOR_CPLUSPLUS_THROW +#else +#define CRI_ALLOCATOR_CPLUSPLUS_THROW throw() +#endif + +/**************************************************************************** + * Class Declaration + ****************************************************************************/ +#ifdef __cplusplus + +class CriAllocator +{ +public: + static const CriSint32 DEFAULT_ALIGNMENT = CRIHEAP_DEFAULT_MEM_ALIGN; + + + static void* CRIAPI operator new(size_t size, CriHeap heap) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, CriHeapType heap_type) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, const CriChar8 *name, CriUint32 align=DEFAULT_ALIGNMENT) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, CriHeapType heap_type, const CriChar8 *name, CriUint32 align=DEFAULT_ALIGNMENT) CRI_ALLOCATOR_CPLUSPLUS_THROW; + + static void CRIAPI operator delete(void *p, size_t size); + + static void* CRIAPI operator new(size_t size, void *work, CriSint32 wksize) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, void *work, CriSint32 wksize) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, void *work, CriSint32 wksize, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, void *work, CriSint32 wksize, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + +#if !defined(XPT_TGT_BCB) + static void CRIAPI operator delete(void *p, CriHeap heap) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, CriHeapType heap_type) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, const CriChar8 *name, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, CriHeapType heap_type, const CriChar8 *name, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; +#endif + + static CriSint32 GetWorstExtraSize(CriUint32 align); +}; +#endif // _CRI_ALLOCATOR_H_INCLUDED + +#endif /* end of __cplusplus */ + +/* --- end of file --- */ diff --git a/3rdParty/cri/orbis/include/cri_error.h b/3rdParty/cri/orbis/include/cri_error.h new file mode 100644 index 00000000..6152a7b5 --- /dev/null +++ b/3rdParty/cri/orbis/include/cri_error.h @@ -0,0 +1,368 @@ +#ifndef _CRI_ERROR_H_INCLUDED +#define _CRI_ERROR_H_INCLUDED +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2006-2009 CRI Middleware Co., Ltd. + * + * Library : CRI Error + * Module : + * File : cri_error.h + * + ****************************************************************************/ +/*! + * \file cri_error.h + */ +/*JP + * \addtogroup CRI_ERROR G[nhOp֐Q + * @{ + */ +/*EN + * \addtogroup CRI_ERROR Functions for error handling + * @{ + */ + +/**************************************************************************** + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" + +/**************************************************************************** + * MACRO CONSTANT * + ****************************************************************************/ + +/* o[Wԍ */ +/* Version number */ +#define CRIERROR_VER_NAME "CRI Error" +#define CRIERROR_VER_NUM "1.04.00" +#define CRIERROR_VER_OPTION + +/*JP + * \brief G[R[h + */ +/*EN + * \brief Error codes + */ +typedef enum { + CRIERR_OK = 0, /*JP< I */ + /*EN< Succeeded */ + CRIERR_NG = -1, /*JP< G[ */ + /*EN< Error occurred */ + CRIERR_INVALID_PARAMETER = -2, /*JP< s */ + /*EN< Invalid argument */ + CRIERR_FAILED_TO_ALLOCATE_MEMORY = -3, /*JP< ̊mۂɎs */ + /*EN< Failed to allocate memory */ + CRIERR_UNSAFE_FUNCTION_CALL = -4, /*JP< XbhZ[t֐̕s */ + /*EN< Parallel execution of thread-unsafe function */ + CRIERR_FUNCTION_NOT_IMPLEMENTED = -5, /*JP< ֐̎s */ + /*EN< Function not implemented */ + CRIERR_LIBRARY_NOT_INITIALIZED = -6, /*JP< Cu */ + /*EN< Library not initialized */ + /* enum be 4bytes */ + CRIERR_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriError; + +/*JP + * \brief G[ʒmx + */ +/*EN + * \brief Error notification level + */ +typedef enum { + CRIERR_NOTIFY_ALL = 0, /*JP< SẴG[ʒm */ + /*EN< Notify all errors */ + CRIERR_NOTIFY_FATAL = 1, /*JP< G[̂ݒʒmix͖j */ + /*EN< Notify error (Disregards warning) */ + /* enum be 4bytes */ + CRIERR_NOTIFY_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriErrorNotificationLevel; + +/* G[x */ +/* Error level */ +typedef enum { + CRIERR_LEVEL_ERROR = 0, + CRIERR_LEVEL_WARNING = 1, + /* enum be 4bytes */ + CRIERR_LEVEL_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriErrorLevel; + +/**************************************************************************** + * PROCESS MACRO * + ****************************************************************************/ + +#if defined(CRIERROR_SIMPLIFY) + /* G[̒ʒm */ + /* Notification of Error */ + #define criErr_NotifyError(id, msg) criErr_NotifyErrorSimple() + #define criErr_NotifyError1(id, msg, p1) criErr_NotifyErrorSimple() + #define criErr_NotifyError2(id, msg, p1, p2) criErr_NotifyErrorSimple() + #define criErr_NotifyErrorPrmArray(id, msg, p1, p2, pa) criErr_NotifyErrorSimple() + #define criErr_NotifyErrorGeneric(_error_id, _error_no) criErr_NotifyErrorSimple() + /* x̒ʒm */ + /* Notification of Warning */ + #define criErr_NotifyWarning(id, msg) criErr_NotifyWarningSimple() + #define criErr_NotifyWarning1(id, msg, p1) criErr_NotifyWarningSimple() + #define criErr_NotifyWarning2(id, msg, p1, p2) criErr_NotifyWarningSimple() + #define criErr_NotifyWarningPrmArray(id, msg, p1, p2, pa) criErr_NotifyWarningSimple() + #define criErr_NotifyWarningGeneric(_error_id, _error_no) criErr_NotifyWarningSimple() +#else + /* G[̒ʒm */ + /* Notification of Error */ + #define criErr_NotifyError(id, msg) criErr_Notify(CRIERR_LEVEL_ERROR, id ":" msg) + #define criErr_NotifyError1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1)) + #define criErr_NotifyError2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) + #define criErr_NotifyErrorPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr *)(pa)) + #define criErr_NotifyErrorGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, _error_id, _error_no) + /* x̒ʒm */ + /* Notification of Warning */ + #define criErr_NotifyWarning(id, msg) criErr_Notify(CRIERR_LEVEL_WARNING, id ":" msg) + #define criErr_NotifyWarning1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1)) + #define criErr_NotifyWarning2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) + #define criErr_NotifyWarningPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr *)(pa)) + #define criErr_NotifyWarningGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_WARNING, _error_id, _error_no) +#endif + +/**************************************************************************** + * Data type declaration * + ****************************************************************************/ + +/* Error Callback Function type */ +typedef void (CRIAPI *CriErrCbFunc)(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + +/**************************************************************************** + * ϐ̐錾 * + * Variable Declaration * + ****************************************************************************/ +/* G[o͏ȗpϐ */ +/* default argument of CriError */ +#ifdef __cplusplus +namespace criErr { + extern CriError ErrorContainer; +} +#endif /* __cplusplus */ + +/**************************************************************************** + * ֐̐錾 * + * Function Declaration * + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*JP + * \brief G[ID񂩂G[bZ[W֕ϊ + * \ingroup CRI_ERROR + * \param[in] errid G[ID + * \return G[bZ[W + * \par : + * G[ID񂩂ڍׂȃG[bZ[W֕ϊ܂B
+ * \attention + * ̊֐͋dl̊֐łB
+ * ::criErr_ConvertIdToMessage ֐gpĂB + * \sa criErr_ConvertIdToMessage + */ +/*EN + * \brief Convert error ID to error message + * \ingroup CRI_ERROR + * \param[in] errid error ID + * \return error message + * \par Explanation: + * This function converts error ID to detailed error message.
+ * \attention + * This function is an obsolete one.
+ * Please use the ::criErr_ConvertIdToMessage function instead. + * \sa criErr_ConvertIdToMessage + */ +const CriChar8* CRIAPI criErr_ConvertIdToMsg(const CriChar8 *errid); + +/*JP + * \brief G[ID񂩂G[bZ[W֕ϊ + * \ingroup CRI_ERROR + * \param[in] errid G[ID + * \param[in] p1 ⑫1 + * \param[in] p2 ⑫2 + * \return G[bZ[W + * \par : + * G[ID񂩂ڍׂȃG[bZ[W֕ϊ܂B
+ * \par p: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * \endcode + */ +/*EN + * \brief Convert error ID to error message + * \ingroup CRI_ERROR + * \param[in] errid error ID + * \param[in] p1 supplementary information 1 + * \param[in] p2 supplementary information 2 + * \return error message + * \par Explanation: + * This function converts error ID to detailed error message.
+ * \par Example: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * \endcode + */ +const CriChar8* CRIAPI criErr_ConvertIdToMessage(const CriChar8 *errid, CriUint32 p1, CriUint32 p2); + +/*JP + * \brief G[R[obN֐̓o^ + * \ingroup CRI_ERROR + * \param[in] cbf G[R[obN֐ + * \return Ȃ + * \par : + * G[R[obN֐o^܂B
+ * o^ꂽ֐́ACRI~hEGACuŃG[ƂɌĂяo܂B
+ * ɓo^łG[R[obN֐͂P‚łB
+ * o^ɍēx{֐Ăяoꍇ݂͌̓o^㏑܂B + * \par p: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * + * void main(int ac, char *av[]) + * { + * F + * // G[R[obN̓o^ + * criErr_SetCallback(user_error_callback_func); + * F + * } + * \endcode + */ +/*EN + * \brief Register error callback function + * \ingroup CRI_ERROR + * \param[in] cbf error callback function + * \return NONE + * \par Explanation: + * This function registers an error callback function.
+ * The registered function is called if an error occurs within the CRI middleware library. + * \par Example: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * + * void main(int ac, char *av[]) + * { + * : + * // Registers the error callback function + * criErr_SetCallback(user_error_callback_func); + * : + * } + * \endcode + */ +void CRIAPI criErr_SetCallback(CriErrCbFunc cbf); + +/*JP + * \brief G[ʒmx̕ύX + * \ingroup CRI_ERROR + * \param[in] level G[ʒmx + * \return Ȃ + * \par : + * G[R[obNɒʒmG[̃xύX܂B + */ +/*EN + * \brief Change error notification level + * \ingroup CRI_ERROR + * \param[in] level error notification level + * \return NONE + * \par Explanation: + * This function changes the level of error information that is notified to the error callback. + */ +void CRIAPI criErr_SetErrorNotificationLevel(CriErrorNotificationLevel level); + +/*JP + * \brief G[񐔂̎擾 + * \ingroup CRI_ERROR + * \param[in] level G[x + * \return G[ + * \par : + * G[񐔂擾܂B + */ +/*EN + * \brief Retrieve error count + * \ingroup CRI_ERROR + * \param[in] level error level + * \return number of errors occured + * \par Explanation: + * This function retrieves the number of errors occured. + */ +CriUint32 CRIAPI criErr_GetErrorCount(CriErrorLevel level); + +/*JP + * \brief G[񐔂̃Zbg + * \ingroup CRI_ERROR + * \param[in] level G[x + * \return Ȃ + * \par : + * G[񐔂̃JE^0ɖ߂܂B + */ +/*EN + * \brief Resets error count + * \ingroup CRI_ERROR + * \param[in] level error level + * \return NONE + * \par Explanation: + * This function resets the counter for number of errors occured. + */ +void CRIAPI criErr_ResetErrorCount(CriErrorLevel level); + +/* G[R[obN𔭐 (֐) */ +/* Error notification (Internal functions) */ +void CRIAPI criErr_Notify(CriErrorLevel level, const CriChar8 *errid); +void CRIAPI criErr_Notify1(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1); +void CRIAPI criErr_Notify2(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1, CriUintPtr p2); +void CRIAPI criErr_NotifyPrmArray(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1, CriUintPtr p2, CriUintPtr *pa); +void CRIAPI criErr_NotifyGeneric(CriErrorLevel level, const CriChar8 *error_id, CriError error_no); +void CRIAPI criErr_NotifyErrorSimple(void); +void CRIAPI criErr_NotifyWarningSimple(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/*************************************************************************** + * o[WƂ̌݊p + * For compatibility with old versions + ***************************************************************************/ +#define criErr_Invoke(errid) criErr_Notify(CRIERR_LEVEL_ERROR, errid) +#define criErr_Invoke1(errid, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, errid, p1) +#define criErr_Invoke2(errid, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, errid, p1, p2) +#define criErr_InvokePrmArray(errid, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, errid, p1, p2, pa) +#define criErr_InvokeGeneric(error_id, error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, error_id, error_no) +#define criErr_Occur(id, msg) criErr_Notify(CRIERR_LEVEL_ERROR, id ":" msg) +#define criErr_Occur1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1)) +#define criErr_Occur2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) +#define criErr_OccurPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr*)(pa)) +#define criErr_OccurGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, _error_id, _error_no) + +/*EN + * @} + */ +/*JP + * @} + */ + +#endif // _CRI_ERROR_H_INCLUDED + +/* --- end of file --- */ diff --git a/3rdParty/cri/orbis/include/cri_sj.h b/3rdParty/cri/orbis/include/cri_sj.h new file mode 100644 index 00000000..9b7047b4 --- /dev/null +++ b/3rdParty/cri/orbis/include/cri_sj.h @@ -0,0 +1,189 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2006-2010 CRI Middleware Co., Ltd. + * + ****************************************************************************/ + +#ifndef _CRI_SJ_H_INCLUDED +#define _CRI_SJ_H_INCLUDED +/**************************************************************************** + * * + * CRI Stream Joint "CriSj" Library * + * * + * 2005-06-21 written by M.Oshimi * + * * + ****************************************************************************/ + +/**************************************************************************** + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" +#include "cri_heap.h" + +/**************************************************************************** + * MACRO CONSTANT * + ****************************************************************************/ + +/* Version number of CriSj */ +#define CRISJ_NAME_STRINGS "CRI Stream Joint" +#define CRISJ_VERSION_STRINGS "1.01.00" + +#define CRISJUNI_MAX_LINE (4) +#define CRICHUNK_MAX_SIZE (0xffffffff) + +/*********************************************************************** + * Process MACRO + ***********************************************************************/ + +/**************************************************************************** + * Data type declaration * + ****************************************************************************/ + +/* Xg[C */ +typedef enum { + CRISJ_LINE_FREE = (0), + CRISJ_LINE_DATA = (1), + CRISJ_LINE_HOLD = (2), + CRISJ_LINE_EXTRA = (3), + /* enum be 4bytes */ + CRISJ_LINE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriSjLine; + +/* `N */ +#ifndef TYPEDEF_CRICHUNK +#define TYPEDEF_CRICHUNK +typedef struct { + CriUint8 *data; /* f[^ */ + CriUint32 size; /* oCg */ +} CriChunk; +#endif + +/* CriSjnh */ +/* CriSj handle */ +typedef struct { + struct _crisj_function_table *vtbl; + const CriChar8 *name; +} CriSjObj, *CriSj; + +typedef struct _crisj_function_table { + /* nh̏ */ + void (*Destroy)(CriSj sj); + /* Zbg */ + void (*Reset)(CriSj sj); + /* `N̎擾 (FIFO̐擪擾) */ + void (*GetChunk)(CriSj sj, CriSjLine id, CriUint32 nbyte, CriChunk *ck); + /* `N߂@(FIFO̐擪ɑ}) */ + void (*UngetChunk)(CriSj sj, CriSjLine id, CriChunk *ck); + /* `N} (FIFO̍Ōɑ}) */ + void (*PutChunk)(CriSj sj, CriSjLine id, CriChunk *ck); + /* C擾ł鑍oCg̎擾 */ + CriUint32 (*GetTotalSize)(CriSj sj, CriSjLine id); +} CriSjVirtualFunctionTable; + +typedef enum { + CRISJ_UNIMODE_SEPARATE = (0), + CRISJ_UNIMODE_JOIN = (1), + /* enum be 4bytes */ + CRISJ_UNIMODE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriSjUniversalMode; + + +typedef struct CriSjRbfConfig { + CriBool use_cs; + CriUint32 buffer_size; + CriUint32 extra_size; + CriUint32 alignment; + const CriChar8 *buffer_name; +} CriSjRbfConfig; + +typedef struct CriSjMemConfig { + CriBool use_cs; + CriUint8 *data; + CriUint32 data_size; +} CriSjMemConfig; + +typedef struct CriSjUniConfig { + CriBool use_cs; + CriSjUniversalMode mode; + CriUint32 num_chunks; +} CriSjUniConfig; + +/**************************************************************************** + * Function Declaration * + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Oobt@^SJ̍쐬 */ +CriSint32 CRIAPI criSjRbf_CalculateWorkSize(const CriSjRbfConfig* config); +CriSj CRIAPI criSjRbf_Create(const CriSjRbfConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjRbf_CreateByHeap(const CriSjRbfConfig *config, CriHeap heap, CriHeapType heap_type); + +/* 풓^SJ̍쐬 */ +CriSint32 CRIAPI criSjMem_CalculateWorkSize(const CriSjMemConfig* config); +CriSj CRIAPI criSjMem_Create(const CriSjMemConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjMem_CreateByHeap(const CriSjMemConfig *config, CriHeap heap, CriHeapType heap_type); + +/* jo[TSJ̍쐬 */ +CriSint32 CRIAPI criSjUni_CalculateWorkSize(const CriSjUniConfig* config); +CriSj CRIAPI criSjUni_Create(const CriSjUniConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjUni_CreateByHeap(const CriSjUniConfig *config, CriHeap heap, CriHeapType heap_type); +/* `FCv[̎擾 */ +CriSint32 CRIAPI criSjUni_GetNumChainPool(CriSj sj); + +void CRIAPI criSj_Destroy(CriSj sj); +void CRIAPI criSj_Reset(CriSj sj); +void CRIAPI criSj_GetChunk(CriSj sj, CriSjLine line, CriUint32 nbyte, CriChunk *ck); +void CRIAPI criSj_UngetChunk(CriSj sj, CriSjLine line, CriChunk *ck); +void CRIAPI criSj_PutChunk(CriSj sj, CriSjLine line, CriChunk *ck); +CriUint32 CRIAPI criSj_GetTotalSize(CriSj sj, CriSjLine line); +void CRIAPI criSj_SplitChunk(CriChunk *ck, CriUint32 nbyte, CriChunk *ck1, CriChunk *ck2); + +/*** +* New APIs +***/ + +CriUint32 CRIAPI criSj_GetInputFreeSize(CriSj sj); +void CRIAPI criSj_GetInputChunk(CriSj sj, CriChunk *ck); +void CRIAPI criSj_PutInputChunk(CriSj sj, CriChunk *ck, CriUint32 input_size); +CriUint32 CRIAPI criSj_GetOutputDataSize(CriSj sj); +void CRIAPI criSj_GetOutputChunk(CriSj sj, CriChunk *ck); +void CRIAPI criSj_PutOutputChunk(CriSj sj, CriChunk *ck, CriUint32 output_size); + +CriUint32 CRIAPI criSj_PutOutputChunk2(CriSj sj, CriChunk *ck1, CriChunk *ck2, CriUint32 output_size); + + +/*** +* Old Interface (for compatibility) +***/ +typedef struct _CriSjConfig { + CriBool use_cs; + CriHeapType heap_type; +} CriSjConfig; + +CriSj CRIAPI criSj_CreateRingBuffer(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align); +CriSj CRIAPI criSj_CreateNamedRingBuffer(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriChar8 *bname); +CriSj CRIAPI criSj_CreateRingBufferWithConfig(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriSjConfig *config); +CriSj CRIAPI criSj_CreateNamedRingBufferWithConfig(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriChar8 *bname, const CriSjConfig *config); +CriSint32 CRIAPI criSjRbf_GetRequiredMemorySizeWithConfig(CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriSjConfig *config); + +CriSj CRIAPI criSj_CreateMemory(CriHeap heap, CriUint8 *data, CriUint32 dtsize, CriUint32 align); +CriSj CRIAPI criSj_CreateMemoryWithConfig(CriHeap heap, CriUint8 *data, CriUint32 dtsize, CriUint32 align, const CriSjConfig *config); +CriSint32 CRIAPI criSjMem_GetRequiredMemorySizeWithConfig(CriUint32 align, const CriSjConfig *config); + +CriSj CRIAPI criSj_CreateUniversal(CriHeap heap, CriSjUniversalMode mode, CriUint32 nchunk); +CriSj CRIAPI criSj_CreateUniversalWithConfig(CriHeap heap, CriSjUniversalMode mode, CriUint32 nchunk, const CriSjConfig *config); +CriSint32 CRIAPI criSjUni_GetRequiredMemorySizeWithConfig(CriSjUniversalMode mode, CriUint32 nchunk, const CriSjConfig *config); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif + +/* end of file */ diff --git a/3rdParty/cri/orbis/include/cri_xpt.h b/3rdParty/cri/orbis/include/cri_xpt.h new file mode 100644 index 00000000..8f3d09a0 --- /dev/null +++ b/3rdParty/cri/orbis/include/cri_xpt.h @@ -0,0 +1,27 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2012 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header for PS4 + * File : cri_xpt.h + * Date : 2012-10-04 + * Version : 1.00 + * + ****************************************************************************/ +#ifndef CRI_INCL_CRI_XPT_H +#define CRI_INCL_CRI_XPT_H + +#define XPT_TGT_PS4 +#define XPT_CCS_LEND +#define XPT_DISABLE_FSV1API +#define CRI_TARGET_STR "PS4" + + +#include "cri_xpts_orbis.h" +#include "cri_xpt_post.h" + +#endif /* CRI_INCL_CRI_XPT_H */ +/* End Of File */ diff --git a/3rdParty/cri/orbis/include/cri_xpt_post.h b/3rdParty/cri/orbis/include/cri_xpt_post.h new file mode 100644 index 00000000..de333b7b --- /dev/null +++ b/3rdParty/cri/orbis/include/cri_xpt_post.h @@ -0,0 +1,256 @@ +/***************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 1998-2012 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header / Post-Process + * File : cri_xpt_post.h + * Date : 2012-05-15 + * Version : 2.07 + * + *****************************************************************************/ +#ifndef CRI_INCL_CRI_XPT_POST_H +#define CRI_INCL_CRI_XPT_POST_H + + +/***************************************************************************** + * }N` + * Macro definition + *****************************************************************************/ + +/* RpC̐ÓIAT[g + * C++ BoostSTATIC_ASSERTƓ̋@\CŎB + * ^ł邱Ƃ؂BȔꍇ̓RpCG[NāAR + * pC~B + * Static Asart when compiling + * This function is equal to STATIC_ASSERT of C++ Boost, and is imprementated + * by C language. If the condition is false, a compiler error is caused and + * it stop compiling. + */ +#define XPT_STATIC_ASSERT(cond) extern int xpt_static_assert_array[(cond)?1:-1] + + +/***************************************************************************** + * RpCIvV̌ + * Compiler option test + *****************************************************************************/ + +/* enum^̌ + * @enum^int^ɐ邱Ƃ؂B + * @K؂ȃG[bZ[W\̂ŁA”\ȂRpCIvVɂ + * @`FbNsBs”\ȏꍇAėpIȐÓIAT[gɂ`FbNB + * Enum type test + * It is verified that the enum type adjusts to the int type. + * To display an appropriate error message, it checks the compiler option + * if possible. General static asart test works if it is impossible. + */ +#if defined(__MWERKS__) /* CodeWarrior */ + //#if !__option(enumsalwaysint) + // #error ERROR cri_xpt_post.h : Compiler option 'Enums Always Int' should be ON. + //#endif +#elif defined(__GNUC__) + //#if Compiler option -fshort-enums is used + // #error ERROR cri_xpt_post.h : Compiler option '-fshort-enums' should not be used. + //#endif +#endif +//typedef enum {XPT_TEST_ENUM_0, XPT_TEST_ENUM_1, XPT_TEST_ENUM_2} XptTestEnum; +//XPT_STATIC_ASSERT(sizeof(XptTestEnum) == sizeof(Uint32)); /* enum should be 4byte. */ + +/***************************************************************************** + * 萔}N + * Macros of constant value + *****************************************************************************/ + +/* NULL |C^^ */ +#if !defined(CRI_NULL) +#ifdef __cplusplus +#define CRI_NULL (0) +#else +#define CRI_NULL ((void *)0) +#endif +#endif + +/* _萔PiUA^j */ +#if !defined(CRI_FALSE) +#define CRI_FALSE (0) +#endif +#if !defined(CRI_TRUE) +#define CRI_TRUE (1) +#endif + +/* _萔QiXCb`j */ +#if !defined(CRI_OFF) +#define CRI_OFF (0) +#endif +#if !defined(CRI_ON) +#define CRI_ON (1) +#endif + +/* ʔ̒萔iAsj */ +#if !defined(CRI_OK) +#define CRI_OK (0) /* */ +#endif +#if !defined(CRI_NG) +#define CRI_NG (-1) /* s */ +#endif + +/***************************************************************************** + * |C^܂64rbgAhXi[ł鐮^ + * l: |C^32bitROMAhX64bit̊‹ŁA҂𓧉ߓIɈB + * The integer type which can hold an pointer or an address up to 64 bits. + * NOTE: In the environment of pointer 32bit and ROM address space 64bit, + * this type can treat both transparently. + *****************************************************************************/ + +#if !defined(_TYPEDEF_CriUint64Adr) +#define _TYPEDEF_CriUint64Adr +typedef CriUint64 CriUint64Adr; /* |C^܂64rbgAhXi[ł鐮^ */ +#endif + +#if !defined(CRI_PTR_TO_UINT64ADR) +#define CRI_PTR_TO_UINT64ADR(ptr) ((CriUint64Adr)(ptr)) /* Convert pointer to CriUint64Adr */ +#endif + +#if !defined(CRI_UINT64ADR_TO_PTR) +#define CRI_UINT64ADR_TO_PTR(uint64adr) ((void *)(CriUintPtr)(uint64adr)) /* Convert CriUint64Adr to pointer */ +#endif + +#if !defined(CRI_XPT_DISABLE_UNPREFIXED_TYPE) + +/***************************************************************************** + * ݊ێ̂߂̒萔}N + * Macros for compatibility with old version + *****************************************************************************/ + +/* NULL |C^^ */ +#if !defined(NULL) +#define NULL (CRI_NULL) +#endif + +/* _萔PiUA^j */ +#if !defined(FALSE) +#define FALSE (CRI_FALSE) +#endif +#if !defined(TRUE) +#define TRUE (CRI_TRUE) +#endif + +/* _萔QiXCb`j */ +#if !defined(OFF) +#define OFF (CRI_OFF) +#endif +#if !defined(ON) +#define ON (CRI_ON) +#endif + +/* ʔ̒萔iAsj */ +#if !defined(OK) +#define OK (CRI_OK) +#endif +#if !defined(NG) +#define NG (CRI_NG) +#endif + +/***************************************************************************** + * ݊ێ̂߂̃f[^^錾 + * Types for compatibility with old version + *****************************************************************************/ + +#if !defined(_TYPEDEF_Uint8) +#define _TYPEDEF_Uint8 +typedef CriUint8 Uint8; /* ȂPoCg */ +#endif + +#if !defined(_TYPEDEF_Sint8) +#define _TYPEDEF_Sint8 +typedef CriSint8 Sint8; /* ‚PoCg */ +#endif + +#if !defined(_TYPEDEF_Uint16) +#define _TYPEDEF_Uint16 +typedef CriUint16 Uint16; /* ȂQoCg */ +#endif + +#if !defined(_TYPEDEF_Sint16) +#define _TYPEDEF_Sint16 +typedef CriSint16 Sint16; /* ‚QoCg */ +#endif + +#if !defined(_TYPEDEF_Uint32) +#define _TYPEDEF_Uint32 +typedef CriUint32 Uint32; /* ȂSoCg */ +#endif + +#if !defined(_TYPEDEF_Sint32) +#define _TYPEDEF_Sint32 +typedef CriSint32 Sint32; /* ‚SoCg */ +#endif + +#if !defined(_TYPEDEF_Uint64) +#define _TYPEDEF_Uint64 +typedef CriUint64 Uint64; /* ȂWoCg */ +#endif + +#if !defined(_TYPEDEF_Sint64) +#define _TYPEDEF_Sint64 +typedef CriSint64 Sint64; /* ‚WoCg */ +#endif + +#if !defined(_TYPEDEF_Uint128) +#define _TYPEDEF_Uint128 +typedef CriUint128 Uint128; /* Ȃ16oCg */ +#endif + +#if !defined(_TYPEDEF_Sint128) +#define _TYPEDEF_Sint128 +typedef CriSint128 Sint128; /* ‚16oCg */ +#endif + +#if !defined(_TYPEDEF_Float16) +#define _TYPEDEF_Float16 +typedef CriFloat16 Float16; /* QoCg */ +#endif + +#if !defined(_TYPEDEF_Float32) +#define _TYPEDEF_Float32 +typedef CriFloat32 Float32; /* SoCg */ +#endif + +#if !defined(_TYPEDEF_Float64) +#define _TYPEDEF_Float64 +typedef CriFloat64 Float64; /* WoCg */ +#endif + +#if !defined(_TYPEDEF_Fixed32) +#define _TYPEDEF_Fixed32 +typedef CriFixed32 Fixed32; /* Œ菬_32rbg */ +#endif + +/* X11 APIixtrapproto.hjƂ̋p */ +#if !defined(_TYPEDEF_Bool) && !defined(Bool) +#define _TYPEDEF_Bool +typedef CriBool Bool; /* _^i_萔lɂƂj */ +#endif + +#if !defined(_TYPEDEF_Char8) +#define _TYPEDEF_Char8 +typedef CriChar8 Char8; /* ^ */ +#endif + +#if !defined(_TYPEDEF_SintPtr) +#define _TYPEDEF_SintPtr +typedef CriSintPtr SintPtr; +#endif + +#if !defined(_TYPEDEF_UintPtr) +#define _TYPEDEF_UintPtr +typedef CriUintPtr UintPtr; +#endif + +#endif /* CRI_XPT_DISABLE_UNPREFIXED_TYPE */ + +#endif /* CRI_INCL_CRI_XPT_POST_H */ + +/* end of file */ diff --git a/3rdParty/cri/orbis/include/cri_xpts_orbis.h b/3rdParty/cri/orbis/include/cri_xpts_orbis.h new file mode 100644 index 00000000..71aee5fd --- /dev/null +++ b/3rdParty/cri/orbis/include/cri_xpts_orbis.h @@ -0,0 +1,133 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 1998-2012 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header for PS4 + * File : cri_xpts_ps4.h + * Date : 2012-10-04 + * Version : 2.01 + * + ****************************************************************************/ + +#if !defined(CRI_INCL_CRI_XPTS_PS4_H) +#define CRI_INCL_CRI_XPTS_PS4_H + +/***************************************************************************** + * {f[^^錾 + *****************************************************************************/ + +#if !defined(_TYPEDEF_CriUint8) +#define _TYPEDEF_CriUint8 +typedef unsigned char CriUint8; /* ȂPoCg */ +#endif + +#if !defined(_TYPEDEF_CriSint8) +#define _TYPEDEF_CriSint8 +typedef signed char CriSint8; /* ‚PoCg */ +#endif + +#if !defined(_TYPEDEF_CriUint16) +#define _TYPEDEF_CriUint16 +typedef unsigned short CriUint16; /* ȂQoCg */ +#endif + +#if !defined(_TYPEDEF_CriSint16) +#define _TYPEDEF_CriSint16 +typedef signed short CriSint16; /* ‚QoCg */ +#endif + +#if !defined(_TYPEDEF_CriUint32) +#define _TYPEDEF_CriUint32 +typedef unsigned int CriUint32; /* ȂSoCg */ +#endif + +#if !defined(_TYPEDEF_CriSint32) +#define _TYPEDEF_CriSint32 +typedef signed int CriSint32; /* ‚SoCg */ +#endif + +#if !defined(_TYPEDEF_CriUint64) +#define _TYPEDEF_CriUint64 +typedef unsigned long CriUint64; /* ȂWoCg */ +#endif + +#if !defined(_TYPEDEF_CriSint64) +#define _TYPEDEF_CriSint64 +typedef signed long CriSint64; /* ‚WoCg */ +#endif + +#if !defined(_TYPEDEF_CriUint128) +#define _TYPEDEF_CriUint128 +//typedef unsigned __int128 CriUint128; /* Ȃ16oCg */ +typedef struct { /* Ȃ16oCg */ + CriUint64 h; /* 64rbg */ + CriUint64 l; /* 64rbg */ +} CriUint128; +#endif + +#if !defined(_TYPEDEF_CriSint128) +#define _TYPEDEF_CriSint128 +//typedef signed __int128 CriSint128; /* ‚16oCg */ +typedef struct { /* ‚16oCg */ + CriSint64 h; /* 64rbg */ + CriUint64 l; /* 64rbg */ +} CriSint128; +#endif + +#if !defined(_TYPEDEF_CriFloat16) +#define _TYPEDEF_CriFloat16 +typedef signed short CriFloat16; /* QoCg */ +#endif + +#if !defined(_TYPEDEF_CriFloat32) +#define _TYPEDEF_CriFloat32 +typedef float CriFloat32; /* SoCg */ +#endif + +#if !defined(_TYPEDEF_CriFloat64) +#define _TYPEDEF_CriFloat64 +typedef double CriFloat64; /* WoCg */ +#endif + +#if !defined(_TYPEDEF_CriFixed32) +#define _TYPEDEF_CriFixed32 +typedef signed int CriFixed32; /* Œ菬_32rbg */ +#endif + +#if !defined(_TYPEDEF_CriBool) +#define _TYPEDEF_CriBool +typedef CriSint32 CriBool; /* _^i_萔lɂƂj */ +#endif + +#if !defined(_TYPEDEF_CriChar8) +#define _TYPEDEF_CriChar8 +typedef char CriChar8; /* ^ */ +#endif + +/***************************************************************************** + * |C^i[”\Ȑ^ + *****************************************************************************/ +#if !defined(_TYPEDEF_CriSintPtr) +#define _TYPEDEF_CriSintPtr +typedef signed long CriSintPtr; // 8 bytes pointer +#endif + +#if !defined(_TYPEDEF_CriUintPtr) +#define _TYPEDEF_CriUintPtr +typedef unsigned long CriUintPtr; // 8 bytes pointer +#endif + +/***************************************************************************** + * ĂяoK + *****************************************************************************/ + +#if !defined(CRIAPI) +#define CRIAPI +#endif + +#endif /* CRI_INCL_CRI_XPTS_PS4_H */ + +/* end of file */ diff --git a/3rdParty/cri/pc/include/cri_allocator.h b/3rdParty/cri/pc/include/cri_allocator.h new file mode 100644 index 00000000..e3c18997 --- /dev/null +++ b/3rdParty/cri/pc/include/cri_allocator.h @@ -0,0 +1,63 @@ +#ifndef _CRI_ALLOCATOR_H_INCLUDED +#define _CRI_ALLOCATOR_H_INCLUDED +/**************************************************************************** + * * + * CRI Allocator * + * * + * 2006-01-05 written by M.Oshimi * + * * + ****************************************************************************/ + +/**************************************************************************** + * Include file + ****************************************************************************/ +#include +#include "cri_xpt.h" +#include "cri_heap.h" + +/**************************************************************************** + * Macro Constants + ****************************************************************************/ +#if defined(XPT_UNSUPPORT_CPLUSPLUS_THROW) +#define CRI_ALLOCATOR_CPLUSPLUS_THROW +#else +#define CRI_ALLOCATOR_CPLUSPLUS_THROW throw() +#endif + +/**************************************************************************** + * Class Declaration + ****************************************************************************/ +#ifdef __cplusplus + +class CriAllocator +{ +public: + static const CriSint32 DEFAULT_ALIGNMENT = CRIHEAP_DEFAULT_MEM_ALIGN; + + + static void* CRIAPI operator new(size_t size, CriHeap heap) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, CriHeapType heap_type) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, const CriChar8 *name, CriUint32 align=DEFAULT_ALIGNMENT) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, CriHeap heap, CriHeapType heap_type, const CriChar8 *name, CriUint32 align=DEFAULT_ALIGNMENT) CRI_ALLOCATOR_CPLUSPLUS_THROW; + + static void CRIAPI operator delete(void *p, size_t size); + + static void* CRIAPI operator new(size_t size, void *work, CriSint32 wksize) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, void *work, CriSint32 wksize) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void* CRIAPI operator new(size_t size, void *work, CriSint32 wksize, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, void *work, CriSint32 wksize, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + +#if !defined(XPT_TGT_BCB) + static void CRIAPI operator delete(void *p, CriHeap heap) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, CriHeapType heap_type) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, const CriChar8 *name, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; + static void CRIAPI operator delete(void *p, CriHeap heap, CriHeapType heap_type, const CriChar8 *name, CriUint32 align) CRI_ALLOCATOR_CPLUSPLUS_THROW; +#endif + + static CriSint32 GetWorstExtraSize(CriUint32 align); +}; +#endif // _CRI_ALLOCATOR_H_INCLUDED + +#endif /* end of __cplusplus */ + +/* --- end of file --- */ diff --git a/3rdParty/cri/pc/include/cri_error.h b/3rdParty/cri/pc/include/cri_error.h new file mode 100644 index 00000000..ea913979 --- /dev/null +++ b/3rdParty/cri/pc/include/cri_error.h @@ -0,0 +1,368 @@ +#ifndef _CRI_ERROR_H_INCLUDED +#define _CRI_ERROR_H_INCLUDED +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2006-2009 CRI Middleware Co., Ltd. + * + * Library : CRI Error + * Module : + * File : cri_error.h + * + ****************************************************************************/ +/*! + * \file cri_error.h + */ +/*JP + * \addtogroup CRI_ERROR エラーハンドリング用関数群 + * @{ + */ +/*EN + * \addtogroup CRI_ERROR Functions for error handling + * @{ + */ + +/**************************************************************************** + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" + +/**************************************************************************** + * MACRO CONSTANT * + ****************************************************************************/ + +/* バージョン番号 */ +/* Version number */ +#define CRIERROR_VER_NAME "CRI Error" +#define CRIERROR_VER_NUM "1.04.00" +#define CRIERROR_VER_OPTION + +/*JP + * \brief エラーコード + */ +/*EN + * \brief Error codes + */ +typedef enum { + CRIERR_OK = 0, /*JP< 正常終了 */ + /*EN< Succeeded */ + CRIERR_NG = -1, /*JP< エラーが発生 */ + /*EN< Error occurred */ + CRIERR_INVALID_PARAMETER = -2, /*JP< 引数が不正 */ + /*EN< Invalid argument */ + CRIERR_FAILED_TO_ALLOCATE_MEMORY = -3, /*JP< メモリの確保に失敗 */ + /*EN< Failed to allocate memory */ + CRIERR_UNSAFE_FUNCTION_CALL = -4, /*JP< 非スレッドセーフ関数の並列実行 */ + /*EN< Parallel execution of thread-unsafe function */ + CRIERR_FUNCTION_NOT_IMPLEMENTED = -5, /*JP< 未実装関数の実行 */ + /*EN< Function not implemented */ + CRIERR_LIBRARY_NOT_INITIALIZED = -6, /*JP< ライブラリが未初期化 */ + /*EN< Library not initialized */ + /* enum be 4bytes */ + CRIERR_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriError; + +/*JP + * \brief エラー通知レベル + */ +/*EN + * \brief Error notification level + */ +typedef enum { + CRIERR_NOTIFY_ALL = 0, /*JP< 全てのエラーを通知 */ + /*EN< Notify all errors */ + CRIERR_NOTIFY_FATAL = 1, /*JP< エラーのみ通知(警告は無視) */ + /*EN< Notify error (Disregards warning) */ + /* enum be 4bytes */ + CRIERR_NOTIFY_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriErrorNotificationLevel; + +/* エラーレベル */ +/* Error level */ +typedef enum { + CRIERR_LEVEL_ERROR = 0, + CRIERR_LEVEL_WARNING = 1, + /* enum be 4bytes */ + CRIERR_LEVEL_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriErrorLevel; + +/**************************************************************************** + * PROCESS MACRO * + ****************************************************************************/ + +#if defined(CRIERROR_SIMPLIFY) + /* エラーの通知 */ + /* Notification of Error */ + #define criErr_NotifyError(id, msg) criErr_NotifyErrorSimple() + #define criErr_NotifyError1(id, msg, p1) criErr_NotifyErrorSimple() + #define criErr_NotifyError2(id, msg, p1, p2) criErr_NotifyErrorSimple() + #define criErr_NotifyErrorPrmArray(id, msg, p1, p2, pa) criErr_NotifyErrorSimple() + #define criErr_NotifyErrorGeneric(_error_id, _error_no) criErr_NotifyErrorSimple() + /* 警告の通知 */ + /* Notification of Warning */ + #define criErr_NotifyWarning(id, msg) criErr_NotifyWarningSimple() + #define criErr_NotifyWarning1(id, msg, p1) criErr_NotifyWarningSimple() + #define criErr_NotifyWarning2(id, msg, p1, p2) criErr_NotifyWarningSimple() + #define criErr_NotifyWarningPrmArray(id, msg, p1, p2, pa) criErr_NotifyWarningSimple() + #define criErr_NotifyWarningGeneric(_error_id, _error_no) criErr_NotifyWarningSimple() +#else + /* エラーの通知 */ + /* Notification of Error */ + #define criErr_NotifyError(id, msg) criErr_Notify(CRIERR_LEVEL_ERROR, id ":" msg) + #define criErr_NotifyError1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1)) + #define criErr_NotifyError2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) + #define criErr_NotifyErrorPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr *)(pa)) + #define criErr_NotifyErrorGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, _error_id, _error_no) + /* 警告の通知 */ + /* Notification of Warning */ + #define criErr_NotifyWarning(id, msg) criErr_Notify(CRIERR_LEVEL_WARNING, id ":" msg) + #define criErr_NotifyWarning1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1)) + #define criErr_NotifyWarning2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) + #define criErr_NotifyWarningPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_WARNING, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr *)(pa)) + #define criErr_NotifyWarningGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_WARNING, _error_id, _error_no) +#endif + +/**************************************************************************** + * Data type declaration * + ****************************************************************************/ + +/* Error Callback Function type */ +typedef void (CRIAPI *CriErrCbFunc)(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + +/**************************************************************************** + * 変数の宣言 * + * Variable Declaration * + ****************************************************************************/ +/* エラー出力省略用変数 */ +/* default argument of CriError */ +#ifdef __cplusplus +namespace criErr { + extern CriError ErrorContainer; +} +#endif /* __cplusplus */ + +/**************************************************************************** + * 関数の宣言 * + * Function Declaration * + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*JP + * \brief エラーID文字列からエラーメッセージへ変換 + * \ingroup CRI_ERROR + * \param[in] errid エラーID文字列 + * \return エラーメッセージ + * \par 説明: + * エラーID文字列から詳細なエラーメッセージへ変換します。
+ * \attention + * この関数は旧仕様の関数です。
+ * 代わりに ::criErr_ConvertIdToMessage 関数を使用してください。 + * \sa criErr_ConvertIdToMessage + */ +/*EN + * \brief Convert error ID to error message + * \ingroup CRI_ERROR + * \param[in] errid error ID + * \return error message + * \par Explanation: + * This function converts error ID to detailed error message.
+ * \attention + * This function is an obsolete one.
+ * Please use the ::criErr_ConvertIdToMessage function instead. + * \sa criErr_ConvertIdToMessage + */ +const CriChar8* CRIAPI criErr_ConvertIdToMsg(const CriChar8 *errid); + +/*JP + * \brief エラーID文字列からエラーメッセージへ変換 + * \ingroup CRI_ERROR + * \param[in] errid エラーID文字列 + * \param[in] p1 補足情報1 + * \param[in] p2 補足情報2 + * \return エラーメッセージ + * \par 説明: + * エラーID文字列から詳細なエラーメッセージへ変換します。
+ * \par 用例: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * \endcode + */ +/*EN + * \brief Convert error ID to error message + * \ingroup CRI_ERROR + * \param[in] errid error ID + * \param[in] p1 supplementary information 1 + * \param[in] p2 supplementary information 2 + * \return error message + * \par Explanation: + * This function converts error ID to detailed error message.
+ * \par Example: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * \endcode + */ +const CriChar8* CRIAPI criErr_ConvertIdToMessage(const CriChar8 *errid, CriUint32 p1, CriUint32 p2); + +/*JP + * \brief エラーコールバック関数の登録 + * \ingroup CRI_ERROR + * \param[in] cbf エラーコールバック関数 + * \return なし + * \par 説明: + * エラーコールバック関数を登録します。
+ * 登録された関数は、CRIミドルウエアライブラリ内でエラーが発生したときに呼び出されます。
+ * 同時に登録できるエラーコールバック関数は1つです。
+ * 登録後に再度本関数を呼び出した場合は現在の登録を上書きします。 + * \par 用例: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * + * void main(int ac, char *av[]) + * { + * : + * // エラーコールバックの登録 + * criErr_SetCallback(user_error_callback_func); + * : + * } + * \endcode + */ +/*EN + * \brief Register error callback function + * \ingroup CRI_ERROR + * \param[in] cbf error callback function + * \return NONE + * \par Explanation: + * This function registers an error callback function.
+ * The registered function is called if an error occurs within the CRI middleware library. + * \par Example: + * \code + * void user_error_callback_func(const CriChar8 *errid, CriUint32 p1, CriUint32 p2, CriUint32 *parray); + * { + * const CriChar8 *errmsg; + * errmsg = criErr_ConvertIdToMessage(errid, p1, p2); + * printf("%s\n", errmsg); + * } + * + * void main(int ac, char *av[]) + * { + * : + * // Registers the error callback function + * criErr_SetCallback(user_error_callback_func); + * : + * } + * \endcode + */ +void CRIAPI criErr_SetCallback(CriErrCbFunc cbf); + +/*JP + * \brief エラー通知レベルの変更 + * \ingroup CRI_ERROR + * \param[in] level エラー通知レベル + * \return なし + * \par 説明: + * エラーコールバックに通知するエラーのレベルを変更します。 + */ +/*EN + * \brief Change error notification level + * \ingroup CRI_ERROR + * \param[in] level error notification level + * \return NONE + * \par Explanation: + * This function changes the level of error information that is notified to the error callback. + */ +void CRIAPI criErr_SetErrorNotificationLevel(CriErrorNotificationLevel level); + +/*JP + * \brief エラー発生回数の取得 + * \ingroup CRI_ERROR + * \param[in] level エラーレベル + * \return エラー発生回数 + * \par 説明: + * エラー発生回数を取得します。 + */ +/*EN + * \brief Retrieve error count + * \ingroup CRI_ERROR + * \param[in] level error level + * \return number of errors occured + * \par Explanation: + * This function retrieves the number of errors occured. + */ +CriUint32 CRIAPI criErr_GetErrorCount(CriErrorLevel level); + +/*JP + * \brief エラー発生回数のリセット + * \ingroup CRI_ERROR + * \param[in] level エラーレベル + * \return なし + * \par 説明: + * エラー発生回数のカウンタを0に戻します。 + */ +/*EN + * \brief Resets error count + * \ingroup CRI_ERROR + * \param[in] level error level + * \return NONE + * \par Explanation: + * This function resets the counter for number of errors occured. + */ +void CRIAPI criErr_ResetErrorCount(CriErrorLevel level); + +/* エラーコールバックを発生させる (内部関数) */ +/* Error notification (Internal functions) */ +void CRIAPI criErr_Notify(CriErrorLevel level, const CriChar8 *errid); +void CRIAPI criErr_Notify1(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1); +void CRIAPI criErr_Notify2(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1, CriUintPtr p2); +void CRIAPI criErr_NotifyPrmArray(CriErrorLevel level, const CriChar8 *errid, CriUintPtr p1, CriUintPtr p2, CriUintPtr *pa); +void CRIAPI criErr_NotifyGeneric(CriErrorLevel level, const CriChar8 *error_id, CriError error_no); +void CRIAPI criErr_NotifyErrorSimple(void); +void CRIAPI criErr_NotifyWarningSimple(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/*************************************************************************** + * 旧バージョンとの互換用 + * For compatibility with old versions + ***************************************************************************/ +#define criErr_Invoke(errid) criErr_Notify(CRIERR_LEVEL_ERROR, errid) +#define criErr_Invoke1(errid, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, errid, p1) +#define criErr_Invoke2(errid, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, errid, p1, p2) +#define criErr_InvokePrmArray(errid, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, errid, p1, p2, pa) +#define criErr_InvokeGeneric(error_id, error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, error_id, error_no) +#define criErr_Occur(id, msg) criErr_Notify(CRIERR_LEVEL_ERROR, id ":" msg) +#define criErr_Occur1(id, msg, p1) criErr_Notify1(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1)) +#define criErr_Occur2(id, msg, p1, p2) criErr_Notify2(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2)) +#define criErr_OccurPrmArray(id, msg, p1, p2, pa) criErr_NotifyPrmArray(CRIERR_LEVEL_ERROR, (id ":" msg), (CriUintPtr)(p1), (CriUintPtr)(p2), (CriUintPtr*)(pa)) +#define criErr_OccurGeneric(_error_id, _error_no) criErr_NotifyGeneric(CRIERR_LEVEL_ERROR, _error_id, _error_no) + +/*EN + * @} + */ +/*JP + * @} + */ + +#endif // _CRI_ERROR_H_INCLUDED + +/* --- end of file --- */ diff --git a/3rdParty/cri/pc/include/cri_heap.h b/3rdParty/cri/pc/include/cri_heap.h new file mode 100644 index 00000000..18ec11c2 --- /dev/null +++ b/3rdParty/cri/pc/include/cri_heap.h @@ -0,0 +1,640 @@ +#ifndef _CRI_HEAP_H_INCLUDED +#define _CRI_HEAP_H_INCLUDED +/**************************************************************************** + * * + * CRI Heap Manager "CriHeap" Library * + * * + * 2005-03-17 written by satouo * + * * + ****************************************************************************/ +/*! + * \file cri_heap.h + */ + +/**************************************************************************** + * インクルードファイル * + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" + +#ifdef XPT_TGT_PC +#pragma pack(push) +#pragma pack(1) //The boundary value of structure is adjusted to 1 byte. +#endif + +/**************************************************************************** + * 定数マクロ * + * MACRO CONSTANT * + ****************************************************************************/ +/* Version number of CRIHEAP */ +#define CRIHEAP_NAME_STRINGS "CRI Heap" +#define CRIHEAP_VERSION_STRINGS "1.21.02" + +/* Default memory alignment */ +#define CRIHEAP_DEFAULT_MEM_ALIGN (8) + +/**************************************************************************** + * 列挙定数マクロ * + * ENUM CONSTANT * + ****************************************************************************/ +/*JP + * \brief メモリのタイプ + */ +/*EN + * \brief Types of heap + */ +typedef enum { + CRIHEAP_TYPE_FIX = (1), + CRIHEAP_TYPE_TEMPORARY = (2), + CRIHEAP_TYPE_DYNAMIC = (3), // unuse + CRIHEAP_TYPE_NONE = (0), + /* enum be 4bytes */ + CRIHEAP_TYPE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriHeapType; + +/**************************************************************************** + * データ型 * + * Data type declaration * + ****************************************************************************/ +/* CriHeapハンドル */ +/* CriHeap handle */ +#ifndef CRIHEAP_DEFINED +#define CRIHEAP_DEFINED + +/* internal */ +typedef struct CriHeapBlockTag { + struct CriHeapBlockTag *prevblock; + struct CriHeapBlockTag *nextblock; + CriSint32 memsize; + CriUint8 used; + CriUint8 type; + CriUint16 alignspc; + CriUint16 gap; + CriChar8 *nameadr; +} CriHeapBlock, *CriHeapBlockPtr; + +/*JP + * \brief CRI Heapハンドル + * \struct CriHeap + * \ingroup CRIHEAP_BASIC + * CRI Heapを用いてメモリアロケートを行うために必要なハンドルです。
+ * このハンドルに対して、メモリアロケートやメモリフリーを行います。 + * \sa criHeap_Create(), criHeap_Destroy() + */ +/*EN + * \brief CRI Heap handle + * \struct CriHeap + * \ingroup CRIHEAP_BASIC + * \par Description: + * The heap handle. This data structure needs to exist through the life cycle of + * the heap. It allows the library to allocate and deallocate memory + * internally within the heap. Typically this handle gets allocated at the + * beginning of the heap memory that you've provided for the heap, but don't + * depend on this behavior. The heap itself is opaque. You can of course + * allocate multiple non-contiguous heaps, but these will be separate heap + * structures and a single allocation won't choose between them. + * + * \sa criHeap_Create(), criHeap_Destroy() + */ +typedef struct _criheap_struct { + struct _criheap_vfunctiontable *vtbl; + CriSint32 totalsize; + CriSint32 peaksize; + CriSint32 currentsize; + CriHeapBlock *topblock; + CriHeapBlock *taleblock; +} CriHeapObj, *CriHeap; + +/*JP + * \brief CRI Heap仮想関数テーブル + * \struct criHeapVirtualFunctionTable + * \ingroup CRIHEAP_BASIC + * 独自のメモリアロケート関数を実装する際に使用する仮想関数テーブル構造体です。
+ * 各関数はマルチスレッドセーフである必要があります。
+ * \par 備考: + * 3番目のアロケート関数は現在未使用です。 + */ +/*EN + * \brief CRI Heap Virtual Function Table + * \struct criHeapVirtualFunctionTable + * \ingroup CRIHEAP_BASIC + * \par Description: + * The virtual functions table for original allocation functions.
+ * The third allocation function is not in use currently. + */ +typedef struct _criheap_vfunctiontable { + /*JP + * \brief メモリのアロケート(メモリ領域の先端から) + * \par 説明: + * criHeap_AllocFix関数呼び出し時に呼ばれます。 + * \sa criHeap_AllocFix() + */ + /*EN + * \brief Memory allocation (allocating from the top of the memory area) + * \par Description: + * Called from criHeap_AllocFix(). + * \sa criHeap_AllocFix() + */ + void *(*AllocFix)(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + /*JP + * \brief メモリのアロケート(メモリ領域の終端から) + * \par 説明: + * criHeap_AllocFix関数呼び出し時に呼ばれます。 + * \sa criHeap_AllocTemporary() + */ + /*EN + * \brief Memory allocation (allocating from the tail of the memory area) + * \par Description: + * Called from criHeap_AllocTemporary(). + * \sa criHeap_AllocTemporary() + */ + void *(*AllocTemporary)(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + /*JP + * \brief 未使用関数 + */ + /*EN + * \brief Unused + */ + void *(*AllocDynamic)(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); // unused + + /*JP + * \brief メモリのフリー + * \par 説明: + * criHeap_Free関数呼び出し時に呼ばれます。 + * \sa criHeap_Free() + */ + /*EN + * \brief Memory deallocation + * \par Description: + * Called from criHeap_Free(). + * \sa criHeap_Free() + */ + CriSint32 (*Free)(CriHeap heap, void *ptr); +} criHeapVirtualFunctionTable; + +#endif + + +/**************************************************************************** + * 関数の宣言 + * Function Declaration + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*==========================================================================* + * ライブラリの初期化と終了処理 + * Initialize and Finalize of Library + *==========================================================================*/ +/*JP + * \brief CRI Heapライブラリの初期化 + * \ingroup CRIHEAP_BASIC + * \par 説明: + * CRI Heapライブラリを使用するために必要な初期化関数です。
+ * CRI Heapを使用する際はあらかじめ本関数をコールする必要があります。 + * \sa criHeap_Finalize() + */ +/*EN + * \brief Initialize the heap manager. + * \ingroup CRIHEAP_BASIC + * \par Description: + * This function initializes the heap manager and prepares it to manage heaps. + * This function only has an effect the first time it is called in your program. + * Subsequent calls only increment an internal counter. This allows your + * program to call criHeap_Initialize() in pairs with criHeap_Finalize() + * throughout your program modules, and only the initial call to criHeap_Initialize() + * and the final call to criHeap_Finalize() will have any effect. + * \if ps2 + * \par PS2 only: + * This function does a sanity check to make sure that the size of the CriHeapObj + * data structure is a factor of 16. If it is not a factor of 16, this function + * hangs. + * \endif + * \sa criHeap_Finalize() + */ +void CRIAPI criHeap_Initialize(void); + +/*JP + * \brief CRI Heapライブラリの終了 + * \ingroup CRIHEAP_BASIC + * \par 説明: + * CRI Heapライブラリを終了するために必要な終了関数です。
+ * CRI Heapの使用を終了する際は本関数をコールしてください。 + * \sa criHeap_Initialize() + */ +/*EN + * \brief Finalize the heap manager. + * \ingroup CRIHEAP_BASIC + * \par Description: + * This function finalizes the heap manager. If the criHeap_Initialize() function + * is called n times, then the nth time that criHeap_Finalize() + * is called, this function invalidates any heaps currently in use. Calling + * any heap function after the nth call to criHeap_Finalize() will + * have unpredictable results. + * \sa criHeap_Initialize() + */ +void CRIAPI criHeap_Finalize(void); + +/*==========================================================================* + * ハンドルの生成・解放 + *==========================================================================*/ +/*JP + * \brief CRI Heapハンドルの生成 + * \ingroup CRIHEAP_BASIC + * \param ptr メモリ領域のポインタ。 + * \param size メモリ領域のサイズ。 + * \return CRI Heapハンドル。
生成に失敗した場合は、NULLが返ります。 + * \par 説明: + * CRI Heapハンドルを生成します。
+ * 本関数で与えるメモリ領域は、CRI Heap自身のハンドル領域やアロケート時に + * 確保されるメモリ領域となります。
+ * 管理領域を含むため、メモリ領域すべてがアロケート出来ない点に注意してください。 + * 管理領域の目安は「1ハンドルあたりsizeof(CriHeapObj)」+「1アロケートあたり + * sizeof(CriHeapBlock)+各メモリアライメントに必要なサイズ」となります。 + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * \endcode + * \sa criHeap_Destroy() + */ +/*EN + * \brief Create a contiguous heap in memory. + * \ingroup CRIHEAP_BASIC + * \param ptr A pointer to the start of the memory region to use as a heap. + * \param size The size of the region to be used as a heap. + * \return A valid CriHeap handle if successful, or NULL if unsuccessful. + * \par Description: + * This function allows you to set aside a region of memory for this library's + * use as a "heap". Heap allocation is required before active playback + * can begin. + * This function will fail and return NULL if the size of the memory region + * is smaller than the CriHeapObj structure. + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * \endcode + * \sa criHeap_Destroy() + */ +CriHeap CRIAPI criHeap_Create(void *ptr, CriSint32 size); + +/*JP + * \brief 非スレッドセーフなCRI Heapハンドルの生成 + * \ingroup CRIHEAP_BASIC + * \param ptr メモリ領域のポインタ。 + * \param size メモリ領域のサイズ。 + * \return CRI Heapハンドル。
生成に失敗した場合は、NULLが返ります。 + * \par 説明: + * CRI Heapハンドルを生成します。
+ * 本関数を使用して作成されたヒープは、排他制御が行なわれません。
+ * 複数スレッドから同時に参照されるヒープの作成には、criHeap_Create関数をご利用ください。 + * \sa criHeap_Create(), criHeap_Destroy() + */ +/*EN + * \brief Create a contiguous heap in memory. + * \ingroup CRIHEAP_BASIC + * \param ptr A pointer to the start of the memory region to use as a heap. + * \param size The size of the region to be used as a heap. + * \return A valid CriHeap handle if successful, or NULL if unsuccessful. + * \par Description: + * This function creates a heap to use the static memory as dynamically allocatable memory. + * The heap created by using this function is not threadsafe. + * If heap will be accessed by multiple threads, you must create the heap by using the criHeap_Create function. + * \sa criHeap_Create(), criHeap_Destroy() + */ +CriHeap CRIAPI criHeap_CreateNoSerialize(void *ptr, CriSint32 size); + +/*JP + * \brief CRI Heapハンドルの解放 + * \ingroup CRIHEAP_BASIC + * \param heap CRI Heapハンドル。 + * \par 説明: + * CRI Heapハンドルを解放します。
criHeap_Create() で指定されたメモリ領域が + * 解放され、CRI Heapハンドルは無効となります。 + * \sa criHeap_Create() + */ +/*EN + * \brief Destroy a previously created heap. + * \ingroup CRIHEAP_BASIC + * \param heap A CriHeap handle previously created with criHeap_Create(). + * \par Description: + * This function frees all internal allocations previously performed on + * the heap and frees the memory. Internally, this function does in + * fact walk through the heap, finding and freeing all allocations, e.g. + * it is not stubbed. So calling this function on a trashed heap + * will have unpredictable results. + * \sa criHeap_Create() + */ +void CRIAPI criHeap_Destroy(CriHeap heap); + +/*==========================================================================* + * Allocation + *==========================================================================*/ +/*JP + * \brief メモリのアロケート(メモリ領域の先端から) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heapハンドル。 + * \param size アロケートするメモリのサイズ。 + * \param name アロケートするメモリの名前。名前はデバッグ時に使用されます。 + * \param align アロケートするメモリのアライメント。 + * \return アロケートしたメモリへのポインタ。
アロケートに失敗した場合はNULLが返ります。 + * \par 説明: + * メモリ領域の先端側から確保するメモリアロケーション関数です。ヒープ領域内に\ref block_fix "Fixブロック"を作成します。
+ * メモリの断片化を防ぐため、同じサイズ/アライメントの解放済み\ref block_fix "Fixブロック"を先端側から探して、再利用するように試みます。それが見つからない場合は、未使用の空き領域(\ref block_free "Freeブロック")を分割してメモリを取得します。 + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * \endcode + * \sa criHeap_AllocTemporary(), criHeap_Free() + */ +/*EN + * \brief Memory allocation (allocating from the top of the memory area) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heap handle + * \param size Memory block size to be allocated + * \param name Memory block name, which is used on debugging + * \param align Memory block alignment + * \return A pointer to the allocated memory block.
Returns NULL if unsuccessful. + * \par Description: + * This function allocates a memory block from the top of the memory area and creates a \ref block_fix "Fix block" in the heap area.
+ * To prevent memory fragmentation, a released \ref block_fix "Fix block" with the same size and alignment is searched for in the heap area from the top to the bottom and tries to reused the block. And if not found, an unused free block (\ref block_free "Free block") is divided and a new block is allocated. + * \code + * CriChar8 heap_buffer[0x2000]; + * CriHeap heap = criHeap_Create((void *)heap_buffer, sizeof(heap_buffer); + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * \endcode + * \sa criHeap_AllocTemporary(), criHeap_Free() + */ +void * CRIAPI criHeap_AllocFix(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + +/*JP + * \brief メモリのアロケート(メモリ領域の終端から) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heapハンドル。 + * \param size アロケートするメモリのサイズ。 + * \param name アロケートするメモリの名前。名前はデバッグ時に使用されます。 + * \param align アロケートするメモリのアライメント。 + * \return アロケートしたメモリへのポインタ。
アロケートに失敗した場合はNULLが返ります。 + * \par 説明: + * メモリ領域の終端側から確保するメモリアロケーション関数です。ヒープ領域内に\ref block_temporary "Temporaryブロック"を作成します。
+ * 要求したサイズ/アライメントをアロケート可能な解放済み\ref block_temporary "Temporaryブロック"を終端側から探して、分割または再利用するように試みます。それが見つからない場合は、未使用の空き領域(\ref block_free "Freeブロック")を分割してメモリを取得します。
+ * ヒープ領域の終端側からメモリをアロケートするため、先端側での断片化を防ぐことが出来ます。
+ * 主に、一時的に利用するメモリに使用します。 + * \sa criHeap_AllocFix(), criHeap_Free() + */ +/*EN + * \brief Memory allocation (allocating from the tail of the memory area) + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heap handle + * \param size Memory block size to be allocated + * \param name Memory block name, which is used on debugging + * \param align Memory block alignment + * \return A pointer to the allocated memory block.
Returns NULL if unsuccessful. + * \par Description: + * This function allocates a memory block from the bottom of the memory area and creates a \ref block_temporary "Temporary block" in the heap area.
+ * A released \ref block_temporary "Temporary block" available with the requested size and alignment is searched for in the heap area from the bottom and tries to divide and to reuse the block. And if not found, an unused free block (\ref block_free "Free block") is divided and a new block is allocated.
+ * Allocating from the bottom of the heap area will prevent fragmentation in the top of the heap area.
+ * Temporary block is mainly used for the memory area that is temporarily used. + * \sa criHeap_AllocFix(), criHeap_Free() + */ +void * CRIAPI criHeap_AllocTemporary(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + +/* DYNAMIC (unuse) */ +//void * CRIAPI criHeap_AllocDynamic(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align); + +void * CRIAPI criHeap_Alloc(CriHeap heap, CriSint32 size, const CriChar8 *name, CriSint32 align, CriSint32 type); + +/*==========================================================================* + * Free + *==========================================================================*/ +/*JP + * \brief メモリのフリー + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heapハンドル。 + * \param ptr アロケートしたメモリのポインタ。 + * \return フリーされたメモリサイズ。 + * \par 説明: + * アロケートされたメモリをフリーします。
+ * \code + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * criHeap_Free(heap, memptr); + * \endcode + * \sa criHeap_AllocFix(), criHeap_AllocTemporary() + */ +/*EN + * \brief Memory deallocation + * \ingroup CRIHEAP_ALLOC + * \param heap CRI Heap handle + * \param ptr The pointer to the allocated memory block + * \return Deallocated memory block size + * \par Description: + * This function deallocates the allocated memory block.
+ * \code + * void *memptr = criHeap_AllocFix(heap, 0x100, "forTexture1", 64); + * criHeap_Free(heap, memptr); + * \endcode + * \sa criHeap_AllocFix(), criHeap_AllocTemporary() + */ +CriSint32 CRIAPI criHeap_Free(CriHeap heap, void *ptr); + +/*==========================================================================* + * 排他制御用関数 + *==========================================================================*/ +CriSint32 CRIAPI criHeap_EnterCriticalSection(void); +CriSint32 CRIAPI criHeap_LeaveCriticalSection(void); + +/*==========================================================================* + * その他の関数 + *==========================================================================*/ +/* For only internal use */ +CriSint32 CRIAPI criHeap_SwitchAllocFunctions(CriHeap heap); + +/*==========================================================================* + * デバッグ関連 + *==========================================================================*/ +/*JP + * \brief ピークメモリサイズの取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \return 使用されたメモリの最大値。 + * \par 説明: + * 過去、使用されたメモリ量の最大値を返します。
+ * 最大値はcriHeap_DebugResetPeakMemorySize() でリセットすることが出来ます。 + * \sa criHeap_DebugResetPeakMemorySize() + */ +/*EN + * \brief Returns peak memory usage of the heap. + * \ingroup CRIHEAP_DEBUG + * \param heap The heap previously allocated by criHeap_Create(). + * \return The maximum number of bytes used by the heap. + * \par Description: + * The amount of memory used by these libraries is variable and depends + * on the number of simultaneous streams being read, the seek and error + * frequency within the stream being read, video resolution and other + * factors. This function allows you to tune the allocation of the heap + * to achieve a required performance level while allocating minimal + * heap space for this library. To get accurate readings, this function + * should typically be called just before criHeap_Destroy(), and after + * exercising all the video and audio functions in your program. + */ +CriSint32 CRIAPI criHeap_DebugGetPeakMemorySize(CriHeap heap); + +/*JP + * \brief ピークメモリサイズのリセット + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \par 説明: + * ピークメモリサイズをリセットします。 + * \sa criHeap_DebugGetPeakMemorySize() + */ +/*EN + * \brief Reset peak memory size + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap handle + * \par Description: + * The peak memory size is reset. + * \sa criHeap_DebugGetPeakMemorySize() + */ +void CRIAPI criHeap_DebugResetPeakMemorySize(CriHeap heap); + +/*JP + * \brief メモリブロック数の取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \return メモリブロック数。 + * \par 説明: + * アロケートされたメモリのブロック数を返します。
+ * CRI Heapハンドル生成直後は未使用のメモリブロックが1つ存在する状態 + * となります。また、フリーされた断片化されたメモリブロックもこの数に + * 含みます。 + * \sa criHeap_DebugGetUsedBlocks() + */ +/*EN + * \brief Get number of allocated memory blocks + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap handle + * \return Number of allocated memory blocks + * \par Description: + * The number of allocated memory blocks is returned.
+ * One unused memory block exists right after CRI Heap handle creation. + * The number of released fragmented memory blocks is also included. + * \sa criHeap_DebugGetUsedBlocks() + */ + CriSint32 CRIAPI criHeap_DebugGetNumBlocks(CriHeap heap); + +/*JP + * \brief 使用メモリブロック数の取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \return 使用メモリブロック数。 + * \par 説明: + * アロケートされているメモリブロックの数を返します。 + * \sa criHeap_DebugGetNumBlocks() + */ +/*EN + * \brief Get number of used memory blocks + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \return Number of used memory blocks + * \par Description: + * The number of used memory blocks is returned.
+ * \sa criHeap_DebugGetNumBlocks() + */ +CriSint32 CRIAPI criHeap_DebugGetUsedBlocks(CriHeap heap); + +/*JP + * \brief メモリブロック名の取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \param ptr アロケートしたメモリのポインタ。 + * \return メモリブロック名。 + * \par 説明: + * アロケート時に設定したメモリブロック名へのポインタを返します。
+ */ +/*EN + * \brief Get memory block name + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \param ptr A pointer to the allocated memory block + * \return Memory block name + * \par Description: + * The pointer to the memory block name specified on allocation is returned.
+ */ +CriChar8 * CRIAPI criHeap_DebugGetBlockName(CriHeap heap, void *ptr); + +/* メモリブロック番号の取得 */ +//CriSint32 CRIAPI criHeap_DebugGetBlockNumberFromPointer(CriHeap heap, void *ptr); + +/* メモリブロック情報の取得 */ +//void CRIAPI criHeap_DebugGetBlockInformation(CriHeap heap, +// CriSint32 blocknumber, CriHeapBlock *heapblock); + +/* メモリブロック情報の表示 */ +//void CRIAPI criHeap_DebugPrintBlockInformation(CriHeap heap, +// CriSint32 blocknumber, CriHeapBlock *heapblock); + +/*JP + * \brief メモリブロック情報の表示 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \par 説明: + * 現在のメモリブロック情報を表示します。
+ * printf関数などの標準出力に表示を行います。 + */ +/*EN + * \brief Print memory block information + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \par Description: + * The current memory block information is displayed.
+ * It is displayed on the standard output for the printf function. + */ + void CRIAPI criHeap_DebugPrintBlockInformationAll(CriHeap heap); + +/*JP + * \brief メモリアロケートサイズの取得 + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heapハンドル。 + * \par 説明: + * 現在のメモリアロケートサイズの合計値を返します。 + */ +/*EN + * \brief Get total allocation size + * \ingroup CRIHEAP_DEBUG + * \param heap CRI Heap + * \par Description: + * The total size of allocated memory blocks is returned. + */ +CriSint32 CRIAPI criHeap_DebugGetTotalAllocSize(CriHeap heap); + +/* フリーサイズの取得 */ +//CriSint32 CRIAPI criHeap_DebugGetTotalFreeSize(CriHeap heap); + +/* メモリアロケートサイズの取得(タイプ別) */ +CriSint32 CRIAPI criHeap_DebugGetAllocSize(CriHeap heap, CriSint32 type); + +/* ヒープヘッダサイズの取得 */ +CriSint64 CRIAPI criHeap_DebugGetHandleHeaderSize(CriHeap heap); + +/* メモリブロックヘッダサイズの取得 ptr: Allocated Pointer */ +CriSint64 CRIAPI criHeap_DebugGetMemBlockHeaderSize(void *ptr); + +/* 追加で必要となるサイズの最大値 */ +CriSint32 CRIAPI criHeap_DebugGetWorstExtraSize(CriSint32 alignment); + +/* criHeap_AllocFixでアロケート可能なサイズ */ +CriSint32 CRIAPI criHeap_DebugGetFixAllocatableSize(CriHeap heap, CriSint32 alignment); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#ifdef XPT_TGT_PC +#pragma pack(pop) +#endif + +#endif // _CRI_HEAP_H_INCLUDED + +/* end of file */ diff --git a/3rdParty/cri/pc/include/cri_movie.h b/3rdParty/cri/pc/include/cri_movie.h new file mode 100644 index 00000000..7dad4454 --- /dev/null +++ b/3rdParty/cri/pc/include/cri_movie.h @@ -0,0 +1,4402 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2006-2013 CRI Middleware Co., Ltd. + * + * Library : CRI Movie + * Module : Library User's Header + * File : cri_movie.h + * Date : 2013-11-27 + * Version : (see CRIMOVIE_VER) + * + ****************************************************************************/ +/*! + * \file cri_movie.h + */ +#ifndef CRI_MOVIE_H_INCLUDED /* Re-definition prevention */ +#define CRI_MOVIE_H_INCLUDED + +/* Version No. */ +#define CRIMOVIE_VER "3.50" +#define CRIMOVIE_NAME "CRI Movie" + +/*************************************************************************** + * Include file + ***************************************************************************/ +#include +#include +#include +#include +#include +#include + +/*************************************************************************** + * MACRO CONSTANT + ***************************************************************************/ +/*EN + * \brief Maximum length of a filename that can be opened by EasyPlayer + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetFile() + */ +/*JP + * \brief EasyPlayerに指定可能なファイル名の最大長さ + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetFile() + */ +#define CRIMV_MAX_FILE_NAME (256) + +/*EN + * \brief Default audio track setting used by AttachSubAudioInterface(), ReplaceCenterVoice() + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::ReplaceCenterVoice(), CriMvEasyPlayer::AttachSubAudioInterface() + */ +/*JP + * \brief サブオーディオ(またはセンターボイス)のデフォルト値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::ReplaceCenterVoice(), CriMvEasyPlayer::AttachSubAudioInterface() + */ +#define CRIMV_CENTER_VOICE_OFF (-1) + + +/*************************************************************************** + * Variable Declaration + ***************************************************************************/ +namespace CriMv { + extern CriError ErrorContainer; +} + +/*************************************************************************** + * Prototype Functions + ***************************************************************************/ +/*EN + * \brief CRI Movie Namespace + * \ingroup MDL_MV_BASIC + * \par + * Namespace for all CRI Movie methods, constants, and declarations + */ +/*JP + * \brief CRI Movie Namespace + * \ingroup MDL_MV_BASIC + * \par + * Namespace for all CRI Movie methods, constants, and declarations + */ +namespace CriMv { + + /*EN + * \brief Returns the version number and build information of CRI Movie + * \param none + * \return A string constant + * + * Returns the version number and build information of CRI Movie as a constant + * string, in the form + * + * "CRI Movie/{PLATFORM} {VERSION} Build:{BUILD DATE}" + */ + /*JP + * \brief CRI Movieのバージョン番号やビルド情報を返します。 + * \return ライブラリ情報文字列 + * + */ + const CriChar8* CRIAPI GetLibraryVersionString(void); + + /*EN + * \brief Initialize the CRI Movie library + * \param err Optional error code + * + * Does one-time initialization of the CRI Movie library.
+ * This function must be successfully called before calling CriMvEasyPlayer::Create().
+ *
+ * In general, all CRI Movie APIs are available after calling CriMv::Initialize(), + * until CriMv::Finalize() is called. However, there are some methods that set options + * for the library as a whole which must be called before CriMv::Initialize():
+ *
+ * It is safe to call CriMv::Initialize() more than once, as long as your application calls + * CriMv::Finalize() once for each call to CriMv::Initialize(). Multiple calls will not + * have an effect on the library, other than to increment or decrement an internal counter. + * + * \sa CriMv::Finalize() + */ + /*JP + * \brief CRI Movieライブラリの初期化 + * \param err エラー情報(省略可) + * + * CRI Movie ライブラリを初期化します。
+ * CriMvEasyPlayer::Create 関数よりも先に呼び出してください。
+ *
+ * 原則として全ての CRI Movie ライブラリ関数は初期化後、終了関数呼び出しまでの間にのみ使用します。
+ * ただし、いくつかの設定関数は初期化関数よりも先に呼び出す必要があるものがあります。 + * 詳細は各設定関数の説明を参照してください。 + *
+ * 初期化関数を複数回呼び出した場合、2回目以降の呼び出しでは呼び出し回数を記録するだけで再初期化は行いません。
+ * この場合、正しく終了処理を行うには同じ回数だけ終了関数を呼び出す必要があります。 + * 初期化関数と終了関数は必ず対で呼び出すように実装してください。
+ * + * \sa CriMv::Finalize() + */ + void CRIAPI Initialize(CriError &err = CriMv::ErrorContainer); + + /* MEMO: + * If an application calls this function instead of CriMv::Initialize(), + * an application need to call CriMv::SetupMovieHandleWork() before CriMv::InitializeMana(). + */ + void CRIAPI InitializeMana(CriError &err = CriMv::ErrorContainer); + + /*EN + * \brief Initialize 32bit ARGB frame conversion + * + * This function initializes 32bit ARGB frame conversion.
+ * When an application uses CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB(), + * please call this function after CriMv::Initialize().
+ * + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB() + */ + /*JP + * \brief 32bitARGB用フレーム変換の初期化 + * + * 32bitARGB用フレーム変換処理を初期化します。
+ * CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB() を使用する場合は CRI Movie ライブラリの + * 初期化後に必ず呼び出してください。
+ * + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB() + */ + void CRIAPI InitializeFrame32bitARGB(void); + +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_PC) || defined(XPT_TGT_TRGP6K) + void CRIAPI InitializeFrameRGB565(void); +#endif + + /*EN + * \brief De-initializes the CRI Movie library + * \param err Optional error code + * + * This function finalize whole CRI Movie library.
+ * An application needs to destroy all CriMvEasyPlayer handles and decoding threads before callign CriMv::Finalize().
+ *
+ * In principle, all CRI Movie library APIs are enabled after CriMv::Initialize() until CriMv::Finalize().
+ * But there are some APIs for parameter setting, which need to be called after CriMv::Finalize(). + * For details, refer to each explanations of setting APIs. + *
+ * \remarks + * CriMv::Finalize() must be called once for each call to CriMv::Initialize(). When the + * internal initialization count reaches 0, the library will be finalized. + * + * \sa CriMv::Initialize() + */ + /*JP + * \brief CRI Movieライブラリの終了 + * \param err エラー情報(省略可) + * + * CRI Movie ライブラリを終了します。
+ * この関数を呼び出す前に、全ての CriMvEasyPlayer ハンドルおよびデコードスレッドを破棄してください。
+ *
+ * 原則として全ての CRI Movie ライブラリ関数は初期化後、終了関数呼び出しまでの間にのみ使用します。
+ * ただし、いくつかの設定関数は終了関数よりも後に呼び出す必要があるものがあります。 + * 詳細は各設定関数の説明を参照してください。 + *
+ * 初期化関数を複数回呼び出した場合、正しく終了処理を行うには同じ回数だけ終了関数を呼び出す必要があります。 + * 初期化関数と終了関数は必ず対で呼び出すように実装してください。
+ * + * \sa CriMv::Initialize() + */ + void CRIAPI Finalize(CriError &err = CriMv::ErrorContainer); + +#if !defined(XPT_TGT_EE) + /*EN + * \brief Calculates the work buffer size needed for the given number of movie handles + * \param max_num Maximum number of movie handles desired + * \param err Optional error code + * \return The necessary work buffer size, in bytes + * + * Each active movie handle requires an internal work buffer. If your application + * needs to have multiple movies open at one time, it should determine how many handles + * it needs, allocate a buffer of the size returned by this function, and pass it to + * CriMv::SetupMovieHandleWork().
+ * + * Each CriMvEasy object uses a movie handle. Alpha movie playback uses two handles. + * If you need to play aplha movies, be sure to double the number of handles requested. + * + * \remarks + * The number of movie handles must be set before calling CriMv::Initialize(). + * + * \sa CriMv::SetupMovieHandleWork() + */ + /*JP + * \brief マルチハンドル用ワークバッファサイズの計算 + * \param max_num 最大ハンドル数(不透明ムービの再生時) + * \param err エラー情報(省略可) + * \return ワークサイズ + * + * 同時に使用する CriMvEasyPlayer ハンドルの最大数を増加させる場合に必要なワークバッファ + * サイズを計算します。 + * + * アルファムービを再生するとハンドル資源を2つ消費します。 + * もし複数のアルファムービ再生を行いたい場合は、最大ハンドル数は倍にして指定してください。 + * + * \sa CriMv::SetupMovieHandleWork() + */ + CriUint32 CRIAPI CalcMovieHandleWork(CriUint32 max_num, CriError &err = CriMv::ErrorContainer); + + /*EN + * \brief Increases the default number of available movie handles + * \param max_num Maximium number of movie handles + * \param workbuf Work buffer + * \param worksize Size of work buffer + * \param err Optional error code + * + * Call this function if your application needs to increase the maximum number of open movies + * beyond the default. Note that playing an alpha movie requires a second handle.
+ * + * The default number of movie handles depends on the platform.
+ * + * The work buffer must be allocated based on the size returned by CriMv::CalcMovieHandleWork().
+ * + * \remarks + * This function must be called before calling CriMv::Initialize(). + * + * \sa CriMv::CalcMovieHandleWork() + */ + /*JP + * \brief マルチハンドル用ワークバッファの設定 + * \param max_num 最大ハンドル数(不透明ムービの再生時) + * \param workbuf ワークバッファアドレス + * \param worksize ワークバッファサイズ + * \param err エラー情報(省略可) + * + * 同時に使用する CriMvEasyPlayer ハンドルの最大数を増加させるためのワークバッファを設定します。 + * なお、ワークバッファを指定しない場合のハンドル数上限は機種によって異なります。 + * + * ワークバッファの設定は、 CriMv::Initialize() の呼び出しに実行してください。 + * + * \sa CriMv::CalcMovieHandleWork() + */ + void CRIAPI SetupMovieHandleWork(CriUint32 max_num, void *workbuf, CriUint32 worksize, CriError &err = CriMv::ErrorContainer); + + /*EN + * \brief Get max number of movie handles + * \param err Optional error code + * \return Max number of movie handles you set by CriMv::SetupMovieHandleWork(). + * + * Returns the maximum number of movie handles that are available to CRI Movie.
+ * + * Note that this is not necessarily equal to the number of movies that can be + * opened at a time. In general, each movie will use one handle; however, + * alpha channel movies uses two handles. + * + * \sa CriMv::SetupMovieHandleWork(), CriMv::CalcMovieHandleWork() + */ + /*JP + * \brief 最大ハンドル数の取得 + * \param err エラー情報(省略可) + * \return CriMv::SetupMovieHandleWork() で設定した最大ハンドル数 + * + * CriMv::CalcMovieHandleWork() で最大ハンドル数を増加させた場合に、 + * 設定した最大ハンドル数を取得します。 + * + * \sa CriMv::SetupMovieHandleWork(), CriMv::CalcMovieHandleWork() + */ + CriUint32 CRIAPI GetMaxNumberOfHandles(CriError &err = CriMv::ErrorContainer); +#endif + + /* For Sofdec2 */ + CriSint32 CRIAPI CalcHandleWorkSize(CriMvHandleConfig *config, CriError &err = CriMv::ErrorContainer); + void CRIAPI SetDelayDestroySubmodules(CriBool sw); +} + +/*************************************************************************** + * CLASS + ***************************************************************************/ +/*EN + * \brief File Reading Interface Class for EasyPlayer + * \ingroup MDL_IF_READER + * \par + * You can implement your own streaming filesystem for movie playback by deriving + * from this class.
+ * + * Pass an instance of this subclass to CriMvEasyPlayer::Create().
+ * + * This class is designed for asynchronous operation. All functions are pure virtual. + * + * \sa CriMvEasyPlayer::Create() + */ +/*JP + * \brief ファイル読み込みインタフェース for EasyPlayer + * \ingroup MDL_IF_READER + * + * このクラスを定義することで、自前のファイルシステムを使ってEasyPlayerの + * ストリーミング再生が可能になります。
+ * 全ての関数は純粋仮想関数として定義されているので、全ての関数を必ず実装してください。 + * + * \sa CriMvEasyPlayer::Create() + */ +class CriMvFileReaderInterface +{ +public: + /*EN Status of an asynchronous operation */ + /*JP 非同期処理ステータス */ + enum AsyncStatus { + ASYNC_STATUS_STOP, /*EN< No action */ + /*JP< 何もしていない状態。*/ + ASYNC_STATUS_BUSY, /*EN< Currently processing */ + /*JP< 処理中 */ + ASYNC_STATUS_COMPLETE, /*EN< Processing completed */ + /*JP< 処理終了 */ + ASYNC_STATUS_ERROR, /*EN< An error occured */ + /*JP< エラー */ + + /* Keep enum 4bytes */ + ASYNC_STATUS_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + /*EN Offset values for Seek() */ + /*JP シーク開始位置 */ + enum SeekOrigin { + SEEK_FROM_BEGIN, /*EN< Start of file */ + /*JP< ファイル先頭 */ + SEEK_FROM_CURRENT, /*EN< Current position in file */ + /*JP< ファイルの現在位置 */ + SEEK_FROM_END, /*EN< End of file */ + /*JP< ファイル終端 */ + + /* Keep enum 4bytes */ + SEEK_FROM_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + /*EN + * \brief Opens a file asynchronously + * \param fname Name of file to open + * + * Initiates a file open request, and returns immediately. + * + * To determine success or failure, call CriMvFileReaderInterface::GetOpenStatus().
+ * + * \remarks + * CRI Movie may call CriMvFileReaderInterface::Read() and CriMvFileReaderInterface::Close() + * before CriMvFileReaderInterface::GetOpenStatus() returns ASYNC_STATUS_COMPLETE. + * + * \sa CriMvFileReaderInterface::GetOpenStatus() + */ + /*JP + * \brief ファイル名によるファイルオープン(即時復帰) + * \param fname ファイル名の文字列 + * + * ファイル名指定でファイルのオープン要求を出します。
+ * この関数は即時復帰の関数として呼び出されます。
+ * オープン処理が終わったかどうかは CriMvFileReaderInterface::GetOpenStatus関数 + * でチェックできるようにしてください。
+ * CRI Movie ライブラリはオープン処理が終わる(= CriMvFileReaderInterface::GetOpenStatus関数が + * ASYNC_STATUS_COMPLETEを返す)前に、リード、クローズの要求を呼び出す可能性があります。 + * + * \sa CriMvFileReaderInterface::GetOpenStatus() + */ + /* pure */ virtual void Open(CriChar8 *fname)=0; + + /*EN + * \brief Closes a file asynchronously + * + * Initiates a file close request, and returns immediately.
+ * + * To determine success or failure, call CriMvFileReaderInterface::GetCloseStatus().
+ * + * \sa CriMvFileReaderInterface::GetCloseStatus() + */ + /*JP + * \brief ファイルのクローズ(即時復帰) + * + * オープン済みのファイルのクローズ要求を出します。
+ * この関数は即時復帰の関数として呼び出されます。
+ * クローズ処理が終わったかどうかは CriMvFileReaderInterface::GetCloseStatus() + * でチェックできるようにしてください。 + * + * \sa CriMvFileReaderInterface::GetCloseStatus() + */ + /* pure */ virtual void Close(void)=0; + + /*EN + * \brief Reads from a file + * \param buffer Buffer to read into + * \param req_size Size of the buffer + * + * Initiates a file read request, and returns immediately.
+ * + * The buffer must be available and writable until the read request completes.
+ * + * To determine success or failure, call CriMvFileReaderInterface::GetReadStatus().
+ * + * To determine the number of bytes actually read, call CriMvFileReaderInterface::GetReadSize() + * after CriMvFileReaderInterface::GetReadStatus() has returned ASYNC_STATUS_COMPLETE. + * + * \remarks + * CRI Movie may call CriMvFileReaderInterface::Close() before + * CriMvFileReaderInterface::GetReadStatus() returns ASYNC_STATUS_COMPLETE. + * + * \sa CriMvFileReaderInterface::GetReadStatus(), CriMvFileReaderInterface::GetReadSize() + */ + /*JP + * \brief 読み込み要求(即時復帰) + * \param buffer 書き出しバッファのポインタ。読み込み要求サイズを満たすだけのバッファを確保しておく必要があります。 + * \param req_size 読み込み要求サイズ。単位はバイト単位です。 + * + * ファイルの読み込み要求を出します。
+ * この関数は即時復帰の関数として呼び出されます。
+ * リード処理が終わったかどうかは CriMvFileReaderInterface::GetReadStatus() + * でチェックできるようにしてください。
+ * CRI Movie ライブラリはリード処理が終わる(= CriMvFileReaderInterface::GetReadStatus()が + * ASYNC_STATUS_COMPLETEを返す)前に、クローズ要求を呼び出す可能性があります。
+ * この関数は読み込んだサイズを返しません。
+ * 読み込み済みサイズは、 CriMvFileReaderInterface::GetReadStatus()が ASYNC_STATUS_COMPLETEを + * 返したあとに CriMvFileReaderInterface::GetReadSize()で返すように実装してください。 + * + * \sa CriMvFileReaderInterface::GetReadStatus(), CriMvFileReaderInterface::GetReadSize() + */ + /* pure */ virtual void Read(CriUint8 *buffer, CriSint64 req_size)=0; + + /*EN + * \brief Gets asynchronous status of a call to CriMvFileReaderInterface::Open() + * + * \return Status of the call + * + * While the Open() call is in process, this will return ASYNC_STATUS_BUSY.
+ * If the call fails, this will return ASYNC_STATUS_ERROR.
+ * On success, this will return ASYNC_STATUS_COMPLETE.
+ * + * \sa CriMvFileReaderInterface::Open() + */ + /*JP + * \brief オープンコマンドの状態取得 + * \return オープンコマンドの処理状態。 + * + * CriMvFileReaderInterface::Open関数の処理状態を取得します。 + * + * \sa CriMvFileReaderInterface::Open() + */ + /* pure */ virtual CriMvFileReaderInterface::AsyncStatus GetOpenStatus(void)=0; + + /*EN + * \brief Gets asynchronous status of a call to CriMvFileReaderInterface::Close() + * + * \return Status of the call + * + * While the Close() call is in process, this will return ASYNC_STATUS_BUSY.
+ * If the call fails, this will return ASYNC_STATUS_ERROR.
+ * On success, this will return ASYNC_STATUS_COMPLETE.
+ * + * \sa CriMvFileReaderInterface::Close() + */ + /*JP + * \brief クローズコマンドの状態取得 + * \return クローズコマンドの処理状態。 + * + * CriMvFileReaderInterface::Close関数の処理状態を取得します。 + * + * \sa CriMvFileReaderInterface::Close() + */ + /* pure */ virtual CriMvFileReaderInterface::AsyncStatus GetCloseStatus(void)=0; + + /*EN + * \brief Gets asynchronous status of a call to CriMvFileReaderInterface::Read() + * + * \return Status of the call + * + * While the Read() call is in process, this will return ASYNC_STATUS_BUSY.
+ * If the call fails, this will return ASYNC_STATUS_ERROR.
+ * On success, this will return ASYNC_STATUS_COMPLETE.
+ * + * \sa CriMvFileReaderInterface::Read() + */ + /*JP + * \brief リードコマンドの状態取得 + * \return リードコマンドの処理状態。 + * + * CriMvFileReaderInterface::Read関数の処理状態を取得します。 + * + * \sa CriMvFileReaderInterface::Read() + */ + /* pure */ virtual CriMvFileReaderInterface::AsyncStatus GetReadStatus(void)=0; + + /*EN + * \brief Gets the number of bytes read by a successful call to CriMvFileReaderInterface::Read() + * + * \return Number of bytes read + * + * Once CriMvFileReaderInterface::GetReadStatus() returns ASYNC_STATUS_COMPLETE, this + * function can be called to determine the number of bytes read by + * CriMvFileReaderInterface::Read().
+ * + * If no call to Read() has been made, this function will return 0.
+ * + * If called multiple times after completing the read, the same value will be returned each time. + * + * \sa CriMvFileReaderInterface::Read(), CriMvFileReaderInterface::GetReadStatus() + */ + /*JP + * \brief 前回読み込み要求に対する読み込み完了サイズ + * \return 読み込み完了サイズ。単位はByte。 + * + * 前回の読み込み要求に対して読み込み完了したサイズを返します。 + * まだ読み込みが1度も要求されていない場合は0を返します。 + * 読み込み完了後に繰り返しこの関数が呼び出された場合は、すべて同じ値を返します。 + * + * \sa CriMvFileReaderInterface::Read(), CriMvFileReaderInterface::GetReadStatus() + */ + /* pure */ virtual CriSint64 GetReadSize(void)=0; + + /*EN + * \brief Seeks to a new position in the file + * + * \param size Number of bytes to seek relative to \a offset + * \param offset Starting position of seek + * \return The offset, in bytes, from the previous file position. + * + * If \a offset is SEEK_FROM_BEGIN, seeking will start from the beginning of the file.
+ * If \a offset is SEEK_FROM_CURRENT, seeking will start from the current file position.
+ * If \a offset is SEEK_FROM_END, seeking will start from the end of the file.
+ * + * \sa CriMvFileReaderInterface::SeekOrigin + */ + /*JP + * \brief シーク + * \param size シークサイズ + * \param offset シークの開始位置 + * \return 実際にシークした距離。Byte単位。 + * + * \sa CriMvFileReaderInterface::SeekOrigin + * + */ + /* pure */ virtual CriSint64 Seek(CriSint64 size, CriMvFileReaderInterface::SeekOrigin offset)=0; + + /*EN + * \brief Gets the file size + * + * \return File size, in bytes + * + * This function can safely be called once CriMvFileReaderInterface::Open() has completed + * successfully. + * + * \sa CriMvFileReaderInterface::Open(), CriMvFileReaderInterface::GetOpenStatus() + */ + /*JP + * \brief ファイルサイズの取得 + * \return ファイルサイズ[byte]. + * + * この関数はファイルオープンの終了後に呼び出されます。 + * + * \sa CriMvFileReaderInterface::Open(), CriMvFileReaderInterface::GetOpenStatus() + */ + /* pure */ virtual CriSint64 GetFileSize(void)=0; + +protected: + virtual ~CriMvFileReaderInterface(void) {} +}; + +/*EN + * \brief Sound Interface Class for EasyPlayer + * \ingroup MDL_IF_SOUND + * + * \par + * A class derived from CriMvSoundInterface is required in order to play sound in CRI Movie. + * Pass an instance of this subclass to CriMvEasyPlayer::Create().
+ * + * If you do not need audio output, you can pass NULL instead. However, if you do, + * you can not use a movie timer of type MVEASY_TIMER_AUDIO. See CriMvEasyPlayer::SetMasterTimer() + * for more details.
+ * + * Sound data must be provided in either 32 or 16 bit PCM format. + * + * All functions are pure virtual. + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::SetMasterTimer(), CriMvEasyPlayer::TimerType + */ +/*JP + * \brief サウンド出力インタフェース + * \ingroup MDL_IF_SOUND + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::SetMasterTimer(), CriMvEasyPlayer::TimerType + */ +class CriMvSoundInterface +{ +public: + /*EN + * \brief The status of the Sound Module + * + * This is the return value of CriMvSoundInterface::GetStatus().
+ * + * After CriMvSoundInterface::Start() is called, the state transitions to MVEASY_SOUND_STATUS_EXEC.
+ * While the state is MVEASY_SOUND_STATUS_EXEC, the sound module calls the callback function + * to retrieve sound data as needed.
+ * When the EasyPlayer is stopped, or transits to MVEASY_STATUS_PLAYEND, + * CRI Movie will call CriMvSoundInterface::Stop(). Then, CRI Movie waits for + * CriMvSoundInterface::GetStatus() to return MVEASY_SOUND_STATUS_STOP, + * and calls CriMvSoundInterface::DestroyOutput(). + * + * \sa CriMvSoundInterface::GetStatus(), CriMvSoundInterface::Start(), + * CriMvSoundInterface::Stop(), CriMvSoundInterface::DestroyOutput() + */ + /*JP + * \brief サウンドモジュールの状態 + * + * サウンドモジュールの状態を表す列挙型です。
+ * CriMvEasyPlayer::GetStatus() の関数値です。
+ * CriMvSoundInterface::Start() が呼び出されるとMVEASY_SOUND_STATUS_EXEC状態になります。
+ * MVEASY_SOUND_STATUS_EXEC状態の間は、サウンド出力モジュールはコールバック関数を呼び出します。
+ * CRI Movie ライブラリは再生終了または再生停止指示を受けた場合、まず CriMvSoundInterface::Stop()を呼び出します。
+ * その後、STOP状態になるのを待ってから CriMvSoundInterface::DestroyOutput()を呼び出します。 + * + * \sa CriMvSoundInterface::GetStatus(), CriMvSoundInterface::Start(), + * CriMvSoundInterface::Stop(), CriMvSoundInterface::DestroyOutput() + */ + enum Status { + MVEASY_SOUND_STATUS_STOP, /*EN< No sound processing is happening. */ + /*JP< CRI Movie のサウンド出力をしていない状態 */ + MVEASY_SOUND_STATUS_EXEC, /*EN< Sound data is being retrieved and processed. */ + /*JP< CRI Movie のサウンド出力中 */ + MVEASY_SOUND_STATUS_ERROR, /*EN< An error has occurred. */ + /*JP< エラー状態 */ + + /* Keep enum 4bytes */ + MVEASY_SOUND_STATUS_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /*EN + * \brief PCM audio data format + * + * CRI Movie only operates on PCM encoded data. Two formats are supported: 32 bit floating + * point values, and 16 bit integer values. + * + * Return one of these values from CriMvSoundInterface::GetPcmFormat(). + * According to the returned format, CRI Movie calls a SetCallback for the specified PCM format. + * + * \sa CriMvSoundInterface::GetPcmFormat(), CriMvSoundInterface::SetCallbackGetFloat32PcmData(), + * CriMvSoundInterface::SetCallbackGetSint16PcmData() + */ + /*JP + * \brief PCMデータフォーマット + * + * PCMの出力フォーマットはPcmFormat型で定義されたいずれかでなければいけません。
+ * EasyPlayerは CriMvSoundInterface::GetPcmFormat()で取得できるデータ型のみ使用します。
+ * アプリケーションはこのクラスの全ての関数を実装しなければいけないので、使わないフォーマット + * のコールバック登録関数はカラ関数として実装してください。 + * + * \sa CriMvSoundInterface::GetPcmFormat(), CriMvSoundInterface::SetCallbackGetFloat32PcmData(), + * CriMvSoundInterface::SetCallbackGetSint16PcmData() + */ + enum PcmFormat { + MVEASY_PCM_FLOAT32, /*EN< PCM data is in 32 bit floating point format. */ + /*JP< 32bit 浮動小数型のPCMフォーマット */ + MVEASY_PCM_SINT16, /*EN< PCM data is in 16 bit integer format. */ + /*JP< 16bit 整数型のPCMフォーマット */ + + /* Keep enum 4bytes */ + MVEASY_PCM_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /*EN + * \brief Creates a sound output module + * \param heap Handle to a CriHeap object + * \param channel Number of sound channels (1 = monaural, 2 = stereo, 6 = 5.1ch) + * \param samplerate Sample rate of audio data (ex. 48000 = 48k) + * \return TRUE if the sound module was created successfully + * \return FALSE if there was an error + * + * Creates a CRI Movie sound output module and prepares it for use. Memory for the module + * is taken from the provided CriHeap object.
+ * + * CRI Movie calls this method once it has determined that a movie has an active audio track + * and has analyzed the number of channels (mono, stereo, 5.1ch, etc.) and the sample rate. + * + */ + /*JP + * \brief サウンド出力の作成 + * \param heap メモリハンドル + * \param channel 出力するサウンドのチャネル数 (1=monaural, 2=stereo, 6=5.1ch) + * \param samplerate サンプリングレート (ex. 48k = 48000) + * \return 作成結果。成功の場合はTRUE、失敗の場合はFALSEが返ります。 + * + * サウンド出力を作成します。
+ * この関数は CRI Movie が再生するサウンドが決定したあとに、そのサウンドのチャネル数や + * サンプリングレートを引数として実行されます。 + * + */ + /* pure */ virtual CriBool CreateOutput(CriHeap heap, CriUint32 channel, CriUint32 samplerate)=0; + + /*EN + * \brief Destroys the sound output module + * + * Deletes the sound output module that was created by + * CriMvSoundInterface::CreateOutput().
+ * + * CRI Movie calls this method once CriMvSoundInterface::GetStatus() returns MVEASY_SOUND_STATUS_STOP. + * + */ + /*JP + * \brief サウンド出力の破棄 + * + * サウンド出力を破棄します。
+ * この関数はサウンド出力が MVEASY_SOUND_STATUS_STOP 状態になった後に呼び出されます。 + * + */ + /* pure */ virtual void DestroyOutput(void)=0; + + /*EN + * \brief Gets the PCM format of audio data + * \return The type of PCM format supported by this CriMvSoundInterface instance + * + * CRI Movie supports audio data in one of two PCM formats: 32 bit floating point (MVEASY_PCM_FLOAT32) + * or 16 bit integer (MVEASY_PCM_SINT16). EasyPlayer uses the return value from this method to + * determine which format is being used, and will call the appropriate callback function to retrieve + * data samples. + * + * \sa CriMvSoundInterface::PcmFormat + */ + /*JP + * \brief PCMデータフォーマットの取得 + * \return CriMvSoundInterface が使用するPCMフォーマットを返します。 + * + * EasyPlayerはこの関数によって、出力するPCMフォーマットを判断します。 + * + * \sa CriMvSoundInterface::PcmFormat + */ + /* pure */ virtual PcmFormat GetPcmFormat(void)=0; + + /*EN + * \brief Sets the callback function for retrieving 32 bit floating point PCM sound samples + * \param func Function that is called when CriMvSoundInterface gets PCM data (32bit float) + * \param obj Pointer to user-specifed data, passed as the first argument to the callback + * + * Sets a function that CriMvSoundInterface will call when it needs audio data in 32 bit floating point + * PCM format. This callback function takes 4 arguments:
+ * + * - \a obj: The user-specified \a obj parameter passed to SetCallbackGetFloat32PcmData().
+ * - \a nch: The number of audio channels. Mono is 1, stereo is 2, 5.1 channel is 6.
+ * - \a pcmbuf: An array of buffers to hold the returned PCM data. There must be one element of + * this array for each channel.
+ * - \a req_nsmpl: The number of samples requested. Each buffer must be large enough to hold this + * many samples (i.e. \a nch * \a req_nsmpl). + * + * \remarks + * The maximum number of channels is CRIMV_PCM_BUFFER_MAX + * + * \sa CriMvSoundInterface::SetCallbackGetSint16PcmData() + */ + /*JP + * \brief 32bit形式でPCMデータを取得するコールバック関数の登録 + * \param func CriMvSoundInterface がPCMデータを要求する際に呼びだすコールバック関数 + * \param obj コールバック関数を実行する際に第一引数に指定するオブジェクト変数 + * + * CriMvSoundInterface がEasyPlayerにPCMデータを要求する際に呼び出すコールバック関数を登録します。 + * コールバック関数は4つの引数を持っています。
+ * - "obj" はコールバック関数内で使用するオブジェクトです。 + * コールバック関数を呼び出す際は、関数登録時に指定されたobjを必ずこの引数に入れてください。
+ * - "nch" は CriMvSoundInterface が要求するオーディオのチャネル数です。モノラルなら1。ステレオなら2。5.1chなら6となります。
+ * - "pcmbuf" はPCMデータを格納するためのバッファポインタ配列です。
+ * バッファの実体は CriMvSoundInterface で準備してください。バッファの数は"nch"と同じでなければいけません。
+ * - "req_nsmpl" は CriMvSoundInterface が要求するPCMデータの最大サンプル数です。
+ * "pcmbuf"で指定した各バッファ実体には、このサンプル数が書き込まれても大丈夫なだけの領域を必ず準備してください。
+ * + * 登録されたコールバック関数を呼び出すタイミングは CriMvSoundInterface の任意となります。 + * + * \sa CriMvSoundInterface::SetCallbackGetSint16PcmData() + */ + /* pure */ virtual void SetCallbackGetFloat32PcmData(CriUint32 (*func)(void *obj, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl), void *obj)=0; + + /*EN + * \brief Sets the callback function for retrieving 16 bit integer PCM sound samples + * \param func Function that will be called when 16 bit integer PCM data is needed + * \param obj Pointer to user-specifed data, passed as the first argument to the callback + * + * Sets a function that CriMvSoundInterface will call when it needs audio data in 16 bit integer + * PCM format. This callback function takes 4 arguments:
+ * + * - \a obj: The user-specified \a obj parameter passed to SetCallbackGetSint16PcmData().
+ * - \a nch: The number of audio channels. Mono is 1, stereo is 2, 5.1 channel is 6.
+ * - \a pcmbuf: An array of buffers to hold the returned PCM data. There must be one element of + * this array for each channel.
+ * - \a req_nsmpl: The number of samples requested. Each buffer must be large enough to hold this + * many samples (i.e. \a nch * \a req_nsmpl). + * + * \remarks + * The maximum number of channels is CRIMV_PCM_BUFFER_MAX (currently 8) + * + * \sa CriMvSoundInterface::SetCallbackGetFloat32PcmData() + */ + /*JP + * \brief 16bit形式でPCMデータを取得するコールバック関数の登録 + * \param func CriMvSoundInterface がPCMデータを要求する際に呼びだすコールバック関数 + * \param obj コールバック関数を実行する際に第一引数に指定するオブジェクト変数 + * + * PCMフォーマットが違う以外は、 CriMvSoundInterface::SetCallbackGetFloat32PcmData() と同じです。 + * + * \sa CriMvSoundInterface::SetCallbackGetFloat32PcmData() + */ + /* pure */ virtual void SetCallbackGetSint16PcmData(CriUint32 (*func)(void *obj, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl), void *obj)=0; + + /*EN + * \brief Starts sound output + * + * CRI Movie will call this method when it needs to start playing sound. The PCM data callback function + * has to be called after this function until movie playback is finished.
+ * + * Your sound module should begin incrementing its playback time when this method is called. + * + * \remarks + * On success, this should set the status to CriMvSoundInterface::MVEASY_SOUND_STATUS_EXEC. + */ + /*JP + * \brief サウンド出力の開始 + * + * サウンド出力を開始します。PCMデータ取得用コールバック関数は、本関数の呼出し後から実行してください。 + */ + /* pure */ virtual void Start(void)=0; + + /*EN + * \brief Stops sound output + * + * CRI Movie will call this when the movie playback stops, or the status changes to MVEASY_STATUS_PLAYEND.
+ * + * When EasyPlayer wants to pause and restart playback, it will call CriMvSoundInterface::Pause() + * instead of this method.
+ * + * Your sound module should set its playback time to 0 when this method is called. + * + * \remarks + * This should set the status to CriMvSoundInterface::MVEASY_SOUND_STATUS_STOP. + * + * \sa CriMvSoundInterface::Pause(), CriMvSoundInterface::Start() + */ + /*JP + * \brief サウンド出力の停止 + * + * サウンド出力を停止します。再開できるようにする必要はありません。
+ * EasyPlayerが再開処理を行いたい場合は、本関数ではなく、 CriMvSoundInterface::Pause()を呼び出します。
+ * CriMvSoundInterface::Stop() 呼出し後は、コルーバック関数を呼ばないように実装してください。 + * + * \sa CriMvSoundInterface::Pause(), CriMvSoundInterface::Stop() + */ + /* pure */ virtual void Stop(void)=0; + + /*EN + * \brief Gets status of sound module + * \return The module status + * + * This must return one of the enumerated values in CriMvSoundInterface::Status.
+ * + * While this method returns CriMvSoundInterface::MVEASY_SOUND_STATUS_EXEC, EasyPlayer will call the + * PCM data callback.
+ * When a movie has finished playing and this method returns CriMvSoundInterface::MVEASY_SOUND_STATUS_STOP, + * EasyPlayer will call CriMvSoundInterface::DestroyOutput(). + * + * \sa CriMvSoundInterface::Status + */ + /*JP + * \brief サウンドモジュールの状態取得 + * + * サウンドモジュールの状態を取得します。 + * + * \sa CriMvSoundInterface::Status + */ + /* pure */ virtual Status GetStatus(void)=0; + + /*EN + * \brief Pauses or resumes sound output + * \param sw Pause or resume playback. + * + * If \a sw is 1 (ON), output will be paused.
+ * If \a sw is 0 (OFF), output will be resumed.
+ * + * Temporarily pauses or resumes sound output.
+ * + * When you pause sound output, you must pause your playback timer as well. + */ + /*JP + * \brief サウンド出力の一時停止または再開 + * \param sw ポーズスイッチ。ポーズONの場合は1、ポーズOFF(レジューム)の場合は0を指定します。 + * + * 本関数の動作は引数に依存します。
+ * 引数 sw がON(1)なら、一時停止。引数 sw がOFF(0)ならサウンド出力再開です。 + */ + /* pure */ virtual void Pause(CriBool sw)=0; + + /*EN + * \brief Gets the time, in seconds, that sound has been playing + * \param count Playback time counter + * \param unit Counter increment per second + * + * CRI Movie calls this method periodically for some damn reason.
+ *
+ * The time, in seconds, is specified by \a count / \a unit.
+ * + * For example, if \a count was 500 and \a unit was 1000, that would be 0.5 seconds.
+ * + * \remarks + * Before Start() is called, and after Stop() is called, \a count should be 0. + */ + /*JP + * \brief 再生時刻の取得 + * \param count タイマカウント + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * + * タイマ時刻を取得します。時刻はcountとunitの二つの変数で表現します。
+ * count ÷ unit で秒単位の時刻となるような値を返します。
+ * 再生開始前( CriMvSoundInterface::Start()呼び出し前)および + * 再生停止後( CriMvSoundInterface::Stop()呼び出し後)は、時刻0(タイマカウントが0)を返します。 + */ + /* pure */ virtual void GetTime(CriUint64 &count, CriUint64 &unit)=0; // sec = count / unit. + +protected: + virtual ~CriMvSoundInterface(void) {} +}; + +/*EN + * \brief System Timer Interface Class for EasyPlayer + * \ingroup MDL_IF_TIMER + * + * If you want to synchronize video frames with something other than the audio track, or if you + * need to play a movie that does not have an audio track, you will need to pass an instance of + * a class derived from CriMvSystemTimerInterface to CriMvEasyPlayer::Create().
+ * + * If you do not need any special timer facilities, you can pass NULL to CriMvEasyPlayer::Create() instead.
+ * + * All functions are pure virtual. + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::SyncMasterTimer() + */ +/*JP + * \brief システムタイマーインタフェース for EasyPlayer + * \ingroup MDL_IF_TIMER + * + * システムタイマーは音無しムービ再生時に、ビデオフレームの送出タイミングを調整するために使用されます。
+ * このクラスを定義することで、自前のタイマシステムを使ってEasyPlayerのストリーミング再生が可能になります。
+ * 全ての関数は純粋仮想関数として定義されているので、全ての関数を必ず実装してください。 + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::SyncMasterTimer() + */ +class CriMvSystemTimerInterface +{ +public: + /*EN + * \brief Starts timer and resets it to 0 + * + * When this method is called, your internal counter should initialize itself to 0 and start + * normal operation. + */ + /*JP + * \brief タイマ開始 + * + * タイマのカウントを開始します。この関数が呼ばれた時が時刻0となります。 + */ + /* pure */ virtual void Start(void)=0; + + /*EN + * \brief Stops the timer and resets it to 0 + * + * When this method is called, your internal counter should stop incrementing, and re-initialize + * itself to 0. After this method has been called, CriMvSystemTimerInterface::GetTime() must + * return a time of 0 seconds. + */ + /*JP + * \brief タイマ停止 + * + * タイマのカウントを停止します。この関数が呼ばれたあとに、そのタイマを再開することはありません。 + */ + /* pure */ virtual void Stop(void)=0; + + /*EN + * \brief Pauses or resumes the timer + * + * \param sw Pause or resume timer operation. + * + * If \a sw is 1 (ON), the timer will be paused.
+ * If \a sw is 0 (OFF), the timer will be resumed.
+ * + * Temporarily pauses or resumes the timer.
+ * + * When you pause the timer, you must maintain the previous value of the counter. + */ + /*JP + * \brief タイマの一時停止または再開 + * \param sw ポーズスイッチ。ON(1)なら一時停止、OFF(0)なら再開。 + * + * 本関数の動作は引数に依存します。
+ * 引数 sw がON(1)なら、一時停止。引数 sw がOFF(0)ならタイマカウント再開です。 + */ + /* pure */ virtual void Pause(CriBool sw)=0; + + /*EN + * \brief Gets the time, in seconds, that the timer has been running + * + * \param count Timer counter + * \param unit Counter increment per second + * + * CRI Movie calls this method periodically to synchronize video playback with the + * movie's internal framerate.
+ *
+ * The time, in seconds, is specified by \a count / \a unit.
+ * + * For example, if \a count was 500 and \a unit was 1000, that would be 0.5 seconds.
+ * + * \remarks + * Before Start() is called, and after Stop() is called, \a count should be 0. + */ + /*JP + * \brief 経過時刻の取得 + * \param count タイマカウント + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * + * タイマ時刻を取得します。時刻はcountとunitの二つの変数で表現します。
+ * count ÷ unit で秒単位の時刻となるような値を返します。
+ * 再生開始前( CriMvSystemTimerInterface::Start()呼び出し前)および + * 再生停止後( CriMvSystemTimerInterface::Stop()呼び出し後)は、時刻0(タイマカウントが0)を返します。 + */ + /* pure */ virtual void GetTime(CriUint64 &count, CriUint64 &unit)=0; + +protected: + virtual ~CriMvSystemTimerInterface(void) {} +}; + + +/*EN + * \brief EasyPlayer Interface class for CRI Movie + * \ingroup MDL_EASY_PLAYER + */ +/*JP + * \brief EasyPlayerインタフェース + * \ingroup MDL_EASY_PLAYER + */ +class CriMvEasyPlayer : public CriAllocator +{ +public: + /*EN + * \brief The possible states an EasyPlayer handle can be in. + * + * An EasyPlayer handle takes on various states, depending on where it is in the decoding process. + * You can check the status of a valid EasyPlayer handle at any time by calling CriMvEasyPlayer::GetStatus(). + * + * An EasyPlayer handle is created in the MVEASY_STATUS_STOP state. During movie playback, the status + * transitions through various states from MVEASY_STATUS_STOP to MVEASY_STATUS_PLAYEND. + * + * An application does not need to check all states. At a minimum, it only needs to check for + * MVEASY_STATUS_STOP, MVEASY_STATUS_PLAYING, MVEASY_STATUS_PLAYEND, + * and MVEASY_STATUS_ERROR. + * + * If an application calls CriMvEasyPlayer::DecodeHeader(), the status of the EasyPlayer handle will change to + * MVEASY_STATUS_WAIT_PREP when CRI Movie has finished analyzing the movie information. The EasyPlayer + * handle will remain in this state until the application calls CriMvEasyPlayer::Prepare() or + * CriMvEasyPlayer::Start(). Once the state has changed to MVEASY_STATUS_WAIT_PREP, information + * about the movie can be retrieved by calling CriMvEasyPlayer::GetMovieInfo(). + * + * If an application calls CriMvEasyPlayer::Prepare(), the EasyPlayer handle status will change to + * MVEASY_STATUS_READY once CRI Movie has finished buffering enough input and decoded output for playback. + * The handle will remain in this state until CriMvEasyPlayer::Start() is called. This allows the application + * to better control playback timing, since a movie can immediately start playing. + * + * Once CriMvEasyPlayer::Start() is called and the movie is actively playing, the status will alternate + * between MVEASY_STATUS_PLAYING and MVEASY_STATUS_PREP, as CRI Movie plays back frames and decodes + * new ones. + * + * When the movie has finished playing normally, the status of the EasyPlayer handle will automatically change + * to MVEASY_STATUS_PLAYEND. If the movie is in looping mode, however, once the movie reaches the + * end, it will start playing from the beginning and the status will not change to MVEASY_STATUS_PLAYEND. + * + * When CriMvEasyPlayer::Stop() is called, the status of the handle will change to MVEASY_STATUS_STOP + * once it has finished any decoding and playback that is in progress. This does not happen immediately, + * but will take a few cycles. + * + * If there are any problems during playback, for instance insufficient memory or invalid input data, the + * status will change to MVEASY_STATUS_ERROR. When the handle is in state MVEASY_STATUS_ERROR, + * the application must call CriMvEasyPlayer::Stop() and wait until the state changes to MVEASY_STATUS_STOP + * before doing anything else with the handle. + * + * Once the state is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, the handle can be deleted by + * calling CriMvEasyPlayer::Destroy(). + * + * \attention + * As of CRI Movie version 2.00, the handling of the MVEASY_STATUS_ERROR state has changed. Previously, + * a handle could be destroyed when it was in the MVEASY_STATUS_ERROR state. Now, an application + * must call CriMvEasyPlayer::Stop() and wait for the MVEASY_STATUS_STOP state before destroying + * the handle. + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::Start(), CriMvEasyPlayer::DecodeHeader(), + * CriMvEasyPlayer::Prepare(), CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::Stop(), + * CriMvEasyPlayer::Destroy() + */ + /*JP + * \brief EasyPlayerハンドル状態 + * + * EasyPlayer のハンドル状態です。 + * ハンドル状態は CriMvEasyPlayer::GetStatus() でいつでも取得することが出来ます。
+ * ハンドル作成直後は MVEASY_STATUS_STOP 状態です。 + * + * ハンドル状態は MVEASY_STATUS_STOP から MVEASY_STATUS_PLAYEND まで順に遷移していきます。
+ * アプリケーションがムービを再生するにあたって、必ずしもこの全ての状態をチェックする必要はありません。
+ * 最低限、MVEASY_STATUS_STOP, MVEASY_STATUS_PLAYING, MVEASY_STATUS_PLAYEND, MVEASY_STATUS_ERROR さえ + * チェックすれば、ムービの再生を行うことができます。 + * + * EasyPlayer ハンドル作成後、ムービの解像度などが既に確定している場合は、アプリケーションは + * CriMvEasyPlayer::Start() を直接呼び出すことができます。この場合、ハンドル状態は自動的に + * MVEASY_STATUS_PLAYEND まで遷移していきます。 + * + * 最初に CriMvEasyPlayer::DecodeHeader() を呼び出した場合は、ヘッダ解析が終了するとハンドル状態は + * MVEASY_STATUS_WAIT_PREP となり、アプリケーションから CriMvEasyPlayer::Prepare() または + * CriMvEasyPlayer::Start() が呼ばれるまで待機します。 + * + * MVEASY_STATUS_WAIT_PREP状態以降、 CriMvEasyPlayer::GetMovieInfo() でムービ情報を取得することができます。
+ * CriMvEasyPlayer::Prepare() を呼び出した場合は、ヘッダ解析およびデータのバッファリングが終わると、 + * ハンドル状態は MVEASY_STATUS_READY となり、アプリケーションから CriMvEasyPlayer::Start() が + * 呼ばれるまで待機します。これによって再生開始のタイミングを調整することができます。 + * + * 再生が終了すると自動的に MVEASY_STATUS_PLAYEND になります。 + * + * CriMvEasyPlayer::Stop() を呼び出した場合は、デコーダの停止処理が終わったあとに MVEASY_STATUS_STOP + * 状態になります。 CriMvEasyPlayer::Stop() 終了直後に停止状態になるとは限りません。 + * + * メモリ不足やデータエラーなど何らかの問題が発生した場合は MVEASY_STATUS_ERROR 状態となります。
+ * MVEASY_STATUS_ERROR 状態になった場合は CriMvEasyPlayer::Stop() を呼び出してハンドル状態が + * MVEASY_STATUS_STOP 状態に遷移させてください。
+ * + * CriMvEasyPlayer::Destroy() は MVEASY_STATUS_STOP, MVEASY_STATUS_PLAYEND の + * いずれかの状態の時のみ呼び出すことができます。 + * + * \attention + * CRI Movie Ver.2.00 で MVEASY_STATUS_ERROR 状態についての仕様が変更になりました。
+ * MVEASY_STATUS_ERROR 状態でハンドル破棄が出来なくなり、 CriMvEasyPlay::Stop() を呼び出す必要があります。 + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::Start(), CriMvEasyPlayer::DecodeHeader(), + * CriMvEasyPlayer::Prepare(), CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::Stop(), + * CriMvEasyPlayer::Destroy() + */ + enum Status { + MVEASY_STATUS_STOP, /*EN< Standstill. No processing is happening. + * EasyPlayer handles are created in this state. */ + /*JP< 停止中 */ + MVEASY_STATUS_DECHDR, /*EN< The EasyPlayer handle is now parsing the movie header, + * including information about the width and height of the video stream. */ + /*JP< ヘッダ解析中 */ + MVEASY_STATUS_WAIT_PREP, /*EN< The EasyPlayer handle is a waiting for the work buffer to be allocated. */ + /*JP< バッファリング開始待機中 */ + MVEASY_STATUS_PREP, /*EN< The EasyPlayer handle is now buffering video and audio data. */ + /*JP< 再生準備中 */ + MVEASY_STATUS_READY, /*EN< Ready to start playback. */ + /*JP< 再生待機 */ + MVEASY_STATUS_PLAYING, /*EN< The decoders are currently decoding and playing output. */ + /*JP< 再生中 */ + MVEASY_STATUS_PLAYEND, /*EN< The end of the movie has been reached. */ + /*JP< 再生終了 */ + MVEASY_STATUS_ERROR, /*EN< An error has occurred. */ + /*JP< エラー */ + + /* Keep enum 4bytes */ + MVEASY_STATUS_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /*EN + * \brief Supported timer types; used to synchronize video frames. + */ + /*JP + * \brief タイマ種別 + */ + enum TimerType { + MVEASY_TIMER_NONE, /*EN< No synchronization. The output is available as soon as + * each frame is decoded. */ + /*JP< ビデオフレームは時刻同期をしません。デコードが終わったフレーム + * はすぐに取得することができます。 */ + MVEASY_TIMER_SYSTEM, /*EN< Video frames synchronize to the system timer.
+ * You must provide an instance of CriMvSystemTimerInterface to + * CriMvEasyPlayer::Create(). */ + /*JP< ビデオフレームはシステム時刻に同期します。システム時刻はアプリケーション + * が CriMvSystemTimerInterface としてCriMvEasyハンドルに設定する必要があります。 */ + MVEASY_TIMER_AUDIO, /*EN< Video frames synchronize with the movie's audio data.
+ * You must provide an instance of CriMvSoundInterface to CriMvEasyPlayer::Create().
+ * If the movie does not have audio, video frames will synchronize with the system timer. */ + /*JP< ビデオフレームはムービのオーディオ時刻に同期します。 + * アプリケーションは GetTime関数を含む CriMvSoundInterface をCriMvEasy + * ハンドルに設定する必要があります。もしもムービデータにオーディオが含まれて + * いない場合は、ビデオはシステム時刻に同期します。 */ + + /* Keep enum 4bytes */ + MVEASY_TIMER_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /*EN + * \ingroup MODULE_INIT + * + * \brief Creates an EasyPlayer handle + * + * \param heap Handle to a CriHeap object + * \param freader File input interface + * \param stimer System timer interface + * \param sound Sound module interface + * \param err Optional error code + * + * \return A valid CriMvEasyPlayer handle, or NULL if the handle cannot be allocated + * + * Creates and initialize a new EasyPlayer handle. Its status is initially MVEASY_STATUS_STOP. + * Memory for the handle is allocated from the provided CriHeap object. + * + * If memory allocation fails, this function will return NULL. Be sure to initialize and create + * your heap with criHeap_Initialize() and criHeap_Create() before calling this function. + * + * \remarks + * CriMv::Initialize() must be called before calling this function. + * + */ + /*JP + * \ingroup MODULE_INIT + * \brief EasyPlayerハンドルの作成 + * \param heap CriHeapハンドル + * \param freader ファイル読み込みインタフェース + * \param stimer システムタイマインタフェース + * \param sound サウンドインタフェース + * \param err エラー情報 + * \return CriMvEasyハンドルを返します。エラーが発生した場合は、NULLを返します。 + * + * 本関数は CriMv::Initialize() 呼び出しよりもに実行してください。
+ * ハンドル作成後はハンドル状態はMVEASY_STATUS_STOPとなります。
+ * ハンドル確保に必要なメモリは全て、引数で渡された CriHeap を使って確保されます。
+ * メモリ不足などでエラーが発生した場合は、本関数はNULLを返します。 + * + */ + static CriMvEasyPlayer* CRIAPI Create(CriHeap heap, + CriMvFileReaderInterface *freader, + CriMvSystemTimerInterface *stimer, + CriMvSoundInterface *sound, + CriError &err=CriMv::ErrorContainer); + /*EN + * \ingroup MODULE_INIT + * \brief Destroy a handle + * \param err Optional error code + * + * \ingroup MODULE_INIT + * + * \brief Destroys an EasyPlayer handle + * \param err Optional error code + * + * Destroys an EasyPlayer handle previously created with CriMvEasyPlayer::Create(), and frees its resources. + * + * An EasyPlayer handle can only be destroyed when it is in the MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND state. + * Attempting to destroy a handle when it is in any other state will cause an error. + * + * Any work buffers allocated via CriHeap, if still associated with the handle, are freed by this call. + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::Status, CriMvEasyPlayer::GetStatus() + */ + /*JP + * \ingroup MODULE_INIT + * \brief EasyPlayerハンドルの破棄 + * \param err エラー情報(省略可) + * + * CriMvEasyPlayer::Create()で作成したEasyPlayerハンドルを破棄します。 + * + * ハンドル状態が MVEASY_STATUS_STOP 、 MVEASY_STATUS_PLAYEND の時にのみハンドルを破棄することができます。
+ * それ以外の状態で呼び出した場合は、エラーになります。
+ * + * ハンドル状態が MVEASY_STATUS_ERROR だった場合は、CriMvEasyPlayer::Stop() を呼び出して + * MVEASY_STATUS_STOP 状態になってからハンドル破棄してください。
+ * ハンドル状態は CriMvEasyPlayer::GetStatus() で確認することができます。 + * + * ハンドル作成時に指定したCriHeapによって確保されたメモリで未解放の全ては、 + * この関数の呼び出しによって解放されます。 + * + * \sa CriMvEasyPlayer::Create(), CriMvEasyPlayer::Status, CriMvEasyPlayer::GetStatus() + */ + void Destroy(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_BASIC + * + * \brief Returns status of an EasyPlayer handle. + * \param err Optional error code + * \return Handle status + * + * Returns the current status of an EasyPlayer handle. The status will be one of the values + * defined by CriMvEasyPlayer::Status. + * + * \sa CriMvEasyPlayer::Status + */ + /*JP + * \ingroup MODULE_BASIC + * \brief ハンドル状態の取得 + * \param err エラー情報(省略可) + * \return ハンドル状態 CriMvEasyPlayer::Status + * + * ハンドル状態を取得します。 + * + * \sa CriMvEasyPlayer::Status + */ + Status GetStatus(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_BASIC + * + * \brief Executes heatbeat functions for an EasyPlayer handle + * \param err Optional error code + * + * Performs regular processing for an EasyPlayer handle, including handoff and parsing of input + * buffers, and audio decoding. Additionally, it checks for situations where the handle state + * should change to one of the values defined by CriMvEasyPlayer::Status, and changes state as + * necessary. + * + * This function and CriMvEasyPlayer::ExecuteDecode() should be called periodically during movie + * playback or when waiting for CriMvEasyPlayer::DecodeHeader() to complete. It takes a relatively + * low CPU load, and should typically be called on every vertical blank. + * + * \remarks + * Note that this function does not perform any video decoding. Decoding is done in + * CriMvEasyPlayer::ExecuteDecode(). + * + * \sa CriMvEasyPlayer::Status, CriMvEasyPlayer::ExecuteDecode(), CriMvEasyPlayer::DecodeHeader() + */ + /*JP + * \ingroup MODULE_BASIC + * \brief EasyPlayerサーバ関数 + * \param err エラー情報(省略可) + * + * ムービのヘッダ解析や入力バッファ制御、オーディオデコード等を行います。
+ * EasyPlayer ハンドルの状態遷移もこの関数で行います。
+ * この関数はビデオのデコードは行いません。そのためCPU負荷はあまり高くなりません。
+ * 本関数はアプリケーションのメインループで毎回呼び出すようにしてください。 + * + * \sa CriMvEasyPlayer::Status + */ + void Update(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_BASIC + * + * \brief Synchronizes the master timer of an EasyPlayer handle. + * \param err Optional error code + * + * Synchronizes the timing of video frames to the master timer used by this EasyPlayer handle. + * If the master timer is of type MVEASY_TIMER_AUDIO and the movie does not have audio, + * EasyPlayer will use the system timer that was set when the handle was created. + * + * \sa CriMvEasyPlayer::TimerType, CriMvEasyPlayer::SetMasterTimer(), CriMvSystemTimerInterface + */ + /*JP + * \ingroup MODULE_BASIC + * \brief マスタタイマへの同期 + * \param err エラー情報(省略可) + * + * ムービ再生時刻をマスタタイマに同期させます。
+ * マスタタイマは CriMvEasyPlayer::SetMasterTimer() によって指定されたタイマを使います。
+ * タイマ種別として MVEASY_TIMER_AUDIO が指定されていて、再生するムービにオーディオが + * 含まれていない場合は、ハンドル作成時のシステムタイマを使用します。 + * + * この関数は、ハンドル作成時に指定したシステムタイマインタフェースの + * CriMvSystemTimerInterface::GetTime() を呼び出します。 + * + * \sa CriMvEasyPlayer::TimerType, CriMvEasyPlayer::SetMasterTimer(), CriMvSystemTimerInterface + */ + void SyncMasterTimer(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_BASIC + * + * \brief Decodes a video frame + * \param err Optional error code + * \return \a TRUE If the movie is currently in a playback state + * \return \a FALSE If the movie is not playing + * + * Performs the actual video decoding. Each call to this function decodes a single frame. + * It does not return until the frame has been decoded. + * + * Video decoding can impose a very heavy CPU load, so calling this function from an application's + * main thread may cause your application to miss the vertical blank interval. To avoid this situation, + * ExecuteDecode() can be called from a separate, lower-priority thread. See the Mutithreaded Decoding + * tutorial for a full explanation. + * + * The return value describes the movie playback state. If TRUE, the movie is currently playing + * (or decoding the movie header) or ready to play. If FALSE, playback has not yet been started, + * or playback has finished. + * + * If a decoding thread is used, an application must wait until this function returns FALSE before destroying + * the thread. Otherwise, the handle state will not transition to MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, + * and the EasyPlayer handle cannot be destroyed. + * + * \attention + * ExecuteDecode() is the only CRI Movie function that is safe to call from a separate thread. + * No other CRI Movie functions should be considered to be thead-safe. + * + */ + /*JP + * \ingroup MODULE_BASIC + * \brief ビデオデコード + * \param err エラー情報(省略可) + * \return ムービ再生中はTRUE 、再生終了また停止後はFALSEを返します。 + * + * ビデオデータのデコードを行います。
+ * 本関数は1ピクチャ分のデコードを終わるまで終了しません。
+ * ピクチャデコードは負荷の高い処理なので、アプリケーションのメインスレッドから呼び出すと処理落ちが発生する可能性があります。
+ * その場合は、メインスレッドよりも優先度の低い別スレッドから呼び出すようにしてください。 + * + * 本関数の返り値は、ムービ再生の実行中かどうかを表しています。
+ * デコード用スレッドを終了する場合は、返り値がFALSEになるのを待たなければいけません。
+ * 返り値がTRUEの間にデコードスレッドを終了してしまうと、ハンドルの状態が MVEASY_STATUS_STOP や + * MVEASY_STATUS_PLAYEND に遷移できず、ハンドル破棄が出来なくなります。
+ * + */ + CriBool ExecuteDecode(CriError &err=CriMv::ErrorContainer); + + /* 再生制御 */ + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Sets the name of the movie file to play + * \param fname Name of the movie file + * \param err Optional error code + * + * Sets the name of the movie file to play, but does not open the file. The length of the filename + * (including path) is limited to CRIMV_MAX_FILE_NAME characters. EasyPlayer copies this + * string to internal memory, so a temporary variable can be used. + * + * If an application plays the same movie repeatedly, it only needs to call this function once. + * + * Multiple calls to this function will overwrite previous values. Calling CriMvEasyPlayer::SetData() + * will clear any filename set by this function. + * + * \remarks + * This function can only be called when the handle status is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, + * or from the file request callback. See CriMvEasyPlayer::SetFileRequestCallback() for details. + * + * \remarks + * Calling this function does not open the file. The file is opened by a call to CriMvEasyPlayer::Update(). + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetData() + */ + /*JP + * \ingroup MODULE_CONTROL + * + * \brief 再生ファイルの指定 + * \param fname ムービファイルパス + * \param err エラー情報(省略可) + * + * 再生するムービのファイルパスを設定します。ファイルパスの最大長は CRIMV_MAX_FILE_NAME バイトです。
+ * EasyPlayerは内部でこのファイルパスをコピーするので、引数で渡した文字列は破棄してもかまいません。 + * + * 同じファイルを繰り返し再生する場合は、この関数を再度呼び出す必要はありません。 + * + * この関数を呼び出した直後にもう一度この関数を呼び出すと、前回のファイル情報は新しいファイル情報に上書きされます。 + * CriMvEasyPlayer::SetData()関数を呼び出した場合は、事前に設定したファイル情報がクリアされます。 + * + * \para 備考1: + * この関数はハンドル状態が MVEASY_STATUS_STOP もしくは MVEASY_STATUS_PLAYEND時のみ呼び出し可能です。 + * またはファイル要求コールバック関数内でもこの関数を呼び出すことができます。詳細は CriMvEasyPlayer::SetFileRequestCallback()関数を + * 参照してください。 + * + * \para 備考2: + * この関数の内部ではファイルのオープン要求はしません。ファイルのオープン処理は CriMvEasyPlayer::Update() 関数の中で行われます。 + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetData(), CriMvEasyPlayer::SetFileRange() + */ + void SetFile(CriChar8 *fname, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Sets in-memory movie data + * \param dataptr Pointer to movie data + * \param datasize Size of data, in bytes + * \param err Optional error code + * + * Sets the in-memory data buffer for this EasyPlayer handle to point to the provided buffer, + * but does not attempt to read that buffer. After this call, the memory pointed to by \a dataptr + * belongs to CRI Movie and must remain valid until playback is complete. + * + * If an application plays the same movie data repeatedly, it only needs to call this function once. + * + * Multiple calls to this function will overwrite previous values. Calling CriMvEasyPlayer::SetFile() + * will clear any pointer set by this function. + * + * \remarks + * This function can only be called when the handle status is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, + * or from the file request callback. See CriMvEasyPlayer::SetFileRequestCallback() for details. + * + * \remarks + * Calling this function does not attempt to reference the memory. The memory read is initiated by a call + * to CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start(). + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetFile(), CriMvEasyPlayer::SetFileRange() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief メモリ上データの指定 + * \param dataptr データポインタ + * \param datasize データサイズ + * \param err エラー情報(省略可) + * + * この関数はEasyPlayerのハンドル状態がMVEASY_STATUS_STOPかMVEASY_STATUS_PLAYENDの時に呼び出してください。
+ * または、ファイル要求コールバックの内部で呼び出すことができます。
+ * + * 本関数を繰り返し呼び出した場合は、メモリ情報は上書きされます。
+ * CriMvEasyPlayer::SetFile()を呼び出した場合は、本関数で指定したメモリ情報はハンドル内から消去されます。 + * + * 同じハンドルで同じムービデータを繰り返し再生する場合は、本関数の呼び出しは省略することができます。 + * + * 指定されたメモリ領域に実際にアクセスするのは、 CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Prepare(), + * CriMvEasyPlayer::Start() のいずれかが呼び出された時以降です。
+ * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetFile(), CriMvEasyPlayer::SetFileRange() + */ + void SetData(CriUint8 *dataptr, CriUint32 datasize, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * \brief Set a pack file and pass offset and range of movie file to an EasyPlayer handle + * \param fname File name string pointer of the pack file + * \param offset offset in byte to movie data in the packing file [in bytes] + * \param range size of movie data from the offset in the packing file [in bytes] + * \param err Optional error code + * + * Sets the name of the pack file that contains the movie file to play. + * EasyPlayer tries to read data from 'offset' through 'range' in the pack file as the movie data. + * Passing a negative value as range, EasyPlayer reads data until the end of the pack file. + * + * The length of file name is limited until CRIMV_MAX_FILE_NAME. + * EasyPlayer handle copies the file name string into the handle. + * You can use a temporary variable as the file name string. + * + * If an application plays the same movie repeatedly, it only needs to call this function once. + * + * Multiple calls to this function will overwrite previous values. Calling CriMvEasyPlayer::SetData() + * will clear any filename set by this function. + * + * \remarks + * This function can only be called when the handle status is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND, + * or from the file request callback. See CriMvEasyPlayer::SetFileRequestCallback() for details. + * + * \remarks + * Calling this function does not open the file. The file is opened by a call to CriMvEasyPlayer::Update(). + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetData(), CriMvEasyPlayer::SetFile() + */ + /*JP + * \ingroup MODULE_CONTROL + * + * \brief 再生したいムービファイルを含むパックファイルの指定 + * \param fname パックファイル名 (パスを含む) + * \param offset パックファイル内のムービデータまでのオフセット (単位: バイト) + * \param range パックファイル内のムービデータのサイズ (単位:バイト) + * \param err エラー情報(省略可) + * + * 再生するムービを含むパックファイルを指定します。引数で指定した offset 位置から range サイズ分までをパックファイル内に含まれるムービデータみなします。 + * rangeに負値を入力するとパックファイルの終端までをムービとして読み込みます。 + * + * パックファイルのファイルパスの最大長は CRIMV_MAX_FILE_NAME バイトです。 + * EasyPlayerは内部でこのファイルパスをコピーするので、引数で渡した文字列は破棄してもかまいません。 + * + * 同じファイルを繰り返し再生する場合は、この関数を再度呼び出す必要はありません。 + * + * この関数を呼び出した直後に、もう一度この関数を呼び出すと、前回のファイル情報は新しいファイル情報に上書きされます。 + * CriMvEasyPlayer::SetData()関数を呼び出した場合は、事前に設定したファイル情報がクリアされます。 + * + * \para 備考1: + * この関数はハンドル状態が MVEASY_STATUS_STOP もしくは MVEASY_STATUS_PLAYEND時のみ呼び出し可能です。 + * またはファイル要求コールバック関数内でもこの関数を呼び出すことができます。詳細は CriMvEasyPlayer::SetFileRequestCallback()関数を + * 参照してください。 + * + * \para 備考2: + * この関数の内部ではファイルのオープン要求はしません。ファイルのオープン処理は CriMvEasyPlayer::Update() 関数の中で行われます。 + * + * \sa CriMvEasyPlayer::SetFileRequestCallback(), CriMvEasyPlayer::SetData(), CriMvEasyPlayer::SetFile() + */ + void SetFileRange(CriChar8 *fname, CriUint64 offset, CriSint64 range, CriError &err=CriMv::ErrorContainer); + + /* 前回のムービデータをもう一度登録する(ファイル要求コールバック関数でのみ呼ぶこと) */ + void SetPreviousDataAgain(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Reads movie header and analyzes movie information + * \param err Optional error code + * + * This function opens the movie file, reads the header, and starts to analyze the movie data. + * It does not start movie playback. + * + * When this function is called, the handle status changes to MVEASY_STATUS_DECHDR. Once EasyPlayer + * has finished reading the header and analyzing the movie, the status changes to MVEASY_STATUS_WAIT_PREP. + * When the status is MVEASY_STATUS_WAIT_PREP, CriMvEasyPlayer::GetMovieInfo() can be successfully called. + * + * To continue playback, call CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start() when the handle status + * is MVEASY_STATUS_WAIT_PREP. + * + * \remarks + * This function can only be called when the handle status is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND. + * + * \remarks + * You must either call CriMvEasyPlayer::SetFile() or CriMvEasyPlayer::SetData(), or provide a file request + * callback with CriMvEasyPlayer::SetFileRequestCallback(), before calling this function. + * + * \remarks + * Once this function has been called, CriMvEasyPlayer::ExecuteDecode() and CriMvEasyPlayer::Update() must be + * called periodically in order for this function to have any effect. Otherwise, the handle status will + * never change. + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::Prepare(), CriMvEasyPlayer::Start(), + * CriMvEasyPlayer::SetFileRequestCallback(), + * CriMvEasyPlayer::ExecuteDecode(), CriMvEasyPlayer::Update() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief ムービヘッダ解析 + * \param err エラー情報(省略可) + * + * ムービの再生は開始せず、ヘッダ解析のみ行って待機するための関数です。
+ * この関数を使用してヘッダ解析を事前に済ませることにより、再生開始前にムービの解像度やオーディオの情報を + * 得ることができます。
+ * 本関数を呼び出すと、EasyPlayerのハンドル状態はMVEASY_STATUS_STOP → MVEASY_STATUS_DECHDR と遷移していき、 + * ヘッダ解析が完了するとMVEASY_STATUS_WAIT_PREPとなります。
+ * ムービ情報を取得するには、ハンドル状態がMVEASY_STATUS_WAIT_PREPになったあとに CriMvEasyPlayer::GetMovieInfo() + * を実行してください。
+ * + * ハンドル状態がMVEASY_STATUS_WAIT_PREPの時に、 CriMvEasyPlayer::Prepare() か CriMvEasyPlayer::Start() を + * 呼ぶことで再生処理を続けることができます。
+ * + * 本関数は EasyPlayerのハンドル状態がMVEASY_STATUS_STOPかMVEASY_STATUS_PLAYENDの時に呼び出してください。 + * + * 本関数を呼び出す前に CriMvEasyPlayer::SetFile() か CriMvEasyPlayer::SetData() でムービデータを指定してください。
+ * ただし、ファイル要求コールバック関数を登録している場合は事前のムービデータ設定は省略することだきます。 + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::Prepare(), CriMvEasyPlayer::Start(), CriMvEasyPlayer::SetFileRequestCallback() + */ + void DecodeHeader(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Reads movie header, analyzes movie information, and buffers data. + * \param err Optional error code + * + * This function opens the movie file and gets it ready for immediate playback, by reading and analyzing + * the header and decoding and buffering video data. It allows a movie to start playing immediately when + * CriMvEasyPlayer::Start() is called, without an initial delay. + * + * When this function is called, the handle status changes to MVEASY_STATUS_DECHDR. Once EasyPlayer + * has finished reading and analyzing the movie data, the status changes to MVEASY_STATUS_PREP and EasyPlayer + * begins decoding video data. When the initial video data has been decoded and buffered, the status changes to + * MVEASY_STATUS_READY. + * + * The amount of data that is buffered, in seconds, is based on the value set by CriMvEasyPlayer::SetBufferingTime(). + * By default, this is 1 second. + * + * When the status is MVEASY_STATUS_READY, movie playback will start imediately when CriMvEasyPlayer::Start() + * is called. + * + * \remarks + * Unless you CriMvEasyPlayer::DecodeHeader() first, this function can only be called when the handle status + * is MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND. + * + * \remarks + * You must either call CriMvEasyPlayer::SetFile() or CriMvEasyPlayer::SetData(), or provide a file request + * callback with CriMvEasyPlayer::SetFileRequestCallback(), before calling this function. + * + * \remarks + * Once this function has been called, CriMvEasyPlayer::ExecuteDecode() and CriMvEasyPlayer::Update() must be + * called periodically in order for this function to have any effect. Otherwise, the handle status will + * never change. + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Start(), + * CriMvEasyPlayer::SetBufferingTime(), CriMvInputBufferInfo + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief 再生準備(ヘッダ解析とバッファリング) + * \param err エラー情報(省略可) + * + * ムービの再生は開始せず、ヘッダ解析と再生準備のみを行って待機するための関数です。
+ * この関数を使用して再生準備を事前に済ませることにより、ムービ再生開始のタイミングを細かく制御することができます。
+ * (再生準備無しで再生開始関数を呼び出した場合は、実際に再生が始まるまでにタイムラグが発生します。)
+ * 本関数を呼び出すと、EasyPlayerのハンドル状態はMVEASY_STATUS_STOP → MVEASY_STATUS_DECHDR → MVEASY_STATUS_PREP と遷移していき、 + * 再生準備が完了するとMVEASY_STATUS_READYとなります。 + * + * ハンドル状態がMVEASY_STATUS_READYの時に、 CriMvEasyPlayer::Start() を呼ぶことで再生を開始することができます。 + * + * CriMvEasyPlayer::DecodeHeader() の呼び出し無しでこの関数を呼び出す場合は、CriMvEasyPlayerのハンドル状態が + * MVEASY_STATUS_STOPかMVEASY_STATUS_PLAYEND でなければいけません。 + * + * 再生開始前には CriMvEasyPlayer::SetFile() か CriMvEasyPlayer::SetData() でムービデータを指定してください。
+ * ただし、ファイル要求コールバック関数を登録している場合は事前のムービデータ設定は省略することだきます。 + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Start(), + * CriMvEasyPlayer::SetBufferingTime(), CriMvInputBufferInfo + */ + void Prepare(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Starts movie playback + * \param err Optional error code + * + * Opens the movie and starts playback. If CriMvEasyPlayer::Prepare() was not called, there will be a + * delay while the library reads the movie header and buffers the initial data. If CriMvEasyPlayer::Prepare() + * was called and the handle status is MVEASY_STATUS_READY, playback will start as soon as this function is called. + * + * \remarks + * If you call this function without calling CriMvEasyPlayer::DecodeHeader() or CriMvEasyPlayer::Prepare() + * first, this function can only be called when the handle status is MVEASY_STATUS_STOP, MVEASY_STATUS_PLAYEND, + * or MVEASY_STATUS_READY. + * + * \remarks + * You must either call CriMvEasyPlayer::SetFile() or CriMvEasyPlayer::SetData(), or provide a file request + * callback with CriMvEasyPlayer::SetFileRequestCallback(), before calling this function. + * + * \remarks + * Once this function has been called, CriMvEasyPlayer::ExecuteDecode() and CriMvEasyPlayer::Update() must be + * called periodically in order for this function to have any effect. Otherwise, the movie will not play and + * the handle status will never change. + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Prepare() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief 再生開始 + * \param err エラー情報(省略可) + * + * ムービの再生を開始します。
+ * CriMvEasyPlayer::Prepare()を呼ばずに、本関数を呼び出した場合は、ムービの解析と再生の準備を行うため、 + * 実際にムービの再生が始まるまでにタイムラグが発生します。
+ * CriMvEasyPlayer::Prepare()を先に呼び出して、ハンドル状態がMVEASY_STATUS_READYになっていれば、 + * この関数を呼び出してすぐに再生が始まります。 + * + * CriMvEasyPlayer::DecodeHeader() または CriMvEasyPlayer::Prepare() の呼び出し無しでこの関数を呼び出す場合は、 + * CriMvEasyPlayerのハンドル状態が MVEASY_STATUS_STOPかMVEASY_STATUS_PLAYEND でなければいけません。 + * + * 再生開始前には CriMvEasyPlayer::SetFile() か CriMvEasyPlayer::SetData() でムービデータを指定してください。
+ * ただし、ファイル要求コールバック関数を登録している場合は事前のムービデータ設定は省略することだきます。 + * + * \sa CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::Prepare() + */ + void Start(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Stops movie playback; resets a handle that is in an ERROR state, + * \param err Optional error code + * + * Tells the movie to stop playing and returns immediately. Note that this does not actually stop playback; + * an application must continue to call CriMvEasyPlayer::Update() and CriMvEasyPlayer::ExecuteDecode() until + * the status changes to MVEASY_STATUS_STOP. + * + * Once the handle is in the MVEASY_STATUS_STOP state, it can be reused for a different movie. + * + * If the handle state is MVEASY_STATUS_ERROR, an application must call this function and wait for the status + * to change to MVEASY_STATUS_STOP before destroying or reusing the player handle. + * + * In principle, this function does not reset any EasyPlayer handle parameters that were explicitly set via + * any of the settings APIs, so an application can replay the same movie by simply calling CriMvEasyPlayer::Start() + * once the state has changed to MVEASY_STATUS_STOP. However, calling this function will reset the following + * parameters: + * + * - The pause state (see CriMvEasyPlayer::Pause()) will be reset to OFF (not paused). + * - If a file request callback has been set (via CriMvEasyPlayer::SetFileRequestCallback()), the movie + * data information will be reset. + * + * See the description of CriMvEasyPlayer::ResetAllParameters() for a comparison of the parameters that are + * affected by that function and by this function. + * + * \remarks + * This function may call CriMvSoundInterface::Stop() and CriMvFileReaderInterface::Close(). For an EasyPlayer + * handle to change to MVEASY_STATUS_STOP, the sound and file interfaces need to transition to their STOP states. + * In the case of CriMvSoundInterface, this means that CriMvSoundInterface::GetStatus() will return + * MVEASY_SOUND_STATUS_STOP. For CriMvFileReaderInterface, this means that CriMvFileReaderInterface::GetCloseStatus() + * will return ASYNC_STATUS_COMPLETE. + * + * \sa CriMvEasyPlayer::Status, CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::ResetAllParameters() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief 再生停止/エラー状態からの復帰 + * \param err エラー情報(省略可) + * + * ムービ再生停止の要求を出します。本関数は即時復帰関数です。本関数内で全ての停止処理が実行されるわけではありません。
+ * 本関数呼出し後、再生状態が MVEASY_STATUS_STOP なるまでは通常のメインループ処理を動かしてください。
+ * 具体的には CriMvEasyPlayer::Update(), CriMvEasyPlayer::ExecuteDecode() が通常通り呼び出される必要があります。 + * + * 再生状態が MVEASY_STATUS_ERROR になった場合は、本関数を呼び出して MVEASY_STATUS_STOP を待ってください。
+ * + * forループなどによるローカルループで状態変更待ちをしても MVEASY_STATUS_STOP にはなりません。
+ * + * 本関数を呼び出しても、アプリケーションが再生ハンドルに設定した各種パラメータは原則としてリセットされません。
+ * MVEASY_STATUS_STOP 状態になったあと、もう一度再生を開始すると前回と同じパラメータで再生を行うことができます。
+ * 例外的に本関数でリセットされるパラメータは以下のものがあります。 + * - CriMvEasyPlayer::Pause() によるポーズ状態は、OFFにリセットされます。 + * - ファイル要求コールバック関数の登録がある場合、ムービファイル名(またはメモリ)の情報はリセットされます。 + * + * リセットされるパラメータ一覧は CriMvEasyPlayer::ResetAllParameters() の説明を参照してください。 + * + * 本関数は必要に応じて CriMvSoundInterface::Stop() および CriMvFileReaderInterface::Close() を呼び出します。
+ * EasyPlayer ハンドルが MVEASY_STATUS_STOP 状態になるためには、各インタフェースが停止状態にならなければいけません。
+ * サウンドインタフェースの場合、 CriMvSoundInterface::GetStatus()が MVEASY_SOUND_STATUS_STOP を返すこと。
+ * ファイル読み込みインタフェースの場合、 CriMvFileReaderInterface::GetCloseStatus() が、ASYNC_STATUS_COMPLETE + * を返さなければいけません。 + * + * \sa CriMvEasyPlayer::Status, CriMvEasyPlayer::GetStatus(), CriMvEasyPlayer::ResetAllParameters() + */ + void Stop(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_CONTROL + * + * \brief Pauses or resumes movie playback + * \param sw Pause state. ON (1) will pause playback, OFF (0) will resume it. + * \param err Optional error code + * + * Pauses or resumes movie playback, depending on the argument. If \a sw is ON (1), playback will be paused. + * If \a sw is OFF (0), playback will be resumed. + * + * \remarks + * This function will call CriMvSoundInterface::Pause() and CriMvSystemTimerInterface::Pause() with the + * provided argument. + * + * \remarks + * Calling CriMvEasyPlayer::Stop() or CriMvEasyPlayer::ResetAllParameters() will set the pause state to OFF. + * + * \sa CriMvSoundInterface::Pause(), CriMvSystemTimerInterface::Pause() + */ + /*JP + * \ingroup MODULE_CONTROL + * \brief 再生の一時停止または再開 + * \param sw ポーズスイッチ。ポーズONの場合は1、ポーズOFF(レジューム)の場合は0を指定します。 + * \param err エラー情報(省略可) + * + * 本関数の動作は引数に依存します。
+ * 引数 sw がON(1)なら、一時停止。引数 sw がOFF(0)なら再生再開です。 + * + * CriMvEasyPlayer::Stop() または CriMvEasyPlayer::ResetAllParameters を呼び出すとポーズ状態はOFFにリセットされます。 + * + * この関数は CriMvSoundInterface::Pause() と CriMvSystemTimerInterface::Pause() を同じ引数で呼び出します。 + * + * \sa CriMvSoundInterface::Pause(), CriMvSystemTimerInterface::Pause() + */ + void Pause(CriBool sw, CriError &err=CriMv::ErrorContainer); + + CriBool IsPaused(CriError &err=CriMv::ErrorContainer); + + /* オプション設定/取得 */ + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the type of timer used for video synchronization + * \param type Type of timer to use + * \param err Optional error code + * + * In order to display video frames at the proper rate, CRI Movie uses a timer to determine when the + * next frame should be shown. For a movie with an audio track, you would typically use the + * MVEASY_TIMER_AUDIO timer type. For a movie with no audio, the MVEASY_TIMER_SYSTEM type timer + * should be used. + * + * The default is the timer type that was passed to CriMvEasyPlayer::Create(). If this value + * was NULL, a system timer (MVEASY_TIMER_SYSTEM) will be used. + * + * \remarks + * If an audio timer (MVEASY_TIMER_AUDIO) is wanted, it must be created and passed to + * CriMvEasyPlayer::Create(). + * + * \remarks + * If the movie does not have an audio track, CRI Movie will use a MVEASY_TIMER_SYSTEM regardless of + * the value set by this function. + * + * \sa CriMvEasyPlayer::GetMasterTimer(), CriMvEasyPlayer::Create(), TimerType + */ + /*JP + * \ingroup MODULE_OPTION + * \brief マスタタイマ種別の指定 + * \param type マスタタイマ種別 + * \param err エラー情報(省略可) + * + * ビデオフレームの時刻管理に使用するタイマ種別を指定します。
+ * デフォルトはハンドル作成時に指定するシステムタイマです。
+ * ビデオフレームの表示タイミングをオーディオの時刻と同期させたいときはオーディオタイマを指定してください。
+ * オーディオタイマを指定した場合でも、再生するムービにオーディオが含まれていない場合はシステムタイマ同期となります。 + * + * \sa CriMvEasyPlayer::GetMasterTimer(), CriMvEasyPlayer::Create() + */ + void SetMasterTimer(TimerType type, CriError &err=CriMv::ErrorContainer); // default is SYSTEM + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Returns the type of timer currently being used by the EasyPlayer handle + * \param err Optional error code + * \return The current timer type + * + * Returns the current type of timer used to synchronize video frames. This value can be changed + * by calling CriMvEasyPlayer::SetMasterTimer(). Otherwise, the timer type is set when the handle + * is created. + * + * \sa CriMvEasyPlayer::SetMasterTimer(), CriMvEasyPlayer::Create(), TimerType + */ + /*JP + * \ingroup MODULE_OPTION + * \brief マスタタイマ種別の取得 + * \param err エラー情報(省略可) + * \return 現在設定されているマスタタイマ種別 + * + * 現在設定されているマスタタイマ種別を取得します。 + * + * \sa CriMvEasyPlayer::SetMasterTimer() + */ + TimerType GetMasterTimer(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the number of internal video buffers + * \param npools The number of buffers to use; must be greater than 0 + * \param err Optional error code + * + * CRI Movie uses internal memory, or frame pools, to buffer decoded frames before display. + * More frame pools can help smooth out playback under high CPU loads. + * + * \remarks + * By default, the number of pools is 1. To change the value, this function must be called + * before starting playback (with either CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start()). + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 内部ビデオバッファ(フレームプール)数の指定 + * \param npools 内部ビデオバッファ数(最低でも1) + * \param err エラー情報(省略可) + * + * EasyPlayerハンドル内部のビデオバッファ数を指定します。
+ * この内部ビデオバッファはデコード結果を蓄えておくためのもので、フレームプールと呼びます。
+ * フレームプールが多いほど先行してビデオデコードを進めることができるため、デコードの + * 負荷変動が大きかったり、デコードに使用できるCPU時間の変動が大きい場合にもスムーズな再生を + * 行いやすくなります。
+ * デフォルトのフレームプール数は1です。
+ * フレームプール数を変更したい場合は、再生開始前( CriMvEasyPlayer::Prepare()または CriMvEasyPlayer::Start())に + * 本関数を実行してください。 + */ + void SetNumberOfFramePools(CriUint32 npools, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the amount of movie data that will be buffered, in seconds + * \param sec Buffering time, in seconds + * \param err Optional error code + * + * CRI Movie buffers enough raw data from disk to allow for smooth playback and to reduce disk reads. + * The buffer size is based on the bitrate of the movie, and other movie parameters. + * + * By default, this buffer will be large enough to hold 1 second worth of playback. + * + * To determine the current buffering time, look at the \a buffering_time field of the + * CriMvStreamingParameters structure, which is retrieved by calling CriMvEasyPlayer::GetMovieInfo(). + * + * \remarks + * If this function is called, it must be called before starting playback (with either + * CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start()). + * + * \remarks + * Passing \a 0.0 as the value of \a sec will reset the buffering time to the default value. + * + * \remarks + * If an application calls CriMvEasyPlayer::SetStreamingParameters() for a handle, this function + * can not be used with that handle. + * + * \remarks + * The value set by this function, along with the value set by CriMvEasyPlayer::SetReloadThresholdTime(), + * determine how often data is read from disk. See the description of + * CriMvEasyPlayer::SetReloadThresholdTime() for details. + * + * \sa CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::GetInputBufferInfo(), + * CriMvStreamingParameters + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 入力データのバッファリング時間の指定 + * \param sec バッファリング時間。単位は秒。 + * \param err エラー情報(省略可) + * + * ストリーミング再生でバッファリングする入力データの量を秒単位の時間で指定します。
+ * EasyPlayerは、バッファリング時間とムービのビットレート等から読み込みバッファのサイズを決定します。 + * + * デフォルトのバッファリング時間は、再生開始時点でアプリケーションが作成済みのEasyPlayerハンドル数 + * に依存して決まります。EasyPlayerハンドル1つにつき1秒のバッファリング時間を確保します。もしもアプリ + * ケーションが3つのEasyPlayerハンドルを作成していた場合、バッファリング時間は3秒となります。 + * + * EasyPlayerハンドルが何秒分のバッファリング時間になっているかは CriMvEasyPlayer::GetMovieInfo + * 関数で取得する CriMvStreamingParameters 構造体の変数 buffering_time で確認できます。 + * + * 本関数の呼び出しは、 CriMvEasyPlayer::Prepare 関数または CriMvEasyPlayer::Start 関数の前までに実行してください。 + * + * バッファリング時間に 0.0f を指定した場合、バッファリング時間はライブラリのデフォルト値となります。
+ * また、アプリケーションが CriMvEasyPlayer::SetStreamingParameters 関数を呼び出した場合は本関数で + * 設定した値よりも、 CriMvEasyPlayer::SetStreamingParameters 関数の指定が優先されます。 + * + * \sa CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::GetInputBufferInfo() + */ + void SetBufferingTime(CriFloat32 sec, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Determines how often the movie data buffer is refilled from disk + * \param sec Number of seconds of playback time to buffer + * \param err Optional error code + * + * EasyPlayer buffers raw data from disk to allow for smooth playback. How often it refills + * its buffers is determined by this function. When the amount of data remaining, in seconds, + * falls below this value, EasyPlayer will call into the FileReader module for this handle in + * order to read more data. + * + * SetBufferingTime() sets a "low water mark" for the data buffer. For instance, if an application + * sets the buffer size to 4 seconds (with CriMvEasyPlayer::SetBufferingTime()), and sets the reload + * threshold to 1 second, then CRI Movie will initially fill the buffer with 4 seconds worth of + * data. After 3 seconds worth of data have been decoded and consumed, there will be less than + * \a reload \a threshold seconds of data remaining, and CRI Movie will refill the buffer. + * + * \remarks + * The default value for \a sec is 0.8s. + * + * \remarks + * If this function is called, it must be called before starting playback (with either + * CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start()). + * + * \sa CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::GetInputBufferInfo(), CriMvFileReaderInterface + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 再読み込み閾値の時間指定 + * \param sec 時間指定による再読み込み閾値。単位は秒。 + * \param err エラー情報(省略可) + * + * EasyPlayerハンドルは、入力バッファ内のデータが再読み込み閾値以下になった時に次のデータ読み込みを実行します。 + * 再読み込み閾値は本関数による指定時間とムービデータのビットレートによって自動的に計算されます。 + * 再読み込み閾値は時間[秒]で指定します。デフォルト値は0.8秒です。 + * + * ムービ再生中にデータを裏読みする場合などにシーク回数を減らすために閾値設定を利用することができます。 + * 例えば、バッファリング時間を2秒、再読み込み閾値を1秒に設定すると、ムービデータの読み込みは約1秒に1回の実行になります。 + * こうすることで、約1秒の間はデータの読み込みを連続的に行うことができます。 + * + * ムービを再生しながらユーザデータの読み込みを行う場合、ユーザデータの読み込みは本関数で指定した時間以内に読み込み + * 処理が終わるようにしてください。サイズの大きなデータは複数に分割して読み込むなどの対処が必要になります。 + * 本関数で指定した時間以内にユーザデータの読み込みが終わらなかった場合、ムービデータが枯渇してムービ再生が滞ります。 + * + * 本関数の呼び出しは、 CriMvEasyPlayer::Prepare 関数または CriMvEasyPlayer::Start 関数の前までに実行してください。 + * + * ムービ再生中の入力バッファのデータ量や再読み込み閾値のサイズは、CriMvEasyPlayer::GetInputBufferInfo で取得可能です。 + * + * \sa CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::GetInputBufferInfo() + */ + void SetReloadThresholdTime(CriFloat32 sec, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Retrieves input data buffering settings + * \param ibuf_info Input buffer information structure + * \param err Optional error code + * + * Populates the passed CriMvInputBufferInfo structure with the values of the settings + * for the raw input buffer size, the reload interval, and the amount of data currently buffered. + * + * \remarks + * This function can be called once the handle status has transitioned to MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvInputBufferInfo, CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::SetReloadThresholdTime() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 入力バッファ情報の取得 + * \param ibuf_info 入力バッファ情報 + * \param err エラー情報(省略可) + * + * 入力バッファ情報 CriMvInputBufferInfo を取得します。
+ * 入力バッファ情報はEasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあと取得できます。
+ * + * \sa CriMvInputBufferInfo, CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::SetReloadThresholdTime() + */ + void GetInputBufferInfo(CriMvInputBufferInfo &ibuf_info, CriError &err=CriMv::ErrorContainer); + + /*EN + * + * \brief Sets the maximum bitrate EasyPlayer will assume for movie data + * \param max_bitrate Maximum bitrate, in bits/second + * \param err Optional error code + * + * EasyPlayer determines the size of its input data buffer by the movie's bitrate, the buffering time, + * and other movie parameters. In normal usage, an application should not need to call this function. + * However, it can be useful when doing concatenated playback of several movies sequentially. + * + * If the bitrate of the first movie is smaller or larger than the next movie, EasyPlayer can choose + * a buffer size that will be appropriate for the first movie, but either too small for the next + * (causing excessive disk reads or playback stuttering) or too large (using more memory than necessary). + * + * Passing a value of 0 for \a max_bitrate will cause the handle to revert to its default behavior + * for determining maximum bitrate. + * + * \remarks + * The value set by this function will not be reflected in the \a max_bitrate field of the + * CriMvStreamingParameters structure, which will contain the actual value as stored in the movie's + * header. + * + * \remarks + * If this function is called, it must be called before starting playback (with either + * CriMvEasyPlayer::Prepare() or CriMvEasyPlayer::Start()). + * + * \remarks + * If an application calls CriMvEasyPlayer::SetStreamingParameters() for a handle, this function + * can not be used with that handle. + * + * \remarks + * For details about concatenated playback, see the description of CriMvEasyPlayer::SetFileRequestCallback(). + * + * \sa CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::SetReloadThresholdTime(), + * CriMvEasyPlayer::SetFileRequestCallback() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 最大ビットレートの指定 + * \param max_bitrate 最大ビットレート(bit per second) + * \param err エラー情報(省略可) + * + * ムービデータの最大ビットレートを指定します。最大ビットレートはストリーム再生用に確保するバッファサイズに影響します。
+ * + * 単純再生時は本関数を呼び出す必要はありません。EasyPlayerハンドルが自動的に最大ビットレートを取得して必要なだけの + * 読み込みバッファを確保します。
+ * + * 連結再生時に、先頭のムービファイルのビットレートが後続のムービファイルと比べて極端に小さい場合には、本関数を使用して + * 明示的に最大ビットレートを大きく指定してください。
+ * + * 本関数で設定した最大ビットレートは、CriMvEasyPlayer::GetMovieInfo 関数で取得するムービ情報には反映されません。 + * CriMvEasyPlayer::GetMovieInfo 関数で取得できるのはムービデータの本来の情報です。
+ * + * 本関数の呼び出しは、 CriMvEasyPlayer::Prepare 関数または CriMvEasyPlayer::Start 関数の前までに実行してください。
+ * + * 最大ビットレートに 0を指定した場合、最大ビットレートはムービデータの持つ値となります。
+ * また、アプリケーションが CriMvEasyPlayer::SetStreamingParameters 関数を呼び出した場合は本関数で + * 設定した値よりも、 CriMvEasyPlayer::SetStreamingParameters 関数の指定が優先されます。 + * + * \sa CriMvEasyPlayer::SetBufferingTime(), CriMvEasyPlayer::SetReloadThresholdTime(), + * CriMvEasyPlayer::SetFileRequestCallback() + */ + void SetMaxBitrate(CriUint32 max_bitrate, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the audio playback track + * \param track Audio track number + * \param err Optional error code + * + * If a movie has multiple audio tracks (for instance, English and Spanish versions), this function + * will determine which track plays. By default, the first audio track is used. + * + * To determine the number of audio tracks in the movie, call CriMvEasyPlayer::GetMovieInfo() and + * look at the \a num_audio field of the CriMvStreamingParameters structure. + * + * If the movie does not have any audio, this function has no effect. + * + * \remarks + * To use the default setting, set \a track to CRIMV_AUDIO_TRACK_AUTO. + * + * \remarks + * To turn off audio altogether, set \a track to CRIMV_AUDIO_TRACK_OFF. + * + * \sa CriMvEasyPlayer::GetMovieInfo() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 再生するオーディオトラックの指定 + * \param track 再生するオーディオトラック + * \param err エラー情報(省略可) + * + * ムービが複数のオーディオトラックを持っている場合に、再生するオーディオを指定します。
+ * 再生開始前( CriMvEasyPlayer::Prepare()または CriMvEasyPlayer::Start())に本関数を実行してください。 + * + * 本関数を実行しなかった場合は、もっとも若い番号のオーディオトラックを再生します。
+ * CriMvEasyPlayer::DecodeHeader()と CriMvEasyPlayer::GetMovieInfo()を使うことで、どのチャネルに + * どんなオーディオが入っているかを再生開始前に知ることができます。 + * + * データが存在しないトラック番号を指定した場合は、オーディオは再生されません。 + * + * トラック番号としてCRIMV_AUDIO_TRACK_OFFを指定すると、例えムービにオーディオが含まれていたと + * してもオーディオは再生しません。 + * + * また、デフォルト設定(もっとも若いチャネルのオーディオを再生する)にしたい場合は、 + * チャネルとしてCRIMV_AUDIO_TRACK_AUTOを指定してください。 + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader() + */ + void SetAudioTrack(CriSint32 track, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Turns movie looping on or off + * \param sw Looping value + * \param err Optional error code + * + * If \a sw is 1 (ON), the movie will loop continuously. + * If \a sw is 0 (OFF), the movie will play normally. + * + * In normal usage, a movie will play once, with the handle status changing to MVEASY_STATUS_PLAYEND + * when it completes. When looping is ON, this behavior changes. When the movie reaches the + * end, it will immediately start playing again from the beginning, and the status will continue to + * toggle between MVEASY_STATUS_PLAYING and MVEASY_STATUS_PREP. + * + * If looping is ON, and the playback is from a file, EasyPlayer will call CriMvFileReaderInterface::Seek() + * as necessary to reset the file pointer. + * + * \remarks + * If looping is ON, and an application sets it to OFF while the movie is playing, playback might + * not stop at the end of the movie. In that case, playback will end after the next loop iteration. + * + * \sa CriMvEasyPlayer::GetLoopFlag(), CriMvFileReaderInterface::Seek() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ループ再生フラグの指定 + * \param sw ループスイッチ。ONの場合はループあり、OFFの場合はループ無しになります。 + * \param err エラー情報(省略可) + * + * ループ再生の有無を設定します。デフォルトはループOFFです。
+ * ループ再生ONにした場合は、ムービの終端まで再生してもハンドル状態はMVEASY_STATUS_PLAYENDにならず、 + * ムービの先頭から再生を繰り返します。
+ * ファイル名指定で再生している場合は、最後まで読み込んだあと CriMvFileReaderInterface::Seek()を使って + * 読み込み位置をファイルの先頭に戻します。 + * + * ループ再生OFFに設定した場合は、そのとき読み込んでいたムービの終端まで再生すると、 + * ハンドル状態がMVEASY_STATUS_PLAYENDに遷移します。
+ * 再生中にループOFFにした場合、タイミングによっては、再生中のムービ終端で終わらず、次の繰り返し + * 再生まで実行されます。 + * + * 現在のループ設定を取得するには CriMvEasyPlayer::GetLoopFlag()を使ってください。 + * + * \sa CriMvEasyPlayer::GetLoopFlag(), CriMvFileReaderInterface::Seek() + */ + void SetLoopFlag(CriBool sw, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Retrieves the value of the looping flag + * \return The current looping setting + * + * By default, looping is OFF and playback will stop when it reaches the end. You can + * change this behavior by calling CriMvEasyPlayer::SetLoopFlag(). + * + * \sa CriMvEasyPlayer::SetLoopFlag() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ループ再生フラグの取得 + * \param err エラー情報(省略可) + * \return 現在のループ再生設定 + * + * 現在のループ設定を取得します。 + * ループ設定は CriMvEasyPlayer::SetLoopFlag() で変更することができます。 + * + * \sa CriMvEasyPlayer::SetLoopFlag() + */ + CriBool GetLoopFlag(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Gets the amount of time that a movie has been playing + * \param count Number of timer units since the movie started playing + * \param unit Number of timer units per second + * \param err Optional error code + * + * This function retrieves the absolute time that has elapsed since a movie started playing. + * The time value is returned in two parts - a counter with an arbitrary interval, and the + * number of timer ticks per second. To determine the playing time in seconds, divide + * \a count by \a unit. + * + * Before playback has started, and after it has stopped, this function will return a \a count value of 0. + * + * The value retrieved is the value of the master timer for the handle, not the time of the current frame itself. + * To get the video frame time, check the CriMvFrameInfo structure once you have retrieved the frame. + * + * \remarks + * Note that this function provides an absolute playback time - it does not wrap to 0 + * when the movie loops. + * + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 再生時刻の取得 + * \param count タイマカウント + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * \param err エラー情報(省略可) + * + * タイマ時刻を取得します。時刻はcountとunitの二つの変数で表現します。
+ * count ÷ unit で秒単位の時刻となるような値を返します。
+ * 再生開始前( CriMvSoundInterface::Start()呼び出し前)および + * 再生停止後( CriMvSoundInterface::Stop()呼び出し後)は、時刻0(タイマカウントが0)を返します。
+ * 本関数はマスタタイマで指定されたタイマの時刻を返すだけで、ビデオフレームの時刻を返すものではありません。
+ * 取得したビデオフレームの本来の表示時刻は、ビデオフレーム取得時の CriMvFrameInfo 構造体を参照してください。 + */ + void GetTime(CriUint64 &count, CriUint64 &unit, CriError &err=CriMv::ErrorContainer); // only refer time of SyncMasterTimer + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Gets information about the movie + * \param stmprm Movie information structure + * \param err Optional error code + * \return TRUE if movie information was successfully retrieved + * \return FALSE if the header has not yet been decoded, or if an error occurred + * + * Populates the passed \a CriMvStreamingParameters structure with information about the current movie, + * including the bitrate, resolution, audio track information, subtitle availability, and more. + * + * This function is available once the handle status has changed to MVEASY_STATUS_WAIT_PREP. If an application + * needs this information before starting playback (for instance, to set up for playing subtitles, or to + * allocate a display surface based on the size of the movie), call CriMvEasyPlayer::DecodeHeader(), then + * call GetMovieInfo(). + * + * \remarks + * When doing concatenated playback (via CriMvEasyPlayer::SetFileRequestCallback()), GetMovieInfo() will + * return information about the currently playing movie. + * + * \sa CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::SetFileRequestCallback() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ムービ情報の取得 + * \param stmprm ムービ情報 + * \param err エラー情報(省略可) + * + * ムービ情報 CriMvStreamingParameters を取得します。
+ * ムービ情報からは主にビットレートや解像度、オーディオ数などがわかります。
+ * ムービ情報はEasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあと取得できます。
+ * 再生開始前にムービ情報を知りたい場合は、 CriMvEasyPlayer::DecodeHeader()を呼び出してヘッダ解析を行ってください。 + * + * 連結再生を行った場合、最後に取得したフレームを含むムービファイルについての情報を返します。 + * + * \sa CriMvEasyPlayer::DecodeHeader() + */ + CriBool GetMovieInfo(CriMvStreamingParameters &stmprm, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Changes the parameters for the movie + * \param stmprm Movie information structure + * \param err Optional error code + * + * This is a DEBUG function and should not normally be used by applications. + * + * This function allows an application to change the streaming parameters for the movie as a whole. + * It is available once the handle status has changed to MVEASY_STATUS_WAIT_PREP. + * + * To use this function, first call CriMvEasyPlayer::DecodeHeader(), then call CriMvEasyPlayer::GetMovieInfo() + * to retrieve the current movie parameters. Change the fields of the CriMvStreamingParameters structure + * as appropriate, then call SetStreamingParameters(). + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ストリーミングパラメータの変更 + * \param stmprm ストリーミングパラメータ + * \param err エラー情報(省略可) + * + * 本関数は通常、アプリケーションからは使用しません。デバッグ用の関数です。 + * + * ムービ再生のためのストリーミングパラメータをEasyPlayerハンドルに設定します。
+ * ストリーミングパラメータが指定できるのは、EasyPlayerハンドル状態がMVEASY_STATUS_WAIT_PREPの時だけです。
+ * この関数は、読み込みバッファサイズなど細かなパラメータを全てアプリケーションで調整したい場合に使います。
+ * CriMvEasyPlayer::DecodeHeader()でヘッダ解析を行ったあと、 CriMvEasyPlayer::GetMovieInfo()で取得できる + * ムービ情報がそのままストリーミングパラメータとなりますので、調整したい値を変更して、本関数で設定しなお + * してください。 + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader() + */ + void SetStreamingParameters(CriMvStreamingParameters *stmprm, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Determine if a new video frame can be displayed + * + * \param err Optional error code + * + * \return TRUE if a frame is ready to be displayed + * \return FALSE if the movie is paused or not playing, or if a new frame is + * not yet decoded or ready to be displayed + * + * Each frame in a movie corresponds to an absolute time, with the first frame being time 0. + * The playback time is controlled by the master timer for this handle. + * If the time of the next frame is less than or equal to the current playback time, as determined + * by CriMvEasyPlayer::GetTime(), it is ready to be displayed, and this function will return TRUE. + * + * If an application needs to do some complex or lengthy processing before displaying a frame (such + * as locking a texture), it should call this function first. + * + * \remarks + * If the next frame has not yet been decoded, this function will return FALSE regardless of the playback time. + * + * \sa CriMvEasyPlayer::GetTime() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief 次フレームの表示時刻判定 + * \param err エラー情報(省略可) + * \return 次のビデオフレームがすでに表示時刻になっている場合はTRUE(1)を返します。
+ * 次のビデオフレームがまだデコードできない場合はFALSE(0)を返します。 + * + * 次のビデオフレームがすでに表示時刻になっているかどうかを問い合わせます。
+ * もしもデコードが遅れていて次のビデオフレームがまだデコードできていない場合は、再生時刻に関係 + * なくFALSEを返します。
+ * つまりこの関数は「次のフレームが GetFrameOnTime関数で取得できるかどうか」を調べます。
+ * ビデオフレームが実際に取得するよりも先にやらなければいけない処理(例えばテクスチャロックなど) + * がある場合は、この関数でフレーム取得の成否を判定してから処理してください。 + * + * \sa CriMvEasyPlayer::GetTime() + */ + CriBool IsNextFrameOnTime(CriError &err=CriMv::ErrorContainer); + +#if !defined(XPT_TGT_EE) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Loads video frame data into a buffer, in 32 bit ARGB format + * \param imagebuf Pointer to output buffer + * \param pitch Pitch of output buffer, in bytes + * \param bufsize Size of output buffer, in bytes + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Copies the next decoded frame into the 32 bit ARGB image buffer pointed to by \a imagebuf. + * If the display time is less than the frame time, or if the frame has not yet been decoded, the + * \a frameinfo parameter will be cleared and this function will return FALSE. + * + * The \a pitch parameter is the width, in bytes, of each row of the frame image, including any padding. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * CRI Movie decodes video frames into YUV420 format internally, and stores them in frame pools (see + * CriMvEasyPlayer::SetNumberOfFramePools()) for later display. When this function is called, + * the frame must first converted to ARGB format. This can be a very CPU-intensive operation, + * especially on the PS3 and Xbox360. For 1280 x 720 video resolution, this can use almost an + * entire vsync interval. On these platforms, we recommend implementing a pixel shader and calling + * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() instead. + * + * \remarks
+ * If an application uses this function, an application need to call CriMv::InitializeFrame32bitARGB() + * after CriMv::Initialize(). If an application calls this function without CriMv::InitializeFrame32bitARGB() + * calling, this function failed and an error callback occurs. + * + * \remarks + * This function is not available on the PS2. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers(), + * CriMvEasyPlayer::SetNumberOfFramePools() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief 32bit ARGBフォーマットでのデコード結果の取得 + * \param imagebuf 出力バッファポインタ + * \param pitch 出力バッファのピッチ [byte] + * \param bufsize 出力バッファのサイズ [byte] + * \param frameinfo 取得したビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * \return フレームが取得できた場合はTRUE(1)、できなかった場合はFALSE(0)を返します。 + * + * 32bit ARGBフォーマットで、表示時刻になっているビデオフレームを取得します。
+ * この関数を呼び出す場合は、ARGBバッファの実体を確保したうえで呼び出す必要があります。
+ * ビデオフレームは引数imagebufで指定したARGBバッファに書き出されます。
+ * もしも次のビデオフレームの表示時刻になっていなかったり、デコードが終わっていなかった場合は + * フレーム取得できず、frameinfoの中身はクリアされます。
+ * 事前にビデオフレームが取得できるかどうかを知りたい場合は CriMvEasyPlayer::IsNextFrameOnTime() + * を使用してください。 + * + * 32bit ARGB の実際のピクセルデータの並びについては、そのプラットフォームで最も標準的な + * フォーマットになります。 + * + * 注意:
+ * 本関数を使用する場合はフレーム変換の初期化 CriMv::InitializeFrame32bitARGB()の呼び出しが + * 事前に必要です。フレーム変換の初期化を行わずに本関数を呼び出した場合はフレーム取得に失敗し、 + * エラーコールバックが発生します。 + * + * 注意:
+ * PS3, Xbox360 でも本関数は使用できますが、とてもCPU負荷の高い関数となります。
+ * 解像度が 1280x720 のムービを本関数をフレーム取得すると1vsync近い時間がかかります。
+ * PS3, Xbox360 ではCriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() 関数と ピクセルシェーダー + * の組み合わせによるフレーム変換をおすすめします。
+ * + * 備考:
+ * PS2版CRI Movie は本関数に対応していません。 + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriBool GetFrameOnTimeAs32bitARGB(CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + +#if !defined(XPT_TGT_EE) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Loads video frame data into a set of Y,U,V separate buffers + * \param yuvbuffers Pointer to Y,U,V buffer data structure + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Copies the next decoded frame into the Y,U,V image buffers pointed to by \a yuvbuffers, for use + * with a pixel shader. CRI Movie decodes video frames into YUV420 format internally, so this is + * a very efficient function. + * + * If the display time is less than the frame time, or if the frame has not yet been decoded, the + * \a frameinfo parameter will be cleared and this function will return FALSE. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \remarks + * If the movie does not have an alpha channel, the alpha buffer fields of the \a CriMvYuvBuffers + * structure are not used. + * + * \remarks + * This function is not available on the PS2. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief YUV個別バッファへのデコード結果の取得 + * \param yuvbuffers YUV個別バッファのパラメータ構造体 + * \param frameinfo 取得したビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * \return フレームが取得できた場合はTRUE(1)、できなかった場合はFALSE(0)を返します。 + * + * YUV個別バッファ形式で表示時刻になっているビデオフレームを取得します。
+ * YUV個別バッファ形式はピクセルシェーダーでフレームを描画するための出力フォーマットです。
+ * この関数を呼び出す場合は、YUV個別バッファの実体を確保したうえで呼び出す必要があります。
+ * ビデオフレームは引数yuvbuffersで指定したYUV個別バッファに書き出されます。
+ * もしも次のビデオフレームの表示時刻になっていなかったり、デコードが終わっていなかった場合は + * フレーム取得できず、frameinfoの中身はクリアされます。
+ * 事前にビデオフレームが取得できるかどうかを知りたい場合は CriMvEasyPlayer::IsNextFrameOnTime() + * を使用してください。
+ *
+ * アルファムービ再生を行わない場合は、引数 yuvbuffers のAlphaテクスチャ関連のパラメータは使用しません。
+ * + * 備考:
+ * PS2版CRI Movie は本関数に対応していません。 + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriBool GetFrameOnTimeAsYUVBuffers(CriMvYuvBuffers *yuvbuffers, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + +#if defined(XPT_TGT_PC) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Loads video frame data into a buffer, in YUV422 format + * \param imagebuf Pointer to output buffer + * \param pitch Pitch of output buffer, in bytes + * \param bufsize Size of output buffer, in bytes + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Copies the next decoded frame into the YUV422 texture buffer pointed to by \a imagebuf. + * CRI Movie decodes video frames into YUV420 format internally, so there is some internal conversion + * required when using this function. + * + * If the display time is less than the frame time, or if the frame has not yet been decoded, the + * \a frameinfo parameter will be cleared and this function will return FALSE. + * + * The \a pitch parameter is the width, in bytes, of each row of the frame image, including any padding. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \remarks + * This function is currently only available in the PC version of CRI Movie. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief YUV422フォーマットでのデコード結果の取得 + * \param imagebuf 出力バッファのポインタ + * \param pitch 出力バッファのピッチ [byte] + * \param bufsize 出力バッファサイズ [byte] + * \param frameinfo 取得したビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * \return フレームが取得できた場合はTRUE(1)、できなかった場合はFALSE(0)を返します。 + * + * YUV422テクスチャフォーマットで、表示時刻になっているビデオフレームを取得します。
+ * この関数を呼び出す場合は、YUVバッファの実体を確保したうえで呼び出す必要があります。
+ * ビデオフレームは引数imagebufで指定したYUVバッファに書き出されます。
+ * もしも次のビデオフレームの表示時刻になっていなかったり、デコードが終わっていなかった場合は + * フレーム取得できず、frameinfoの中身はクリアされます。
+ * 事前にビデオフレームが取得できるかどうかを知りたい場合は CriMvEasyPlayer::IsNextFrameOnTime() + * を使用してください。 + * + * 【備考】
+ * 現在は、PC版CRI Movie のみ本関数に対応しています。 + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriBool GetFrameOnTimeAsYUV422(CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_PC)|| defined(XPT_TGT_TRGP6K) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * \brief Get video frame data to 16bit RGB565 format buffer + * + * This function is added for a prototype library for iPhone + * Please add comments when releasing the SDK. + * + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief 16bit RGB565フォーマットでのデコード結果の取得 + * + * この関数はiPhone版CRI Movieのプロトタイプ用の関数宣言です。 + * SDKとしてリリースする際は、コメントを追加して下さい。 + * + */ + CriBool GetFrameOnTimeAsRGB565(CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + +#if defined(XPT_TGT_EE) + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Gets a reference to EasyPlayer's internal video frame buffer, in 32 bit ARGB format + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Locks the internal buffer for the current video frame in memory, and retrieves a pointer to it. This is + * different behavior than the GetFrameXXX()functions, which copy the frame data into a caller-supplied location. + * + * On successful return from this function, the fields of \a frameinfo will be populated with information + * about the frame. In particular, the \a imageptr field will be set to the image buffer, in 32 bit ARGB format. + * After calling this function, an application must copy the video frame into its own buffer or transfer it to + * GS local memory via DMA. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \remarks + * After the application has copied the frame data, it must call CriMvEasyPlayer::UnlockFrame(). + * + * \remarks + * This function is only available on the PS2. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::UnlockFrame() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief デコード結果領域(ARGB32bit)のロック。PS2専用。 + * \param frameinfo ロックしたビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * + * 本関数はPS2専用のフレーム取得関数で、他機種の GetFrame 関数に相当します。
+ * PS2では GetFrame 関数の代わりに本関数と UnlockFrame 関数を使用してフレーム取得を行います。
+ * GetFrame 関数は出力バッファを指定してそこへデコード結果を取得するのに対し、LockFrame 関数はバッファを指定せず + * CriMvEasyPlayerハンドル内部にあるデコード結果バッファのポインタを取得するところが違います。
+ * + * 本関数はデコード結果のメモリ領域を参照開始するためにロックします。
+ * この関数でフレームをロックできるのは、そのフレームが表示可能時間になっている場合のみです。
+ * アプリケーションはフレームをロックしたあと、デコード結果をDMAでテクスチャ領域へ転送するか、 + * 別バッファへコピーするなどの処理を行います。
+ * デコード結果の参照が終わった後には、必ず CriMvEasyPlayer::UnlockFrame() 関数を呼び出して参照終了を通知してください。
+ * + * 備考:
+ * 本関数はPS2版CRI Movie のみ対応しています。 + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::UnlockFrame() + */ + CriBool LockFrameOnTimeAs32bitARGB_PS2(CriMvFrameInfo &frameinfo, CriError &err=CriMv::ErrorContainer); +#endif + + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Unlocks the video frame + * \param frameinfo Pointer to locked video frame information + * \param err Optional error code + * + * Unlocks the video frame that was locked in memory by a call to one of the LockFrameXXX() functions. + * + * The \a frameinfo parameter must be the same one that was passed to LockFrameXXX(). + * + * If the frame has been locked, EasyPlayer will not be able to retrieve the next frame until the frame is + * unlocked. An attempt to lock the same frame more than once will fail. + * + * The LockFrameXXX() functions are CriMvEasyPlayer::LockFrameOnTimeAs32bitARGB_PS2() and + * CriMvEasyPlayer::LockFrameOnTimeAsYUVBuffers(). Depending on the platform, only one or the other of + * these functions will be available. + * + * \sa CriMvEasyPlayer::LockFrameOnTimeAs32bitARGB_PS2(), CriMvEasyPlayer::LockFrameOnTimeAsYUVBuffers() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief ロックフレームで取得したデコード結果をアンロックする + * \param frameinfo ロックしたビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * + * 本関数はロックフレーム関数を使ってロックしていたフレームをアンロックし、メモリ参照の終了を通知します。
+ * ロックフレーム関数には CriMvEasyPlayer::LockFrameOnTimeAs32bitARGB_PS2() と CriMvEasyPlayer::LockFrameOnTimeAsYUVBuffers() + * がありますが、どちらの関数を使ってロックした場合も、本関数を使ってアンロックします。
+ * 本関数の引数には、どのフレームをアンロックするかを指示するために、ロックフレーム関数で取得したフレーム情報構造体を指定します。
+ * + * 本関数でアンロックしたフレームは、以後、次にビデオフレームのデコード出力バッファとして使用されます。
+ * 1度アンロックしたフレームをもう一度ロックすることは出来ません。
+ * + * \sa CriMvEasyPlayer::LockFrameOnTimeAs32bitARGB_PS2(), CriMvEasyPlayer::LockFrameOnTimeAsYUVBuffers() + */ + CriBool UnlockFrame(CriMvFrameInfo *frameinfo, CriError &err=CriMv::ErrorContainer); + +#if !defined(XPT_TGT_EE) + /*EN + * + * \brief Gets a reference to EasyPlayer's internal video frame buffer + * \param yuvbuffers Y,U,V buffer data structure + * \param frameinfo Video frame information structure + * \param err Optional error code + * \return TRUE if a frame was retrieved + * \return FALSE otherwise + * + * Locks the internal buffer for the current video frame in memory, and retrieves a pointer to it. This is + * different behavior than the GetFrameXXX() functions, which copy the frame data into a caller-supplied location. + * + * On successful return from this function, the fields of \a yuvbuffers will be set to the Y,U,V fields of the + * video frame, and the fields of \a frameinfo will be populated with information about the frame. + * + * After calling this function, an application must copy the video frame into its own buffer or transfer it to + * texture memory. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \remarks + * After the application has copied the frame data, it must call CriMvEasyPlayer::UnlockFrame(). + * + * \remarks + * This function is not available on the PS2. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::UnlockFrame() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief デコード結果領域のロック + * \param yuvbuffers YUV個別バッファのパラメータ構造体 + * \param frameinfo ロックしたビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * + * GetFrame とは別の仕様のフレーム取得関数です。
+ * 本関数は UnlockFrame 関数とセットで使用します。
+ * GetFrame 関数は出力バッファを指定してそこへデコード結果を取得するのに対し、LockFrame 関数はバッファを指定せず + * CriMvEasyPlayerハンドル内部にあるデコード結果バッファのポインタを取得するところが違います。
+ * + * 本関数はデコード結果のメモリ領域を参照開始するためにロックし、 + * デコード結果のYUV3種類のバッファについての情報を引数 yuvbuffers に格納します。
+ * この関数でフレームをロックできるのは、そのフレームが表示可能時間になっている場合のみです。
+ * アプリケーションはフレームをロックしたあと、デコード結果をテクスチャ領域へコピーするか、 + * 別バッファへコピーするなどの処理を行います。
+ * デコード結果の参照が終わった後には、必ず CriMvEasyPlayer::UnlockFrame() 関数を呼び出して参照終了を通知してください。
+ * + * 備考:
+ * PS2版CRI Movie は本関数に対応していません。 + * + * \sa CriMvEasyPlayer::UnlockFrame() + */ + CriBool LockFrameOnTimeAsYUVBuffers(CriMvYuvBuffers &yuvbuffers, CriMvFrameInfo &frameinfo, + CriError &err=CriMv::ErrorContainer); +#endif + + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Discards the next video frame + * \param frameinfo Discarded frame information structure + * \param err Optional error code + * \return TRUE if a frame was available to discard + * \return FALSE otherwise + * + * Discards the next video frame, if it is available, and populates \a frameinfo with information about + * the frame. Note that the \a imageptr field of that structure will not be available and should not + * be referenced. + * + * To determine if the next frame is ready to be displayed, call CriMvEasyPlayer::IsNextFrameOnTime(). + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief 次フレームを取得せずに捨てる + * \param frameinfo 破棄したビデオフレームの情報構造体 + * \param err エラー情報(省略可) + * + * デコード済みのビデオフレームを捨てたい場合に使用する関数です。
+ * フレーム取得関数と比べると、出力用バッファを準備する必要が無い部分が特徴です。
+ * CriMvEasyPlayer::IsNextFrameOnTime()で次フレームが取得できることを確認した後、本関数を呼び出してください。
+ * 引数frameinfoには参考のために破棄したビデオフレームの情報が格納されますが、デコード結果自体にはアクセスできません。 + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriBool DiscardNextFrame(CriMvFrameInfo &frameinfo, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the current channel for displaying subtitles + * + * \param channel Subtitle channel number + * \param err Optional error code + * + * A movie can contain up to 16 distinct sets of subtitles, each on its own display channel. This can + * be used, for instance, to provide multilanguage support. + * + * Subtitle channels are numbered sequentially, starting from 0, but do not need to be contiguous. + * For example, a movie can have 3 sets of subtitles, on channels 1, 5, and 7. The number of channels + * can be determined once CriMvEasyPlayer::GetMovieInfo() has completed successfully by looking at the + * \a num_subtitle field of the \a CriMvStreamingParameters structure passed to that function. + * + * By default, subtitle playback is off. To turn off subtitles once they have been turned on, pass + * CRIMV_SUBTITLE_CHANNEL_OFF as the value of \a channel. + * + * If the selected subtitle channel does not exist, subtitles will not be displayed. + * + * \remarks + * If an application turns on subtitle display with this function, it must periodically call + * CriMvEasyPlayer::GetSubtitleOnTime(), or else movie playback will stall. + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::GetSubtitleOnTime() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 取得する字幕チャネルの設定 + * \param channel 字幕チャネル + * \param err エラー情報(省略可) + * + * 取得する字幕チャネルを設定します。デフォルトは字幕取得無しです。 + * + * CriMvEasyPlayer::DecodeHeader()と CriMvEasyPlayer::GetMovieInfo()を使うことで、再生するムービが + * いくつの字幕を含んでいるかを再生開始前に知ることができます。 + * + * データが存在しないチャネル番号を指定した場合は、字幕は取得できません。
+ * デフォルト設定(字幕取得無し)にしたい場合は、チャネルとしてCRIMV_SUBTITLE_CHANNEL_OFFを指定してください。 + * + * この関数で字幕チャネルを指定した場合は、メインループから定期的に CriMvEasyPlayer::GetSubtitleOnTime() を + * 実行してください。字幕取得を定期的に行わない場合は、ムービ再生が途中で止まります。 + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::DecodeHeader(), CriMvEasyPlayer::GetSubtitleOnTime + */ + void SetSubtitleChannel(CriSint32 channel, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_VIDEO_FRAME + * + * \brief Retrieves subtitle data for the current frame, if available + * + * \param bufptr Buffer to receive subtitle data + * \param bufsize Size of buffer, in bytes + * \param err Optional error code + * + * \return The number of bytes copied into \a bufptr + * + * If the movie contains subtitle data, and there is a subtitle for the current frame, up to \a bufsize + * bytes of the subtitle data for the active subtitle channel will be copied into \a bufptr. Otherwise, + * the entire buffer will be filled with zeroes. + * + * \remarks + * If an application turns on subtitle display with CriMvEasyPlayer::SetSubtitleChannel(), it must + * periodically call this function, or else movie playback will stall. + * + * \remarks + * An application should not make assumptions as to whether the returned data is NUL-terminated. + * + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ + /*JP + * \ingroup MODULE_VIDEO_FRAME + * \brief 字幕データの取得 + * \param bufptr 出力バッファポインタ + * \param bufsize 出力バッファサイズ [byte] + * \param err エラー情報(省略可) + * \return 取得した字幕データのサイズ[byte]を返します。 + * + * 表示時刻になっている字幕データを取得します。 + * この関数を呼び出す場合は、字幕用バッファの実体を確保したうえで呼び出してください。
+ * 字幕データは引数 bufptr で指定したバッファに書き出されます。
+ * もし字幕データが bufsize よりも大きい場合は、bufsize に収まる量だけ書き出し、残りは破棄されます。 + * + * もしも表示時刻の字幕が無い場合は、バッファの中身はクリアされます。 + * + * CriMvEasyPlayer::SetSubtitleChannel()で存在する字幕チャネルを指定している場合は、 + * メインループから定期的に本関数を実行してください。
+ * 実行しない場合は、ムービ再生が途中で止まります。 + * + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ + CriUint32 GetSubtitleOnTime(CriUint8 *bufptr, CriUint32 bufsize, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets a secondary sound interface + * + * \param sound Secondary sound interface to attach to this handle + * \param err Optional error code + * + * A subaudio interface allows an application to play two audio tracks at the same time. This is + * typically used to play a dialog track or sound effects along with background music. After calling + * this function, an application needs to call CriMvEasyPlayer::SetSubAudioTrack() to choose the secondary + * audio track to play. + * + * Note that you must create a separate sound interface to pass to this function. The interface used + * in the CriMvEasyPlayer::Create() call can not be used. + * + * If a subaudio interface is used, the application must call CriMvEasyPlayer::DetachSubAudioInterface() + * when the EasyPlayer handle reaches the MVEASY_STATUS_STOP or MVEASY_STATUS_PLAYEND state before calling + * CriMvEasyPlayer::Destroy(). + * + * Calling CriMvEasyPlayer::ResetAllParameters() will not affect the value set by this function. + * + * \remarks + * If this function is called, it must be called before starting playback (with either CriMvEasyPlayer::Prepare() + * or CriMvEasyPlayer::Start()). + * + * \remarks + * An EasyPlayer handle can not use a subaudio interface and center channel replacement (see + * CriMvEasyPlayer::ReplaceCenterVoice()) at the same time. + * + * \sa CriMvEasyPlayer::DetachSubAudioInterface(), CriMvEasyPlayer::SetSubAudioTrack(), + * CriMvEasyPlayer::ReplaceCenterVoice() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief サブオーディオ用サウンドインタフェースの設定 + * \param sound サブオーディオ用サウンドインタフェース + * \param err エラー情報(省略可) + * + * サブオーディオ(メインオーディオと同時に別のオーディオを再生する機能)のための + * サウンドインタフェースを設定します。
+ * 設定するサウンドインタフェースは、 CriMvEasyPlayer::Create() 時に指定したサウンドインタフェース + * とは「別の」インスタンスでなければいけません。
+ * + * 本関数は、EasyPlayerハンドル作成後、 CriMvEasyPlayer::Start() または CriMvEasyPlayer::Prepare() の + * 呼び出しより前に実行しなければいけません。
+ * + * サブオーディオを再生するには、本関数でサウンドインタフェースを設定したあと、 + * CriMvEasyPlayer::SetSubAudioTrack() でサブオーディオのトラックを指定してください。
+ * + * サブオーディオ用サウンドインタフェースを設定したハンドル破棄を破棄する前に、 + * MVEASY_STATUS_STOP または MVEASY_STATUS_PLAYEND の状態で CriMvEasyPlayer::DetachSubAudioInterface() を呼んでください。 + * なお、サブオーディオ用サウンドインタフェースは CriMvEasyPlayer::ResetAllParameters() を呼び出してもリセットされません。 + * + * 注意:
+ * サブオーディオ機能は、 CriMvEasyPlayer::ReplaceCenterVoice() によるセンターチャネル置き換え機能とは + * 同時に使用できません。
+ * + * \sa CriMvEasyPlayer::DetachSubAudioInterface(), CriMvEasyPlayer::SetSubAudioTrack(), + * CriMvEasyPlayer::ReplaceCenterVoice() + */ + void AttachSubAudioInterface(CriMvSoundInterface *sound, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Removes a secondary audio interface + * + * \param err Optional error code + * + * Removes the secondary sound interface that was set by a call to CriMvEasyPlayer::AttachSubAudioInterface(). + * + * This function should be called when the EasyPlayer handle's state is either MVEASY_STATUS_STOP or + * MVEASY_STATUS_PLAYEND. + * + * \sa CriMvEasyPlayer::AttachSubAudioInterface() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief サブオーディオ用サウンドインタフェースの解除 + * \param err エラー情報(省略可) + * + * 現在設定されているサブオーディオ用サウンドインタフェースを解除します。
+ * + * 本関数は、EasyPlayerハンドルの状態が CriMvEasyPlayer::MVEASY_STATUS_STOP または + * CriMvEasyPlayer::MVEASY_STATUS_PLAYEND の時に呼び出してください。
+ * + * \sa CriMvEasyPlayer::AttachSubAudioInterface() + */ + void DetachSubAudioInterface(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the secondary audio track + * + * \param track Track number + * \param err Optional error code + * + * A secondary, or subaudio, track is typically used to play a dialog track or sound effects along + * with a movie. An application can support several different languages by setting the desired language + * track with this function. By default, the subaudio track is disabled, even if the interface has been set. + * + * Subaudio is enabled with CriMvEasyPlayer::AttachSubAudioInterface(). If the interface has not been set, + * this function will have no effect. + * + * The main audio track for the movie is set with CriMvEasyPlayer::SetAudioTrack(). If the same track + * number is used for the main and subaudio, the subaudio will not play. + * + * To turn off the subaudio track, pass CRIMV_CENTER_VOICE_OFF as the track number. + * + * \remarks + * If this function is called, it must be called before starting playback (with either CriMvEasyPlayer::Prepare() + * or CriMvEasyPlayer::Start()). + * + * \remarks + * An EasyPlayer handle can not use a subaudio interface and center channel replacement (see + * CriMvEasyPlayer::ReplaceCenterVoice()) at the same time. + * + * \sa CriMvEasyPlayer::AttachSubAudioInterface(), CriMvEasyPlayer::ReplaceCenterVoice() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief サブオーディオトラックの設定 + * \param track サブオーディオ再生するトラック番号 + * \param err エラー情報(省略可) + * + * サブオーディオトラックを設定します。デフォルト値は CRIMV_CENTER_VOICE_OFF です。
+ * + * サブオーディオを再生するには、 CriMvEasyPlayer::AttachSubAudioInterface() でサウンドインタフェースを設定したあと、 + * 本関数でサブオーディオのトラックを指定してください。
+ * 本関数の呼び出しは、 CriMvEasyPlayer::Start() または CriMvEasyPlayer::Prepare() の呼び出しより前でなければいけません。
+ * + * メインオーディオのトラックは CriMvEasyPlayer::SetAudioTrack() で指定します。 + * サブオーディオトラックとしてメインオーディオと同じトラックを指定した場合は、サブオーディオからは何も再生されません。
+ * + * サブオーディオトラックには、センターチャネル置き換え機能とは異なりチャネル数の制限はありません。 + * モノラル、ステレオ、5.1ch のいずれのトラックもサブオーディオとして使用することができます。
+ * + * 注意:
+ * サブオーディオ機能は、 CriMvEasyPlayer::ReplaceCenterVoice() によるセンターチャネル置き換え機能とは + * 同時に使用できません。
+ * + * \sa CriMvEasyPlayer::AttachSubAudioInterface() + */ + // default value is -1. + void SetSubAudioTrack(CriSint32 track, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Retrieves the secondary audio track + * + * \param err Optional error code + * \return track number Current subaudio track number + * + * When you successfully set the subaudio track, this function return the track number + * that you specified by CriMvEasyPlayer::SetSubAudioTrack(). Otherwise, it retuns CRIMV_CENTER_VOICE_OFF. + * + * \sa CriMvEasyPlayer::SetSubAudioTrack() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief サブオーディオトラックの取得 + * \param err エラー情報(省略可) + * \return トラック番号 現在設定されているトラック番号 + * + * サブオーディオ再生が有効になっていれば、ユーザがCriMvEasyPlayer::SetSubAudioTrack()で設定した + * サブオーディオトラック番号を返します。 + * + * サブオーディオ再生が有効でない場合や、サブオーディオトラックを指定していなかった場合は、 + * CRIMV_CENTER_VOICE_OFFを返します。 + * + * \sa CriMvEasyPlayer::SetSubAudioTrack() + */ + CriSint32 GetSubAudioTrack(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Replaces the center channel of a 5.1ch audio track + * + * \param track Track number to use + * \param err Optional error code + * + * If the current audio track for a movie (set with CriMvEasyPlayer::SetAudioTrack()) is in 5.1ch + * surround sound, the center channel can be replaced with a different, mono, track. This does not + * affect any of the other channels in the 5.1ch track. + * + * If the current audio track is not 5.1ch, or the replacement track is not monaural, this call will + * have no effect. + * + * Passing CRIMV_CENTER_VOICE_OFF as the value of \a track will undo the replacement and revert to + * playing the original center channel of th 5.1ch track. + * + * \remarks + * An EasyPlayer handle can not use center channel replacement and a subaudio interface (see + * CriMvEasyPlayer::AttachSubAudioInterface() and CriMvEasyPlayer::SetSubAudioTrack()) at the same time. + * + * \sa CriMvEasyPlayer::SetAudioTrack(), CriMvEasyPlayer::AttachSubAudioInterface(), + * CriMvEasyPlayer::SetSubAudioTrack() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief センターボイスの設定 + * \param track ボイストラック番号 + * \param err エラー情報(省略可) + * + * 5.1ch オーディオ再生時に、センターチャネルだけを別のモノラルトラックと置き換えることができます。
+ * 本関数は、置き換え用のモノラルデータが入ったオーディオトラックを設定します。
+ * 5.1ch BGM に対して、ボイスだけを複数種類から差し替えたい場合に使用してください。 + * + * デフォルトはセンターボイス指定無しです。 + * + * この関数を使用した場合、メインのオーディオトラックとして再生している5.1chデータのセンターチャネル + * は破棄され、代わりにセンターボイスとして指定したデータが入ります。 + * + * (a) センターボイスとして使用できるのはモノラルのオーディオだけです。
+ * (b) センター置き換えが有効なのはメインのオーディオが5.1chの場合だけです。 + * + * この二つの条件を満たしていない場合は、本関数で設定した値は無視されます。 + * + * デフォルト値に戻したい場合は、チャネルとしてCRIMV_CENTER_VOICE_OFFを指定してください。 + * + * \sa CriMvEasyPlayer::SetAudioTrack(), CriMvEasyPlayer::AttachSubAudioInterface(), + * CriMvEasyPlayer::SetSubAudioTrack() + */ + void ReplaceCenterVoice(CriSint32 track, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets a callback function that will set the movie file + * + * \param func Callback function + * \param usrobj Pointer to user-provided data + * \param err Optional error code + * + * Normally, the movie file is provided directly, via CriMvEasyPlayer::SetFile() or + * CriMvEasyPlayer::SetData(), before playback is started. Setting a file request callback + * allows an application to do \a concatenated \a playback, playing multiple movies, one + * after the other. + * + * If the callback function is set, it will be called when + * + * - The last data chunk of the current movie has been read by EasyPlayer. + * - Any of the playback functions (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), + * or CriMvEasyPlayer::DecodeHeader()) are called and the movie file has not been set. + * + * The callback should call CriMvEasyPlayer::SetFile() or CriMvEasyPlayer::SetData() if the + * application wants to continue playback. Otherwise, playback will end once the callback returns. + * + * The \a usrobj parameter specifies a pointer to arbitrary data, that will be passed as the + * second parameter to the callback. + * + * The prototype of the callback function is + * + * void callback(CriMvEasyPlayer *mveasy, void *usrobj) + * + * where + * + * mveasy is the EasyPlayer object + * usrobj is the pointer to user data that was passed to SetFileRequestCallback(). + * + * \remarks + * In order to do concatenated playback, all movies must have the same + * + * \remarks + * - video resolution + * - framerate + * - video codec + * - audio track structure + * - subtitle structure + * + * \remarks + * The same audio track structure means that all movies must have the same number of tracks, and the + * same track number must be of the same audio type for each movie. For instance, if the first movie has + * 2 audio tracks, with track 1 being stereo and track 2 being mono, then \a all other movies would have + * to have 2 tracks, track 1 stereo and track 2 mono. + * + * \remarks + * Subtitles have to match in the number of channels. For instance, if the first movie had 3 subtitle + * channels, then all other movies would need 3 channels. It is also important to keep the languages on + * the same tracks for each movie, since otherwise the application would get confused. CRI Movie makes + * no assumptions about languages or the interpretation of subtitles; subtitles are simply treated as + * binary data. + * + * \remarks + * Currently, cuepoints are not supported with concatenated playback. + * + * \sa CriMvEasyPlayer::SetFile(), CriMvEasyPlayer::SetData() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ファイル要求コールバック関数の登録 + * \param func ファイル要求コールバック関数 + * \param usrobj ユーザオブジェクト + * \param err エラー情報(省略可) + * + * ムービの連結再生を行うために、ムービファイルを要求するコールバック関数を登録します。 + * このコールバック関数は以下のタイミングで発生します。 + * + * ・ムービファイルを読み込み終了した時。
+ * ・ファイルの指定無しで再生を開始した時。 + * + * ファイル要求コールバック関数内で CriMvEasyPlayer::SetFile() または CriMvEasyPlayer::SetData() + * を呼び出すことで、連続して次のムービファイルを指定することができます。
+ * SetFile() も SetData() も呼び出さなかった場合は、読み込み済みのムービが終わると + * 再生終了になります。 + * + * ファイル要求コールバック発生時、コールバック関数の第二引数usrobjには、登録時に指定 + * したユーザオブジェクトが渡されます。登録ファイルリストなどの管理に利用してください。 + * + * 連結再生できるムービファイルには以下の条件があります。
+ * - ビデオ解像度が同じ + * - ビデオのフレームレートが同じ + * - ビデオのコーデックが同じ + * - オーディオおよび字幕のトラック構成が同じ + * + * \sa CriMvEasyPlayer::SetFile(), CriMvEasyPlayer::SetData() + */ + void SetFileRequestCallback(void (*func)(CriMvEasyPlayer *mveasy, void *usrobj), + void *usrobj, CriError &err=CriMv::ErrorContainer); + +#if defined(XPT_TGT_PC) + /*EN + * \ingroup MODULE_OPTION + * \brief Set processor parameters for decoding on PC + * + * \param num_threads Number of additional threads for load distribution in decoding (Maximum 3 threads) + * \param affinity_mask Pointer to an array of thread affinity masks for each thread specified with num_threads. + * \param priority Thread priority of the decoding threads for load balancing + * \param err Optional error code + * + * This function sets the processor parameters for decoding. Use it when you want to change + * processors or thread priority for decoding load distribution. + * + * If this function is called, it must be called before calling any of the playback functions + * (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()). + * + * On initialization, CRI Movie prepares three worker threads for distributed decoding.
+ * + * \a num_threads specifies how many worker threads CRI Movie should use.
+ * \a affinity_mask is an array of affinity masks for the worker threads. This array must have + * \a num_threads many elements. The format of \a affinity_mask is same as for the value passed to the + * Win32 SetThreadAffinityMask() API function.
+ * \a priority is used as the thread priority for all of the threads specified by \a num_threads. + * + * If this function is called, three distributed decoding threads will run in parallel by default. + * Also, processor assignment of the decoding threads is handled by the operating system, and their + * priority will be normal. + * + * To reset the parameters, call this function again, passing CRIMV_DEFAULT_AFFNITY_MASK_PC and + * CRIMV_DEFAULT_THREAD_PRIORITY_PC as the affinity masks and thread priority. + * + * \sa CRIMV_DEFAULT_AFFNITY_MASK_PC, CRIMV_DEFAULT_THREAD_PRIORITY_PC + */ + /*JP + * \ingroup MODULE_OPTION + * \brief PCでデコード処理に使う追加プロセッサ設定 + * \param num_threads 負荷分散デコード用に使用する追加スレッドの数 (最大3つ) + * \param affinity_masks スレッドアフィニティマスクの配列へのポインタ。num_threadsで指定したスレッドごとのマスク値。 + * \param priority 負荷分散デコードスレッドの優先度 + * \param err エラー情報(省略可) + * + * デコード処理を分散して処理するためのプロセッサを指定できます。 + * デコード処理に行うプロセッサやスレッド優先度を変更したい場合に使用してください。 + * 本関数は再生開始(Start, Prepare, DecodeHader)前に呼び出す必要があります。 + * + * CRI Movieは初期化の際に3つの分散デコード用のワーカースレッドを用意します。 + * num_threads引数で、そのうちのいくつのスレッドを実際に使用するかを指定できます。 + * アプリケーションから明示的にプロセッサ割り当てを行いたい場合、個々のスレッドに対して + * アフィニティマスクを設定してください。 + * アフィニティマスクの値は、Win32 APIのSetThreadAffinityMaskの引数と同じ書式です。 + * スレッド優先度は、num_threadsで指定したデコードに使用するスレッドに対して適用されます。 + * + * この関数を呼ばなかった場合、3つのスレッドで並列デコードを行います。 + * デコードスレッドのプロセッサは割り当ては全てOS任せで、優先度はスレッド標準になります。 + * + * 一度本関数で設定を変更した後、状態を戻したい場合は、CRIMV_DEFAULT_AFFNITY_MASK_PC, CRIMV_DEFAULT_THREAD_PRIORITY_PCを + * 引数として指定し、再度呼び出してください。 + * + * \sa CRIMV_DEFAULT_AFFNITY_MASK_PC, CRIMV_DEFAULT_THREAD_PRIORITY_PC + */ + void SetUsableProcessors_PC(CriSint32 num_threads, const CriUint32 *affinity_mask, CriSint32 priority, + CriError &err=CriMv::ErrorContainer); + +#endif + +#if defined(XPT_TGT_XBOX360) + /*EN + * \ingroup MODULE_OPTION + * \brief Set processor parameters for decoding + * \param processors_param Processor Parameters + * \param err Optional error code + * + * \brief Set processor parameters for decoding + * \param processors_param Processor Parameters + * \param err Optional error code + * + * This function sets the processor parameters for decoding, along the priority of the + * decoding threads. + * + * If this function is called, it must be called before calling any of the playback functions + * (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()). + * + * If you don't call this function, the EasyPlayer handle uses Processor 3 (Core 0, Thread 0) + * and Processor 5 (Core 0, Thread 0). + * + * \sa CriMvProcessorParameters_XBOX360 + */ + /*JP + * \ingroup MODULE_OPTION + * \brief Xbox360でデコードに使うプロセッサ設定 + * \param processors_param 使用プロセッサパラメータ + * \param err エラー情報(省略可) + * + * デコードに使用するプロセッサを指定します。
+ * 本関数は再生開始(Start, Prepare, DecodeHader)前に呼び出す必要があります。 + * + * また、デコードに使用する内部スレッドの優先度の設定が出来ます。 + * + * デフォルトのプロセッサ設定では、プロセッサ3(コア1スレッド1)とプロセッサ5 + * (コア2スレッド1)を使用します。 + * + * \sa CriMvProcessorParameters_XBOX360 + */ + void SetUsableProcessors_XBOX360(const CriMvProcessorParameters_XBOX360 *processors_param, + CriError &err=CriMv::ErrorContainer); +#endif + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets the frame where playback will start + * + * \param seek_frame_id Frame (0-based) to start playing from + * \param err Optional error code + * + * To play a movie from other than the first frame, call this function before starting playback. + * To seek to a new frame when the movie is already playing, call CriMvEasyPlayer::Stop() and wait + * for the handle to change to the MVEASY_STATUS_STOP state, call this function with the desired + * frame number, then call CriMvEasyPlayer::Start() again. + * + * Valid values for seek_frame_id are from 0 to \a num_frames - 1, where \a num_frames can be found by + * + *

+	 *
+	 *   CriMvStreamingParameters streaming_params;
+	 *   CriSint32                num_frames;
+	 *
+	 *   GetMovieInfo(streaming_params);
+	 *   num_frames = streaming_params.video_prm[0].total_frames;
+	 *
+	 * 
+ * + * Refer to \ref usr_mech7 for more information. + * + * \remarks + * If the value of \a seek_frame_id is out of range, playback will start from frame 0. + * + * \sa CriMvStreamingParameters + */ + /*JP + * \ingroup MODULE_OPTION + * \brief シーク再生開始位置の設定 + * \param seek_frame_id シーク再生開始するフレーム番号(0~) + * \param err エラー情報(省略可) + * + * シーク再生を開始するフレーム番号を指定します。 + * + * 再生開始前( CriMvEasyPlayer::Prepare()または CriMvEasyPlayer::Start()呼び出し前)に本関数を実行してください。 + * また、この関数はムービの再生中に呼び出すことは出来ません。再生中にシークをする場合は、一度再生を停止してから + * 本関数を呼び出してください。 + * + * 本関数を実行しなかった場合、またはフレーム番号0を指定した場合はムービの先頭から再生を開始します。 + * 指定したフレーム番号が、ムービデータの総フレーム数より大きかったり負の値だった場合もムービの先頭から再生します。 + * + * \ref usr_mech7 もあわせて参照してください。 + * + */ + void SetSeekPosition(CriSint32 seek_frame_id, CriError &err=CriMv::ErrorContainer); + + /*EN + * + * \brief Calculates a frame ID from a frame time + * + * \param count Timer counter + * \param unit Counter increment per second + * \param err Optional error code + * + * \return Frame ID corresponding to given time + * + * Each frame of a movie corresponds to a particular display time, based on the framerate. Given a + * time from the start of playback, this function will return the ID of the specific frame that should + * be displayed, barring any delays or skipped frames, at that time. + * + * The time, in seconds, is specified by \a count / \a unit.
+ * + * This function can be used for, among other things, jumping to a particular frame when a cuepoint is reached. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvEasyPlayer::CalcTimeFromFrameId(); + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 再生時刻からフレーム番号の計算 + * \param count タイマカウント + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * \param err エラー情報(省略可) + * \return frame ID + * + * 再生時刻からフレーム番号を計算します。 + * この関数は、EasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあとに使用できます。 + * + * シーク再生開始位置を、時刻から計算したいときに使用してください。 + * (例えばキューポイント情報からシーク位置を決定する場合など。) + * + * \sa CriMvEasyPlayer::CalcTimeFromFrameId(); + */ + CriSint32 CalcFrameIdFromTime(CriUint64 count, CriUint64 unit, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Calculates a frame time from a frame ID + * + * \param frame_id Frame ID + * \param unit Counter increment per second + * \param err Optional error code + * + * \return Timer counter corresponding to given frame ID + * + * Each frame of a movie corresponds to a particular display time, based on the framerate. Given a + * frame ID and the number of timer intervals per second, this function will return the timer count + * of the display time for that frame. + * + * The display time, in seconds, for this frame is calculated by dividing the timer count by the timer + * interval. + * + * If you have the movie frame, you do not have to calculate the time. The \a time and \a tunit fields + * of the CriMvFrameInfo structure that is passed the GetFrameOnTimeXXX() and DiscardNextFrame() + * functions will contain this information. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvEasyPlayer::CalcFrameIdFromTime(), CriMvFrameInfo + */ + /*JP + * \ingroup MODULE_OPTION + * \brief フレーム番号から再生時刻の計算 + * \param frame_id frame ID + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * \param err エラー情報(省略可) + * \return タイマカウント + * + * フレーム番号から再生時刻を計算します。 + * この関数は、EasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあとに使用できます。 + * + * 実際にフレーム取得した場合は、計算の必要はありません。フレーム情報構造体の時刻を参照してください。 + * + * \sa CriMvEasyPlayer::CalcFrameIdFromTime(), CriMvFrameInfo + */ + CriUint64 CalcTimeFromFrameId(CriSint32 frame_id, CriUint64 unit, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Find the next event point, if any, after the given time counter + * + * \param count Timer counter + * \param unit Counter increment per second + * \param type Type of event point to look for + * \param eventinfo Returned event point information structure + * \param err Optional error code + * + * \return Frame ID corresponding to given time + * + * Event points allow an application to associate arbitrary actions with specific points in a movie. + * This function will search forward in the movie for the next event point after the given time + * (specifed as \a count / \a unit). If an event point is found, \a eventinfo will be populated with + * the information about the event point, and the function will return the corresponding frame ID. + * + * \a type is an application-defined value that can be used to categorize event points, and is specified + * when the movie is encoded (see link to event-point-specification-section for more information + * about creating event points.). If -1 is passed as the value of \a type, all event points will be + * searched. Otherwise, only matching event point types will be searched. + * + * If no event point of the requested type is found, this function will return -1. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvEasyPlayer::SearchPrevEventPointByTime(); + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 指定時刻直後のイベントポイントの検索 + * \param count タイマカウント + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * \param type 検索対象とするイベントポイントのtype値 + * \param eventinfo 発見したイベントポイントの情報 + * \param err エラー情報(省略可) + * \return frame ID + * + * 指定時刻の次にあるイベントポイントを検索し、イベントポイント情報とフレーム番号を取得します。 + * この関数は、EasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあとに使用できます。 + * + * 検索の対象となるのは type で指定した値が一致するイベントポイントです。 + * type に -1を指定した場合は、全てのイベントポイントが検索対象となります。 + * + * 検索対象となるイベントポイントが発見できなかった場合は、フレーム番号は-1を返します。 + * + * \sa CriMvEasyPlayer::SearchPrevEventPointByTime(); + */ + CriSint32 SearchNextEventPointByTime(CriUint64 count, CriUint64 unit, CriSint32 type, + CriMvEventPoint &eventinfo, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Find the previous event point, if any, before the given time counter + * + * \param count Timer counter + * \param unit Counter increment per second + * \param type Type of event point to look for + * \param eventinfo Returned event point information structure + * \param err Optional error code + * + * \return Frame ID corresponding to given time + * + * Event points allow an application to associate arbitrary actions with specific points in a movie. + * This function will search backward in the movie (i.e. towards the beginning) for the next event + * point before the given time (specifed as \a count / \a unit). If an event point is found, + * \a eventinfo will be populated with the information about the event point, and the function will + * return the corresponding frame ID. + * + * \a type is an application-defined value that can be used to categorize event points, and is specified + * when the movie is encoded (see link to event-point-specification-section for more information + * about creating event points.). If -1 is passed as the value of \a type, all event points will be + * searched. Otherwise, only matching event point types will be searched. + * + * If no event point of the requested type is found, this function will return -1. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * + * \sa CriMvEasyPlayer::SearchNextEventPointByTime(); + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 指定時刻直前のイベントポイントの検索 + * \param count タイマカウント + * \param unit 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 + * \param type 検索対象とするイベントポイントのtype値 + * \param eventinfo 発見したイベントポイントの情報 + * \param err エラー情報(省略可) + * \return frame ID + * + * 指定時刻の手前にあるイベントポイントを検索し、イベントポイント情報とフレーム番号を取得します。 + * この関数は、EasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあとに使用できます。 + * + * 検索の対象となるのは type で指定した値が一致するイベントポイントです。 + * type に -1を指定した場合は、全てのイベントポイントが検索対象となります。 + * + * 検索対象となるイベントポイントが発見できなかった場合は、フレーム番号は-1を返します。 + * + * \sa CriMvEasyPlayer::SearchNextEventPointByTime(); + */ + CriSint32 SearchPrevEventPointByTime(CriUint64 count, CriUint64 unit, CriSint32 type, + CriMvEventPoint &eventinfo, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Gets the list of all event points in the movie + * + * \param err Optional error code + * + * \return Pointer to the list of event points, or NULL if there are no event points + * + * CRI Movie considers a cue point list to be the number of event points in a movie, and a pointer to + * an array of event point structures. Event points allow an application to associate arbitrary actions + * with specific points in a movie. + * + * The returned pointer points to an area inside of the EasyPlayer's work buffer. An application should + * not attempt to write to it. + * + * \remarks + * This function can be called once the EasyPlayer handle status has reached MVEASY_STATUS_WAIT_PREP. + * The returned information is valid through the MVEASY_STATUS_STOP state. Once the EasyPlayer handle + * has been destroyed, or the movie has been restarted (by calling CriMvEasyPlayer::Start(), + * CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()), the cuepoint information will be + * invalid. + * + */ + /*JP + * \ingroup MODULE_OPTION + * \brief キューポイント情報(イベントポイント一覧)の取得 + * \param err エラー情報(省略可) + * \return Cue point info (Event point list) + * + * キューポイント情報(イベントポイント一覧)を取得します。 + * この関数は、EasyPlayerハンドルの状態が MVEASY_STATUS_WAIT_PREP 以降になったあとに使用できます。 + * + * この関数で取得するキューポイント情報は、再生ハンドルのワークバッファを直接参照しています。
+ * 再生停止状態での参照は可能ですが、次の再生を開始した後は参照を禁止します。
+ * このキューポイント情報を別のメモリにコピーした場合もこの条件は変わりません。 + * + */ + CriMvCuePointInfo* GetCuePointInfo(CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Sets a function that will be called when a cue point is reached + * + * \param func Callback function + * \param usrobj Pointer to user-provided data + * \param err Optional error code + * + * Beginning with version 2.0, CRI Movie allows a movie to specify arbitrary actions to + * happen at various points on the timeline. These are referred to as \a cue \a points, or, + * more generally, as \a event \a points. If a cue point callback has been installed for the + * movie, it will be called whenever a cuepoint has been reached. + * + * The \a usrobj parameter specifies a pointer to arbitrary data, that will be passed as the + * third parameter to the callback. + * + * The prototype of the callback function is + * + * void callback(CriMvEasyPlayer *mveasy, CriMvEventPoint *eventinfo, void *usrobj) + * + * where + * + * mveasy is the EasyPlayer object
+ * eventinfo is the event info structure that was reached
+ * usrobj is the pointer to user data that was passed to SetFileRequestCallback().
+ * + * \remarks + * Do not call any movie playback functions (for example, CriMvEasyPlayer::Stop()) from the callback + * function. If you need to do this, set a flag from the callback and refer to it in your main loop. + * + * \sa CriMvEventPoint + */ + /*JP + * \ingroup MODULE_OPTION + * \brief キューポイントコールバック関数の登録 + * \param func キューポイントコールバック関数 + * \param usrobj ユーザオブジェクト + * \param err エラー情報(省略可) + * + * キューポイントのコールバック関数を登録します。 + * このコールバック関数は、ムービの再生時刻が各イベントポイントで指定された時刻を経過した時に発生します。 + * コールバック関数の呼び出し判定は CriMvEasyPlayer::Update() から行われます。 + * + * キューポイントコールバック発生時、コールバック関数の第2引数 eventinfo にはエベントポイント情報が、 + * 第3引数usrobjには、登録時に指定したユーザオブジェクトが渡されます。 + * + * キューポイントコールバック関数内では、ムービ再生をコントロールする関数(例えば CriMvEasyPlayer::Stop()) + * を呼び出してはいけません。 + * + * \sa CriMvEventPoint + */ + void SetCuePointCallback(void (*func)(CriMvEasyPlayer *mveasy, CriMvEventPoint *eventinfo, void *usrobj), + void *usrobj, CriError &err=CriMv::ErrorContainer); + + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Resets movie handle parameters to their default values + * + * \param err Optional error code + * + * This function will reset most parameters back to their default values. Call this when you are + * reusing an EasyPlayer handle and need to quickly undo changes to a number of parameters. + * + * Note that this will not remove a subaudio interface (set by CriMvEasyPlayer::AttachSubAudioInterface()). + * CriMvEasyPlayer::DetachSubAudioInterface() must be called instead. + * + * \remarks + * This function can be called once the EasyPlayer handle status is either MVEASY_STATUS_STOP or + * MVEASY_STATUS_PLAYEND. + * + * + *
Setting API Reset by ResetAllParameters() Reset by Stop() + *
SetFile YES (*1) + *
SetData YES (*1) + *
Pause YES YES + *
SetMasterTimer YES NO + *
SetNumberOfFramePools YES NO + *
SetBufferingTime YES NO + *
SetReloadThresholdTime YES NO + *
SetMaxBitrate YES NO + *
SetAudioTrack YES NO + *
SetLoopFlag YES NO + *
SetStreamingParameters YES NO + *
AttachSubAudioInterface NO NO + *
SetSubAudioTrack YES NO + *
ReplaceCenterVoice YES NO + *
SetFileRequestCallback YES NO + *
SetSeekPosition YES NO + *
SetCuePointCallback YES NO + *
+ * + * (*1) Normally, values set by SetFile() or SetData() are not reset by a call to Stop(). However, + * if a file request callback has been set (via CriMvEasyPlayer::SetFileRequestCallback()), this + * setting will be reset. + * + * \sa CriMvEasyPlayer::Stop(), CriMvEasyPlayer::SetFileRequestCallback() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief パラメータのリセット + * \param err エラー情報(省略可) + * + * 再生ハンドルに設定されたパラメータ類をリセットします。
+ * ただしサブオーディオ用インタフェースだけはリセットされませんので、アプリケーションで明示的に + * CriMvEasyPlayer::DetachSubAudioInterface() を呼び出してください。 + * + * 本関数はハンドル状態が MVEASY_STATUS_STOP または MVEASY_STATUS_PLAYEND の時に呼び出してください。 + * + * + *
設定関数 ResetAllParametersによる
リセット処理
Stopによる
リセット処理 + *
SetFile o (*1) + *
SetData o (*1) + *
Pause o o + *
SetMasterTimer o x + *
SetNumberOfFramePools o x + *
SetBufferingTime o x + *
SetReloadThresholdTime o x + *
SetMaxBitrate o x + *
SetAudioTrack o x + *
SetLoopFlag o x + *
SetStreamingParameters o x + *
AttachSubAudioInterface x x + *
SetSubAudioTrack o x + *
ReplaceCenterVoice o x + *
SetFileRequestCallback o x + *
SetSeekPosition o x + *
SetCuePointCallback o x + *
+ * (*1) 通常はリセットされません。ただしファイル要求コールバックが登録されていた場合はリセットされます。 + * + * \sa CriMvEasyPlayer::Stop() + */ + void ResetAllParameters(CriError &err=CriMv::ErrorContainer); + + /* 再生用ワークバッファおよび下位モジュールの解放(明示的な呼び出し用) */ + void ReleasePlaybackWork(CriError &err=CriMv::ErrorContainer); + +public: /* for DEBUG */ + /*//EN + * \ingroup MODULE_OPTION + * + * \brief Sets the maximum movie data read size + * + * \param max_chunk_size The maximum read size, in bytes + * \param err Optional error code + * + * This is a DEBUG function and should not normally need to be used by applications. + * + * Sets the maximum read size. CRI Movie will attempt to read this many bytes each time it + * needs to load more movie data from disk. + * + * If this function is called, it must be called before calling any of the playback functions + * (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()). + * + * To revert to the default behavior, pass 0 as \a max_chunk_size. + * + * \remarks + * If this function is called, the new value for \a max_chunk_size will not be reflected in the + * CriMvStreapingParameters structure. A call to CriMvEasyPlayer::GetMovieInfo() will return the + * original value that was set in the movie header. + * + * \remarks + * If you call CriMvEasyPlayer::SetStreamingParameters(), this function can not be used. + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::SetMinBufferSize() + */ + /*//JP + * \ingroup MODULE_OPTION + * \brief 最大チャンクサイズの指定 + * \param max_chunk_size 最大チャンクサイズ[byte] + * \param err エラー情報(省略可) + * + * ムービデータの最大チャンクサイズを指定します。
+ * 現在のライブラリでは、本関数はアプリケーションから使用する必要はありません。
+ * + * 本関数で設定した最大チャンクサイズは、CriMvEasyPlayer::GetMovieInfo 関数で取得するムービ情報には反映されません。 + * CriMvEasyPlayer::GetMovieInfo 関数で取得できるのはムービデータの本来の情報です。
+ * + * 本関数の呼び出しは、 CriMvEasyPlayer::Prepare 関数または CriMvEasyPlayer::Start 関数の前までに実行してください。 + * + * 最大チャンクサイズに 0を指定した場合、最大チャンクサイズはムービデータの持つ値となります。
+ * また、アプリケーションが CriMvEasyPlayer::SetStreamingParameters 関数を呼び出した場合は本関数で + * 設定した値よりも、 CriMvEasyPlayer::SetStreamingParameters 関数の指定が優先されます。 + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::SetMinBufferSize() + */ + void SetMaxChunkSize(CriUint32 max_chunk_size, CriError &err=CriMv::ErrorContainer); + + /*//EN + * \ingroup MODULE_OPTION + * + * \brief Sets the minimum movie data buffer size + * + * \param min_buffer_size The minimum buffer size, in bytes + * \param err Optional error code + * + * This is a DEBUG function and should not normally need to be used by applications. + * + * Sets the minimum buffer size used for reading movie data from disk. + * + * If this function is called, it must be called before calling any of the playback functions + * (CriMvEasyPlayer::Start(), CriMvEasyPlayer::Prepare(), or CriMvEasyPlayer::DecodeHeader()). + * + * To revert to the default behavior, pass 0 as \a max_chunk_size. + * + * \remarks + * If this function is called, the new value for \a min_buffer_size will not be reflected in the + * CriMvStreapingParameters structure. A call to CriMvEasyPlayer::GetMovieInfo() will return the + * original value that was set in the movie header. + * + * \remarks + * If you call CriMvEasyPlayer::SetStreamingParameters(), this function can not be used. + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::SetMaxChunkSize() + */ + /*//JP + * \ingroup MODULE_OPTION + * \brief 最小バッファサイズの指定 + * \param min_buffer_size 最小バッファサイズ[byte] + * \param err エラー情報(省略可) + * + * ムービデータの最小バッファサイズを指定します。
+ * 現在のライブラリでは、本関数はアプリケーションから使用する必要はありません。
+ * + * 本関数で設定した最小バッファサイズは、CriMvEasyPlayer::GetMovieInfo 関数で取得するムービ情報には反映されません。 + * CriMvEasyPlayer::GetMovieInfo 関数で取得できるのはムービデータの本来の情報です。
+ * + * 本関数の呼び出しは、 CriMvEasyPlayer::Prepare 関数または CriMvEasyPlayer::Start 関数の前までに実行してください。 + * + * 最小バッファサイズに 0を指定した場合、最小バッファサイズはムービデータの持つ値となります。
+ * また、アプリケーションが CriMvEasyPlayer::SetStreamingParameters 関数を呼び出した場合は本関数で + * 設定した値よりも、 CriMvEasyPlayer::SetStreamingParameters 関数の指定が優先されます。 + * + * \sa CriMvEasyPlayer::GetMovieInfo(), CriMvEasyPlayer::SetMaxChunkSize() + */ + void SetMinBufferSize(CriUint32 min_buffer_size, CriError &err=CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Retrieves various movie playback statistics + * + * \param playinfo Playback statistics structure + * \param err Optional error code + * + * This is a DEBUG function and is not normally needed by applications. + * + * Retrieves a number of performance statistics dealing with movie playback, including how often + * a frame could not be retrieved and how close the plaback framerate is to the movie's expected + * playback. + * + * This information is updated on every call to CriMvEasyPlayer::IsNextFrameOnTime(). In order for + * the values to be accurate, an application should call IsNextFrameOnTime() once each time through + * its main loop. Calling IsNextFrameOnTime() too often or not often enough will result in + * misleading statistics. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief ムービ再生情報の取得 + * \param playinfo ムービ情報(返り値) + * \param err エラー情報(省略可) + * + * 本関数は通常、アプリケーションからは使用しません。デバッグ用の関数です。 + * + * 現在再生しているムービの再生情報 CriMvPlaybackInfo 構造体を取得できます。
+ * この情報からビデオフレームの取得間隔や、ビデオフレームのデコード遅延などを知ることができます。
+ * + * 再生情報はアプリが呼び出す CriMvEasyPlayer::IsNextFrameOnTime() 内で更新します。
+ * アプリケーションが CriMvEasyPlayer::IsNextFrameOnTime()を呼び出さない場合や、メインループで複数回 + * 呼び出す場合は情報が正しく更新されないので注意してください。
+ * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + void GetPlaybackInfo(CriMvPlaybackInfo & playinfo, CriError & err = CriMv::ErrorContainer); + + /*EN + * \ingroup MODULE_OPTION + * + * \brief Gets the result of the last attempt to retrieve a video frame + * + * \param err Optional error code + * + * \return The result of the last frame retrieval + * + * Returns one of the following values: + * + * + * + * + * + * + * + *
Value Meaning
CRIMV_LASTFRAME_OK The frame was successfully retrieved.
CRIMV_LASTFRAME_TIME_EARLY It is too soon to display this frame. The frame time + * is greater than the current playback time.
CRIMV_LASTFRAME_DECODE_DELAY The frame has not been decoded yet, or CRI Movie is not + * done decoding it.
CRIMV_LASTFRAME_DISCARDED The frame was discarded, by calling + * CriMvEasyPlayer::DiscardNextFrame()
+ * + * \remarks + * The result is determined by calling CriMvEasyPlayer::IsNextFrameOnTime(), not the GetFrameOnTimeXXX() + * functions. + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime(), CriMvEasyPlayer::DiscardNextFrame() + */ + /*JP + * \ingroup MODULE_OPTION + * \brief 前回のビデオフレーム取得の結果を取得する + * \param err エラー情報(省略可) + * \return フレーム取得結果の列挙値 + * + * 本関数は通常、アプリケーションからは使用しません。デバッグ用の関数です。 + * + * 前回のビデオフレーム取得の結果を返します。 + * ビデオフレームのデコードが間に合っているのかどうかをチェックすることが出来ます。 + * + * 注意:
+ * ビデオフレーム取得の結果とは、基本的にアプリケーションが呼び出す CriMvEasyPlayer::IsNextFrameOnTime() の結果を元に + * 更新します。GetFrameOnTime関数の結果ではありません。 + * + * \sa CriMvEasyPlayer::IsNextFrameOnTime() + */ + CriMvLastFrameResult GetLastFrameResult(CriError & err = CriMv::ErrorContainer); + + /* [Unofficial] */ + /* Set the number of decoded frames to keep internally during the MVEASY_STATUS_PREP status. */ + /* Adjust the number if you need to reduce latesy for the first frame */ + void SetNumberOfFramesForPrep(CriUint32 num_frames, CriError & err = CriMv::ErrorContainer); + + /* [Unofficial] + * \ingroup MODULE_OPTION + * \brief 再生終了/停止通知コールバック関数の登録 + * \param func 再生終了/停止通知コールバック関数 + * \param usrobj ユーザオブジェクト + * \param err エラー情報(省略可) + * + * 再生終了および再生停止を通知するコールバック関数を登録します。 + * このコールバック関数は、ヘッダ解析/再生準備/再生状態から再生停止/再生終了状態に + * 遷移した直後に一度だけ呼び出されます。 + * コールバック関数の呼び出しは CriMvEasyPlayer::Update() から行われます。 + * + * 登録したコールバック関数内では、ムービ再生をコントロールする関数(例えば CriMvEasyPlayer::Stop()) + * を呼び出してはいけません。 + * + * 注意: MVEASY_STATUS_PLAYEND状態からMVEASY_STATUS_STOP状態への遷移時にはコールバック関数は呼び出されません。 + */ + void SetStopCompleteCallback(void (*func)(CriMvEasyPlayer *mveasy, void *usrobj), + void *usrobj, CriError &err=CriMv::ErrorContainer); + + /* For FAST_LATENCY */ + /*************************************************************************************/ + /* コンフィグ指定のハンドル作成関数 */ + static CriMvEasyPlayer* CRIAPI Create(CriHeap heap, + CriMvHandleConfig *config, + CriMvFileReaderInterface *freader, + CriMvSystemTimerInterface *stimer, + CriMvSoundInterface *sound, + CriError &err=CriMv::ErrorContainer); + + /* For Sofdec2 */ + /*************************************************************************************/ + enum MetaFlag { + MVEASY_META_FLAG_CUE = 0x0001, + MVEASY_META_FLAG_SEEK = 0x0002, + MVEASY_META_FLAG_ALL = MVEASY_META_FLAG_CUE + MVEASY_META_FLAG_SEEK, + + /* Keep enum 4bytes */ + MVEASY_META_FLAG_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + enum ReferFrameResult { + MVEASY_REFER_FRAME_RESULT_OK = (1), + MVEASY_REFER_FRAME_RESULT_SHORT_INPUT = (2), + MVEASY_REFER_FRAME_RESULT_SHORT_CPUTIME = (3), + MVEASY_REFER_FRAME_RESULT_DEMUX_STUCK = (4), + + /* Keep enum 4bytes */ + MVEASY_REFER_FRAME_RESULT_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + /* ユーザからのワーク領域渡し版、ハンドル作成関数 */ + static CriMvEasyPlayer* CRIAPI Create(void *work, CriSint32 work_size, + CriMvHandleConfig *config, + CriMvFileReaderInterface *freader, + CriMvSystemTimerInterface *stimer, + CriMvSoundInterface *sound, + CriError &err=CriMv::ErrorContainer); + + /* 再生用ワーク領域サイズの計算 */ + CriSint32 CalcPlaybackWorkSize(const CriMvStreamingParameters *stmprm, CriError & err = CriMv::ErrorContainer); + + /* 再生用ワーク領域の設定関数 */ + void SetPlaybackWork(void *work, Sint32 work_size, CriError & err = CriMv::ErrorContainer); + + /* メタデータワーク用コールバック関数 */ + void SetMetaDataWorkAllocator(CriMvMetaDataWorkMallocFunc allocfunc, CriMvMetaDataWorkFreeFunc freefunc,void *usrobj, CriMvMetaFlag meta_flag); + + /* 引数で指定したフレーム情報の表示判定 */ + CriBool IsFrameOnTime(const CriMvFrameInfo *frameinfo, CriError &err=CriMv::ErrorContainer); + + /* フレームの参照 */ + ReferFrameResult ReferFrame(CriMvFrameInfo &frameinfo, CriError &err=CriMv::ErrorContainer); + + /* YUV個別バッファフォーマットでのバッファ取得 */ + CriBool LockFrameYUVBuffersWithAlpha(CriMvYuvBuffers &yuvbuffers, CriMvFrameInfo &frameinfo, CriMvAlphaFrameInfo &alpha_frameinfo, CriError &err=CriMv::ErrorContainer); + + /* LockFrameYUVBuffersWithAlphaでロックしたフレームの解放 */ + CriBool UnlockFrameBufferWithAlpha(CriMvFrameInfo *frameinfo, CriMvAlphaFrameInfo *alpha_frameinfo, CriError &err=CriMv::ErrorContainer); + + /* 32bitARGBバッファフォーマットへのコピー関数 */ + CriBool CopyFrameToBufferARGB32(CriUint8 *dstbuf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *srcbufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf, CriError &err=CriMv::ErrorContainer); + + /* 32bitARGBバッファフォーマットへαのみのコピー関数 */ + CriBool CopyAlphaToBufferARGB32( + const CriMvFrameInfo *src_vinf, + CriUint8 *dst_buf, + CriUint32 dst_pitch, + CriUint32 dst_bufsize, + CriError &err=CriMv::ErrorContainer + ); + +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_PC)|| defined(XPT_TGT_TRGP6K) + CriBool CopyFrameToBufferRGB565(CriUint8 *dstbuf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *srcbufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf, CriError &err=CriMv::ErrorContainer); +#endif + + /* YUV個別バッファフォーマットのコピー関数 */ + CriBool CopyFrameToBuffersYUV(CriMvYuvBuffers *dstbufs, + const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf, CriError &err=CriMv::ErrorContainer); + + /* リードバッファサイズの強制指定 */ + void SetReadBufferSize(CriUint32 buffer_size, CriError &err=CriMv::ErrorContainer); + + CriUint32 GetMinBufferSize(CriError &err=CriMv::ErrorContainer); + /**************************************************************************************/ + void SetVideoFramerate(CriUint32 framerate_n, CriUint32 framerate_d); + + void SetCompareFrameTimeCallback( + CriBool (*func)(CriMvEasyPlayer *mveasy, CriMvFrameInfo *frameinfo, CriUint64 count, CriUint64 unit, void *usrobj), + void *usrobj, CriError &err=CriMv::ErrorContainer); + void SetSeekFrameAndOffset(CriSint32 seek_frame_id, CriUint64 seek_byte, CriError &err=CriMv::ErrorContainer); + + enum InputMode { + MVEASY_INPUT_UNDEFINED, + MVEASY_INPUT_STREAMING, /* メモリストリーミング */ + MVEASY_INPUT_MEMORY, /* メモリ直接参照(ユニSJ) */ + + /* Keep enum 4bytes */ + MVEASY_INPUT_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + /* 実験中: この関数のために InputMode 定義を暫定でpublicへ移動 */ + void SetMemoryPlaybackType(InputMode memplay_type, CriError &err=CriMv::ErrorContainer); + + /* デコードスキップの自動実行モード */ + //void SetAutoSkipDecode(CriBool sw, CriFloat32 margin_msec, CriError &err=CriMv::ErrorContainer) + + /* ファイル要求の再コールバック要求 */ + void DeferFileRequest(CriError &err=CriMv::ErrorContainer); + + /* for specific use */ + void SetHeaderAndBodyData(const CriUint64Adr header_ptr, CriSint64 header_size, + const CriUint64Adr body_ptr, CriSint64 body_size); + CriSint32 CalcFramepoolWorkSize(const CriMvStreamingParameters *stmprm, CriError & err = CriMv::ErrorContainer); + void SetFramepoolWork(void *work, CriSint32 work_size, CriError & err = CriMv::ErrorContainer); + void SetFramepoolWorkAllocator(CriMvFramepoolWorkMallocFunc allocfunc, CriMvFramepoolWorkFreeFunc freefunc, void *usrobj); + void SetCapacityOfPictureSize(CriSint32 video_picsize, CriSint32 alpha_picsize, CriError &err); + void GetUsrCapacityOfPictureSize(CriSint32 *video_picsize, CriSint32 *alpha_picsize); + void SetMaxMovieSize(CriUint32 max_width, CriUint32 max_height, CriError &err); + void GetMaxMovieSize(CriUint32 *max_width, CriUint32 *max_height); + CriBool PlaybackResourceAllocated() const; + CriBool CanReusePlaybackResource(const CriMvStreamingParameters *stmprm) const; + CriBool GetReusePlaybackResourceFlag() const; + +private: + /* CRI internal use only */ + + void initializeHandleParameters(void); + void initializeCompareFrameParameters(void); + void resetHandleParameters(void); + CriBool startInputAndDecoding(void); + CriBool isEndReadFile(void); + void reinputDataForLooping(void); + void executeFileCloseServer(void); + void supplyDataFromStreamer(void); + void executeFileReadServer(void); + void executeFileOpenServer(void); + void executeCuePointServer(void); + //void executeAutoSkipDecode(void); + void executeWaitStatusServer(CriError &err = CriMv::ErrorContainer); + void surveilTerminationInput(void); + CriBool isAvailableCenterVoice(const CriMvStreamingParameters *stmprm); + CriBool isAvailableSubAudio(const CriMvStreamingParameters *stmprm); + CriBool attachCenterVoice(void); + void detachCenterVoice(void); + + CriBool attachSubAudioHandle(CriHeap heap); + void detachSubAudioHandle(void); + + void getAudioTime(CriUint64 &out_count, CriUint64 &out_unit, CriUint64 s_count, CriUint64 s_unit); + + CriBool allocAndCreateModules(void); + void startModules(void); + void requestStopModules(void); + CriBool closeFileIfOpening(void); + CriBool isCompleteStopModules(void); + void tryCleanupModules(CriMvPlyStatus mvstat); + CriBool tryFreeAndDestroySubmodules(void); + void freeAndDestroyModules(void); + + CriUint32 adjustNumTrackAudioOut(void); + + /* ストリーミング用のパラメータ取得 */ + /* GetMovieInfo()との違いはユーザ指定値がどこまで反映されるか。 + * 例えば、最大チャンクサイズはこの関数ではユーザ指定値をとるが、GetMovieInfoだとファイルの値。 + * この関数は、内部で下位モジュール作成およびメモリ確保する時に使う。 */ + CriBool GetStreamingParameters(CriMvStreamingParameters &stmprm, CriError &err=CriMv::ErrorContainer); + + void setNormalErrorStatus(const CriChar8 *errmsg); + + CriBool compareFrameTimeSimple(CriMvEasyPlayer *mveasy, CriMvFrameInfo *frameinfo, CriUint64 count, CriUint64 unit, void *usrobj); + static CriBool compareFrameTimeFluctuation(CriMvEasyPlayer *mveasy, CriMvFrameInfo *frameinfo, CriUint64 count, CriUint64 unit, void *usrobj); + + Bool isNextFrameOnTime(CriBool update_stats, CriError &err); + Bool checkFrameTime(CriMvFrameInfo *frameinfo); + void updateGetFrameInfo(CriBool time_ready, CriBool acquired_frame, CriBool discard_frame, CriUint64 frame_count, CriUint64 frame_unit); + + /* for DEBUG */ + void crimveasy_SetSeekInfo(void); + + void executeUpdate(CriError &err); + +private: + static CriUint32 crimveasy_SupplyPcmDataByFloat32(void *obj, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_SupplyPcmDataBySint16(void *obj, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_CalcAvailableNumSmpls(CriMvEasyPlayer *mveasy); + static CriUint32 crimveasy_GetWave16(CriMvEasyPlayer *mveasy, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_GetWave32(CriMvEasyPlayer *mveasy, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl); + + static CriUint32 crimveasy_SupplySubAudioDataByFloat32(void *obj, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_GetSubAudioWave32(CriMvEasyPlayer *mveasy, CriUint32 nch, CriFloat32 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_SupplySubAudioDataBySint16(void *obj, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl); + static CriUint32 crimveasy_GetSubAudioWave16(CriMvEasyPlayer *mveasy, CriUint32 nch, CriSint16 *pcmbuf[], CriUint32 req_nsmpl); + +public: + CriMvPly mvply; /* Temporally allowed to access for debug */ + +private: + CriHeap heap; + CriBool user_stmprm_flag; + CriMvStreamingParameters stmprm; + CriBool alloced_submodules_flag; + CriMvFrameInfo frameinfo; + CriMvAlphaFrameInfo alpha_frame; + CriMvFileReaderInterface *freader; + CriMvSoundInterface *sndout; + CriMvSystemTimerInterface *stimer; + TimerType timertype; + Status pre_ezstat; + CriBool req_decode_header_flag; + CriBool req_prepare_flag; + CriBool pause_flag; + CriUint32 npools; + CriSint32 track_play_audio; + CriUint32 num_track_audio_data; + CriUint32 num_track_audio_out; + CriBool loop_flag; + CriUint64 time_count; + CriUint64 time_unit; + CriSint64 total_read; + CriSint64 fsize_byte; + CriChunk read_crick; + CriBool exe_open; + CriBool exe_close; + CriBool exe_read; + + CriUint64 time_syslog_count; /* システムタイマの記録 */ + CriUint64 time_syslog_unit; + CriUint64 time_ofs_count; /* オーディオ終了時のシステムタイマ */ + CriUint64 time_ofs_unit; + CriUint64 time_prev_audio_count; /* オーディオ時刻変化チェック用 */ + CriUint64 time_prev_audio_unit; + + CriFloat32 user_buffering_sec; /* 0.0f means AUTO */ + CriUint32 user_max_bitrate; /* 0 means AUTO */ + CriUint32 user_max_chunk_size; /* 0 means AUTO */ + CriUint32 user_min_buffer_size; /* 0 means AUTO */ + CriSint32 user_read_buffer_size; /* CRIMV_READ_BUFFER_SIZE_AUTO means AUTO */ + CriSint32 user_video_capacity_of_picsize; /* 0 means AUTO */ + CriSint32 user_alpha_capacity_of_picsize; /* 0 means AUTO */ + CriUint32 user_max_width; + CriUint32 user_max_height; + + CriSint32 usr_subtitle_channel; + CriMvSubtitleInfo sbtinfo; + CriFloat32 sbt_start_msec; + CriFloat32 sbt_end_msec; + CriUint8 *sbtbuf; + + enum InputSrc { + MVEASY_INPUT_SRC_UNDEFINED, + MVEASY_INPUT_SRC_FILE, + MVEASY_INPUT_SRC_MEMORY, + /* Keep enum 4bytes */ + MVEASY_INPUT_SRC_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + InputSrc input_src; + CriMvFileReaderInterface *ext_reader; + CriMvFileReaderInterface *mem_reader; + + enum InputSupplyStatus { + MVEASY_SUPPLY_STOP, + MVEASY_SUPPLY_REQ_OPEN, + MVEASY_SUPPLY_OPENING, + MVEASY_SUPPLY_READING, + MVEASY_SUPPLY_REQ_CLOSE, + MVEASY_SUPPLY_CLOSING, + + /* Keep enum 4bytes */ + MVEASY_SUPPLY_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + + InputMode memplay_type; /* メモリ再生をストリームするかユニSJするか */ + InputMode input_mode; + InputSupplyStatus supply_stat; + CriBool change_file_mode; + CriChar8 file_name[CRIMV_MAX_FILE_NAME]; + CriUint64 file_offset; + CriSint64 file_range; + CriUint8 *dataptr; + CriUint32 datasize; + CriBool terminate_flag; + CriSint32 reinput_cnt; + + enum NextEntryState { + MVEASY_NEXT_ENTRY_NONE, + MVEASY_NEXT_ENTRY_READY, + MVEASY_NEXT_ENTRY_DEFER, + /* Keep enum 4bytes */ + MVEASY_NEXT_ENTRY_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + NextEntryState next_entry_state; + + CriUint32 center_ch; + CriSint32 usr_voice_track; // by SetCenterVoice() + CriSint32 voice_attached_track; + + // Sub Audio + CriMvSoundInterface *if_subaudio; + CriSint32 usr_subaudio_track; + CriSint32 attached_subaudio_track; + + void (*cbfunc_file_request)(CriMvEasyPlayer *mveasy, void *usrobj); + void *usrobj_file_request; + + CriBool (*cbfunc_compare_ftime)(CriMvEasyPlayer *mveasy, CriMvFrameInfo *frameinfo, CriUint64 count, CriUint64 unit, void *usrobj); + void *usrobj_compare_ftime; + + /* Seek Playback */ + CriSint32 seek_frame_id; + CriUint64 seek_byte; + + /* CuePoint */ + void (*cbfunc_cuepoint)(CriMvEasyPlayer *mveasy, CriMvEventPoint *eventinfo, void *usrobj); + void *usrobj_cuepoint; + + /* Playback Statistics */ + CriBool start_getfrm; + CriUint64 last_getfrm_count; + CriFloat32 sum_diff_time; + CriMvPlaybackInfo playinfo; + CriMvLastFrameResult last_frm_result; + + /* Block flag for simultanious calls on multi-threads */ + CriSint32 execute_decode_block_flag; + CriSint32 update_block_flag; + + /* Stop Completion Notification */ + void (*cbfunc_stopcomplete)(CriMvEasyPlayer *mveasy, void *usrobj); + void *usrobj_stopcomplete; + + /* For Sofdec2 */ + void *playback_work; + CriSint32 playback_work_size; + void *mvply_work; + CriHeap heap_mveasy; + CriHeap heap_extra_sound; + CriBool reuse_modules_flag; + + /* For Debug */ + volatile CriUint8 end_sequence_info; + + /* Handle Protection */ + void *cshn; + void *cs_work; + + /* Skip Decoding */ + //CriBool skip_auto_flag; + //CriFloat32 margin_msec; + +public: + enum FrameCompareMode { + MVEASY_COMPARE_MODE_JUST, /* 正確に時刻比較する */ + MVEASY_COMPARE_MODE_DELAY_GET, /* タイマ時刻を前倒し=フレームはなるべく渡さない */ + MVEASY_COMPARE_MODE_FAST_GET, /* タイマ時刻を水増し=フレームはなるべく渡す */ + + /* Keep enum 4bytes */ + MVEASY_COMPARE_MODE_MAKE_ENUM_SINT32 = 0x7FFFFFFF + }; + FrameCompareMode compare_mode; + CriFloat32 accuracy_system_tmr_msec; /* システム時刻精度 milli sec */ + CriFloat32 accuracy_audio_tmr_msec; /* オーディオ時刻精度 milli sec */ + CriFloat32 fluctuation_system; /* システム(SyncFrame)の揺らぎ milli sec */ + CriFloat32 fluctuation_adjust; /* 揺らぎ補正 */ +// CriFloat32 fluctuation_system_msec; /* システム時刻ゆらぎ幅 milli sec */ +// CriFloat32 fluctuation_audio_msec; /* オーディオ時刻ゆらぎ幅 milli sec */ +// CriFloat32 fluctuation_adjust; /* ゆらぎ補正倍率 */ +// CriSint32 fluctuation_system_usec; /* システム時刻ゆらぎ幅 micro sec */ +// CriSint32 fluctuation_audio_usec; /* オーディオ時刻ゆらぎ幅 micro sec */ +// CriFloat32 fluctuation_adjust_multi; /* ゆらぎ補正倍率 */ +// CriSint32 fluctuation_adjust_add; /* ゆらぎ補正オフセット */ + +private: + CriBool req_stop_modules; + CriBool error_flag; + CriBool req_start_modules; + +protected: + CriMvEasyPlayer(CriHeap heap, + CriMvFileReaderInterface *freader, + CriMvSystemTimerInterface *stimer, + CriMvSoundInterface *sound, + CriError &err=CriMv::ErrorContainer); + virtual ~CriMvEasyPlayer(); + +private: + CriMvEasyPlayer(void); //disabled +}; + + + + +#endif /* CRI_MOVIE_H_INCLUDED */ diff --git a/3rdParty/cri/pc/include/cri_movie_core.h b/3rdParty/cri/pc/include/cri_movie_core.h new file mode 100644 index 00000000..838788e7 --- /dev/null +++ b/3rdParty/cri/pc/include/cri_movie_core.h @@ -0,0 +1,2554 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2005-2013 CRI Middleware Co., Ltd. + * + * Library : CRI Movie + * Module : Library User's Header + * File : cri_movie_core.h + * Date : 2013-11-21 + * Version : (see CRIMVPLY_VER) + * + ****************************************************************************/ +/*! + * \file cri_movie_core.h + */ +#ifndef CRI_MOVIE_CORE_H_INCLUDED /* Re-definition prevention */ +#define CRI_MOVIE_CORE_H_INCLUDED + +/* Version No. */ +#define CRIMVPLY_VER "3.50" +#define CRIMVPLY_NAME "criMvPly" + +/*************************************************************************** + * Include file + ***************************************************************************/ +#include +#include +#include + +/*************************************************************************** + * MACRO CONSTANT + ***************************************************************************/ + +/*EN + * \brief Audio OFF setting of Audio Track + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +/*JP + * \brief オーディオ再生OFFの指定値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +#define CRIMV_AUDIO_TRACK_OFF (-1) + +/*EN + * \brief Default setting of Audio Track + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +/*JP + * \brief オーディオチャネルのデフォルト値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetAudioTrack() + */ +#define CRIMV_AUDIO_TRACK_AUTO (100) + +/*EN + * \brief Maximum number of PCM tracks in one audio stream + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief オーディオデータ内の最大PCMトラック数 + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_PCM_BUFFER_MAX (8) + +/*EN + * \brief Subtitle OFF setting + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ +/*JP + * \brief 字幕再生OFFの指定値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetSubtitleChannel() + */ +#define CRIMV_SUBTITLE_CHANNEL_OFF (-1) + +/*EN + * \brief Maximum number of video tracks in a movie file + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief ムービファイル内の最大ビデオストリーム数 + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_MAX_VIDEO_NUM (1) + +/*EN + * \brief Maximum number of audio tracks in a movie file + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief ムービファイル内の最大オーディオストリーム数 + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_MAX_AUDIO_NUM (32) + +/*EN + * \brief Maximum number of alpha tracks in a movie file + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief ムービファイル内の最大アルファストリーム数 + * \ingroup MDL_MV_OPTION + */ +#define CRIMV_MAX_ALPHA_NUM (1) + +#if defined(XPT_TGT_PC) +/*EN + * \brief Number of extra threads for multicore decoding + * \ingroup MDL_MV_OPTION + * The number of additional decoding threads that CRI Movie library internally creates. + * The threads are intended to run on multiple processors in parallel. + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +/*JP + * \brief マルチコアデコード用の追加のデコードスレッド数 + * \ingroup MDL_MV_OPTION + * CRI Movieライブラリが内部で作成する追加のデコードの数です。これらのスレッドは、マルチコアPC上で + * デコード処理を並列分散させるために作られます。 + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +#define CRIMV_NUM_EXT_DECTHREAD_PC (3) + +/*EN + * \brief Default affnity mask of a thread + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +/*JP + * \brief スレッドアフィニティマスクのデフォルト設定値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +#define CRIMV_DEFAULT_AFFNITY_MASK_PC (0xFFFFFFFF) + + +/*EN + * \brief Default priority of a thread + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +/*JP + * \brief スレッドのデフォルト優先度 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetUsableProcessors_PC() + */ +#define CRIMV_DEFAULT_THREAD_PRIORITY_PC (0x8000000) +#endif + +/*EN + * \brief Default value of the read buffer size + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetReadBufferSize() + */ +/*JP + * \brief リードバッファサイズをデフォルト値 + * \ingroup MDL_MV_OPTION + * \sa CriMvEasyPlayer::SetReadBufferSize() + */ +#define CRIMV_READ_BUFFER_SIZE_AUTO (-1) + + +/*************************************************************************** + * Library Spec Defenition + ***************************************************************************/ + +/* */ + +/* 2007-09-06:URUSHI オーディオ処理のサブモジュール化 * + * MvPlyのオーディオ処理部分をCriMvPlyAmngという新たなクラスに切り出す。* + * CriMvPlyAmngはデマルチプレクサから全トラックデータを受け取って、 * + * トラックごとに割り振られたAdecに処理を渡します。 * + * 目的は以下の二つ * + * 1) オーディオトラックの動的切替 * + * 2) ループ再生での異なるAV尺の同期 */ + +#define NUM_MAX_ADEC (2) /* Adecの最大数 */ +/* ADECのインデックス定義 */ +/* このindexを使ってCriMvPlyAmngからAdecをコントロールしてください。 */ +#define MAIN_ADEC_IDX (0) // メイントラック用 +#define SUB_ADEC_IDX (1) // ボイストラック用 + +/* オーディオの動的切替機能をサポートするか */ +//#define ENABLE_DYNAMIC_AUDIO_SWITCH + +#if defined(ENABLE_DYNAMIC_AUDIO_SWITCH) + #define CRIMVPLYAMNG_TRACK_OFF (512) // 切り替え先トラック番号のデフォルト値(切替OFF) + + /* トラックの動的切替のための状態定義 */ + typedef enum _crimvplyamng_track_state { + CRIMVPLYAMNG_TRACK_STATE_FIXED = (1), // デフォルト + CRIMVPLYAMNG_TRACK_STATE_PREP_SWITCHING, // ユーザが切替を命令し、切替の準備段階(時刻判定のための基準時間をセット) + CRIMVPLYAMNG_TRACK_STATE_SWITCHING // 切替元と先の時刻判定を行なって切替を行なう状態 + } CriMvPlyAmngTrackState; +#endif + +/* 連結再生時、2個目以降のヘッダを取得できるようにするため */ +#define CRIMVPLY_HEAD_CONTAINER_NUM (2) + +/* 再読み込み閾値のデフォルト値 */ +#define CRIMV_DEFAULT_RELOAD_THRESHOLD (0.8f) // 0.8[sec] + +/* 再生準備中の貯金フレーム数デフォルト値 */ +#define CRIMV_DEFAULT_NUM_FRAMES_FOR_PREP (-1) /* デフォルト:不使用 (フレームプール数を採用) */ + +/* 内部ワーク領域の確保にCRI Heapを使用しない */ +#define CRIMV_REMOVE_CRIHEAP + +/* 機種固有フレーム情報数 */ +#define CRIMV_FRAME_DETAILS_NUM (2) + +/* CriVavfios で指定する外部ファイルのパスの上限 */ +#if defined(XPT_TGT_IOS) + #define CRIMVPLY_VAVFIOS_MAX_FILEPATH (256) +#endif + +/*************************************************************************** + * Process MACRO + ***************************************************************************/ +#define criMv_SetDefaultHandleConfig(p_config) \ +{\ + (p_config)->readbuffer_size = 0;\ +} + +/*************************************************************************** + * Enum declaration + ***************************************************************************/ +/*EN + * \brief Speaker index of CRI Movie PCM output + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief CRI Movie のPCM出力のスピーカー配置 + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_PCM_BUFFER_L = 0, /*EN< The LEFT channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の LEFT チャンネル */ + CRIMV_PCM_BUFFER_R = 1, /*EN< The RIGHT channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の RIGHT チャンネル */ + CRIMV_PCM_BUFFER_LS = 2, /*EN< The Surround LEFT channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の Surround LEFT チャンネル */ + CRIMV_PCM_BUFFER_RS = 3, /*EN< The Surround RIGHT channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の Surround RIGHT チャンネル */ + CRIMV_PCM_BUFFER_C = 4, /*EN< The CENTER channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の CENTER チャンネル */ + CRIMV_PCM_BUFFER_LFE = 5, /*EN< The LFE channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の LFE チャンネル */ + CRIMV_PCM_BUFFER_EXT1 = 6, /*EN< The EXT1(Rear Left) channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の EXT1(Rear Left) チャンネル */ + CRIMV_PCM_BUFFER_EXT2 = 7, /*EN< The EXT2(Rear Right) channel of CRI Movie output */ + /*JP< CRI Movie オーディオ出力の EXT2(Rear Right) チャンネル */ + + /* Keep enum 4bytes */ + CRIMV_PCM_BUFFER_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvPcmBufferIndex; + + +/*EN + * \brief Composite mode of alpha movie + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief アルファムービの合成モード + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_COMPO_OPAQ = 0, /*EN< Opacity, no alpha value */ + /*JP< 不透明、アルファ情報なし */ + CRIMV_COMPO_ALPHFULL = 1, /*EN< Full alpha blending (8bits-alpha data) */ + /*JP< フルAlpha合成(アルファ用データが8ビット) */ + CRIMV_COMPO_ALPH3STEP = 2, /*EN< 3 Step Alpha */ + /*JP< 3値アルファ */ + CRIMV_COMPO_ALPH32BIT = 3, /*EN< Full alpha blending (32bits color + alpha data) */ + /*JP< フルAlpha、(カラーとアルファデータで32ビット) */ + CRIMV_COMPO_ALPH1BIT = 4, /*EN< Alpha blending (24bits color + 1->8bits alpha) */ + /*JP< フルAlpha、(カラーとアルファデータで32bit、値は2値) */ + CRIMV_COMPO_ALPH2BIT = 5, /*EN< Alpha blending (24bits color + 2->8bits alpha) */ + /*JP< フルAlpha、(カラーとアルファデータで32bit、値は4値) */ + CRIMV_COMPO_ALPH3BIT = 6, /*EN< Alpha blending (24bits color + 3->8bits alpha) */ + /*JP< フルAlpha、(カラーとアルファデータで32bit、値は8値) */ + CRIMV_COMPO_ALPH4BIT = 7, /*EN< Alpha blending (24bits color + 4->8bits alpha) */ + /*JP< フルAlpha、(カラーとアルファデータで32bit、値は16値)*/ + + /* Keep enum 4bytes */ + CRIMV_COMPO_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvAlphaType; + + +/*EN + * \brief Result of the last video frame retrieval + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief 前回のビデオフレーム取得の結果 + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_LASTFRAME_OK = 0, /*EN< Succeeded */ + /*JP< 取得成功 */ + CRIMV_LASTFRAME_TIME_EARLY = 1, /*EN< Failed. The frame is not yet the time to draw */ + /*JP< 取得失敗。フレーム表示時刻が再生時間に達していなかった */ + CRIMV_LASTFRAME_DECODE_DELAY = 2, /*EN< Failed. The frame to draw is not decoded yet */ + /*JP< 取得失敗。ビデオフレームのデコードが間に合わなかった */ + CRIMV_LASTFRAME_DISCARDED = 3, /*EN< Failed. The video frame is discarded by app */ + /*JP< 取得失敗。アプリによって破棄された */ + //CRIMV_LASTFRAME_NO_INPUT_DATA = 4, //Not supported yet + //CRIMV_LASTFRAME_SKIPPED = 5, //Not supported yet + //CRIMV_LASTFRAME_DEMUX_STUCKED = 6, //Not supported yet + + /* Keep enum 4bytes */ + CRIMV_LASTFRAME_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvLastFrameResult; + +#if defined(XPT_TGT_PS3PPU) +/*EN + * \brief Graphic Environment type for PS3 + * \ingroup MDL_MV_OPTION + */ +/*JP + * \brief PS3のグラフィック環境 + * \ingroup MDL_MV_OPTION + */ +typedef enum { + CRIMV_GRAPHIC_ENV_GCM = 0, /*EN< GCM. (or same ARGB 32bit texture format of GCM) */ + /*JP< GCM環境 (またはテクスチャフォーマットがGCMと同じ環境) */ + CRIMV_GRAPHIC_ENV_PSGL = 1, /*EN< PSGL. (or same ARGB 32bit texture format of PSGL) */ + /*JP< PSGL環境 (またはテクスチャフォーマットがPSGLと同じ環境) */ + + /* Keep enum 4bytes */ + CRIMV_GRAPHIC_ENV_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvGraphicEnv; +#endif + + +/* CRI Movie Interanl handle status + * + * The possible legal states of a CriMvPly handle. Over the course of your application + * the CriMvPly handle will walk through the following states in roughly the following + * order. In states that are waiting states, you can request the + * CriMvPly handle to advance to the next state by calling the criMvPly_IncrementState() + * function. You can check the status of a valid CriMvPly handle at any time + * by calling criMvPly_GetStatus(). + * + * It is not possible to jump from a state to an arbitrary other state. Normal play + * proceeds from the CRIMVPLY_STATUS_STOP state through the CRIMV_PLY_STATUS_PLAYEND + * state in that order. Premature termination can be requested with the criMvPly_Stop() + * function. + * + * \sa criMvPly_IncrementState(), criMvPly_GetStatus(), criMvPly_Stop() + */ +typedef enum { + CRIMVPLY_STATUS_STOP = 0, /* Standstill. No processing is occurring. + * CriMvPly handles are created into this state. + */ + /* 停止中 */ + CRIMVPLY_STATUS_DECHDR = 1, /* The CriMvPly structure is now parsing the header + * of the file, including information on height and width + * of the video stream. + */ + /* ヘッダ解析中 */ + CRIMVPLY_STATUS_WAIT_PREP = 2, /* The header has been decoded and criMvPly_GetStreamingParameters() + * will now provide valid values. Typically you will call + * criMvPly_AllocateWorkBuffer() with this information at this point. + */ + /* PREP状態へのIncrementState待ち
+ AllocateWorkBufferしてから次へいくこと */ + CRIMVPLY_STATUS_PREP = 3, /* Transition to this state to acknowledge to the + * CriMvPly handle that you have allocated your work buffers. */ + /* 再生準備中 */ + CRIMVPLY_STATUS_WAIT_PLAYING = 4, /* The audio and video decoders are now ready to begin playback.*/ + /* PLAYING状態へのIncrementState待ち
+ この状態で既にビデオとオーディオのデコード結果は取得できる。*/ + CRIMVPLY_STATUS_PLAYING = 5, /* The decoders are currently decoding and playing output. */ + /* 再生中 */ + CRIMVPLY_STATUS_WAIT_PLAYEND = 6, /* The library is waiting for you to acknowledge the end of the movie. You + * have informed the CriMvPly structure that an end-of-file condition exists, + * but final frames of video and audio may still be pending in your application. */ + /* PLAYEND状態へのIncrementState待ち */ + CRIMVPLY_STATUS_PLAYEND = 7, /* You have acknowledged the end of the movie. Teardown can occur at this point. */ + /* 再生終了 */ + CRIMVPLY_STATUS_STOP_PROCESSING = 8, /* A request to stop has been received by the CriMvPly structure, + * that is, you have called criMvPly_Stop(), and a stop is now pending. */ + /* 停止処理中 */ + CRIMVPLY_STATUS_WAIT_STOP = 9, /* The CriMvPly handle has acknowledged the stop request and + * you may now call criMvPly_IncrementState() to transition to + * the CRIMVPLY_STATUS_STOP state. */ + /* STOP状態へのIncrementState待ち */ + CRIMVPLY_STATUS_ERROR = 10, /* An error has occurred. */ + /* エラー */ + + /* Keep enum 4bytes */ + CRIMVPLY_STATUS_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvPlyStatus; + + +/* Sofdec2 */ +typedef enum { + CRIMVPLY_META_FLAG_OFF = 0x0000, + CRIMVPLY_META_FLAG_CUE = 0x0001, + CRIMVPLY_META_FLAG_SEEK = 0x0002, + CRIMVPLY_META_FLAG_ALL = CRIMVPLY_META_FLAG_CUE + CRIMVPLY_META_FLAG_SEEK, + + /* Keep enum 4bytes */ + CRIMVPLY_META_FLAG_MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvMetaFlag; + +/* Color Conversion*/ +typedef enum{ + CRIMV_COLORSPACE_CONVERSION_TYPE_ITU_R_BT601_LIMITED = 0, + CRIMV_COLORSPACE_CONVERSION_TYPE_ITU_R_BT601_FULLRANGE = 1, + + /* Keep enum 4bytes */ + CRIMV_COLORSPACE_CONVERSION_TYPE_ENUM_SINT32 = 0x7FFFFFFF +}CriMvColorSpaceConversionType; + +typedef void *(*CriMvMetaDataWorkMallocFunc)(void *obj, CriUint32 size); +typedef void (*CriMvMetaDataWorkFreeFunc)(void *obj, void *mem); + +/* OUTER_FRAMEPOOL_WORK */ +#define CriMvFramepoolWorkMallocFunc CriMvMetaDataWorkMallocFunc +#define CriMvFramepoolWorkFreeFunc CriMvMetaDataWorkFreeFunc + +/*************************************************************************** + * Data type declaration + ***************************************************************************/ + +/*EN + * \brief Audio parameters + * \ingroup MDL_MV_INFO + * + * \sa CriMvStreamingParameters, CriMvWaveInfo + */ +/*JP + * \brief オーディオパラメータ + * \ingroup MDL_MV_INFO + * + * オーディオストリームのパラメータ + * \sa CriMvStreamingParameters, CriMvWaveInfo + */ +typedef struct { + CriUint32 sampling_rate; /*EN< Sampling rate */ + /*JP< サンプリング周波数 */ + CriUint32 num_channel; /*EN< Number of channels. Monaural = 1, Stereo = 2 */ + /*JP< オーディオチャネル数 */ + CriUint32 total_samples; /*EN< Total number of samples */ + /*JP< 総サンプル数 */ + CriUint32 output_buffer_samples; /*EN< Output wave buffer size */ + /*JP< サウンド出力バッファのサンプル数 */ + CriUint32 codec_type; /*EN< Codec type */ + /*JP< コーデック種別 */ + +} CriMvAudioParameters; + +/*EN + * \brief Video Parameters + * \ingroup MDL_MV_INFO + * \sa CriMvStreamingParameters + */ +/*JP + * \brief ビデオパラメータ + * \ingroup MDL_MV_INFO + * ビデオストリームのパラメータ + * \sa CriMvStreamingParameters + */ +typedef struct { + CriUint32 max_width; /*EN< Maximum video width for stream. (multiple of 8) */ + /*JP< ムービ最大幅(8の倍数) */ + CriUint32 max_height; /*EN< Maximum video height for stream. (multiple of 8)*/ + /*JP< ムービ最大高さ(8の倍数) */ + CriUint32 disp_width; /*EN< Width of the image to draw. */ + /*JP< 表示したい映像の横ピクセル数(左端から) */ + CriUint32 disp_height; /*EN< Height of the image to draw. */ + /*JP< 表示したい映像の縦ピクセル数(上端から) */ + CriUint32 num_frame_pool; /*EN< Number of frame pools required for stream */ + /*JP< フレームプール数 */ + CriUint32 framerate; /*EN< Frame rate per second [x1000]. */ + /*JP< フレームレート[x1000] */ + CriUint32 framerate_n; /*EN< Frame rate (in rational as numerator). framerate_n/framerate_d = framerate */ /* UTODO: 変数名 */ + /*JP< フレームレートの分子(有理数形式)。framerate_n/framerate_d = framerate */ + CriUint32 framerate_d; /*EN< Frame rate (in rational as denominator). */ + /*JP< フレームレートの分母(有理数形式)。 */ + CriUint32 total_frames; /*EN< Total number of video frames */ + /*JP< 総フレーム数 */ + + CriUint32 material_width; /*EN< Width of the video source resolustion before encoding. */ + /*JP< エンコード前のビデオ素材の横ピクセル数 */ + CriUint32 material_height; /*EN< Height of the video source resolustion before encoding. */ + /*JP< エンコード前のビデオ素材の縦ピクセル数 */ + CriUint32 screen_width; /*EN< Screen width set by encoding and cropping. + * This parameter is only available when you encoded the movie with "Widescreen TV Support" option. + * Normally this value is 0. */ + /*JP< エンコード時に指定したスクリーン幅。 + * この値はエンコード時に「ワイドテレビ支援機能」を使用した場合のみ有効になります。 + * 通常は0です。 */ + + CriUint32 codec_type; /*EN< Video Codec Type. If you encoded the movie for PS2, this value is 2. + * Normally this value is 1 or 0(no info). + * If the codec_type is 1, the CRI Movie for ONLY PS2 can play the movie file. */ + /*JP< ビデオコーデック種別。PS2用にエンコードした場合 2になります。 + * 通常は 1または 0(情報無し)です。 + * コーデック種別が2のムービは、PS2版ライブラリで「のみ」再生可能です。 */ + CriUint32 codec_dc_option; /*EN< Video Codec DC Option. If you encoded the movie for PS2, this value is 10. + * Normally this value is 11 or 0(no info). + * If the codec_type is 11, the CRI Movie for PS2 can NOT play the movie file. */ + /*JP< ビデオコーデックのDCオプション種別。PS2用にエンコードした場合10になります。 + * 通常は11または 0(情報無し)です。 + * コーデックDCオプションが11のムービは、PS2版ライブラリ「では」再生できません。 */ + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< 色変換タイプ。 */ + CriSint32 capacity_of_picsize; /*EN< Capacity size of video pictures. */ + /*JP< ピクチャサイズ上限値 */ + CriUint32 average_bitrate; /*EN< Average bitrate. */ + /*JP< 平均ビットレート */ +} CriMvVideoParameters; + +/*EN + * \brief Alpha Parameters + * \ingroup MDL_MV_INFO + * \sa CriMvStreamingParameters + */ +/*JP + * \brief アルファパラメータ + * \ingroup MDL_MV_INFO + * アルファストリームのパラメータ + * \sa CriMvStreamingParameters + */ +typedef struct { + CriUint32 max_width; /*EN< Maximum alpha width for stream */ + /*JP< アルファフレームの最大幅 */ + CriUint32 max_height; /*EN< Maximum alpha height for stream */ + /*JP< アルファフレームの最大高さ */ + CriUint32 disp_width; /*EN< valid alpha width */ + /*JP< アルファフレームの実有効幅 */ + CriUint32 disp_height; /*EN< valid alpha height */ + /*JP< アルファフレームの実有効高さ */ + CriUint32 framerate; /*EN< Frame rate per second [x1000]. */ + /*JP< アルファのフレームレート[x1000] */ + CriUint32 framerate_n; /*EN< Frame rate (in rational as numerator). framerate_n/framerate_d = framerate */ /* UTODO: 変数名 */ + /*JP< フレームレートの分子(有理数形式)。framerate_n/framerate_d = framerate */ + CriUint32 framerate_d; /*EN< Frame rate (in rational as denominator). */ + /*JP< フレームレートの分母(有理数形式)。 */ + CriUint32 total_frames; /*EN< Total number of alpha frames */ + /*JP< 総フレーム数 */ + CriMvAlphaType alpha_type; /*EN< Alpha Composite Type. */ + /*JP< アルファ合成種別。 */ + CriUint32 codec_type; /*EN< Internal use only. Do not access this */ + /*JP< ライブラリ内部使用変数 */ + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< 色変換タイプ。 */ + CriSint32 capacity_of_picsize; /*EN< Capacity size of video pictures. */ + /*JP< ピクチャサイズ上限値 */ + CriUint32 average_bitrate; /*EN< Average bitrate. */ + /*JP< 平均ビットレート */ +} CriMvAlphaParameters; + + +/*EN + * \brief Streaming Parameters + * \ingroup MDL_MV_INFO + * This structure includes streaming parameters and playing parameters. + * \sa CriMvEasyPlayer::GetMovieInfo() + */ +/*JP + * \brief ストリーミング再生パラメータ + * \ingroup MDL_MV_INFO + * ストリーミング再生パラメータ。
+ * ストリーム自体の情報と、再生のために必要なパラメータの両方を含んでいる。 + * \sa CriMvEasyPlayer::GetMovieInfo() + */ +typedef struct { + /* Stream */ + CriUint32 is_playable; /*EN< Flag of the movie file is playable or not. 1 is playable. 0 is not playable.*/ + /*JP< 再生可能フラグ(1: 再生可能、0: 再生不可) */ + CriFloat32 buffering_time; /*EN< Amount of time to buffer in the stream, in seconds */ + /*JP< 読み込みデータのバッファリング時間。単位[sec]。 */ + CriUint32 max_bitrate; /*EN< Maximum bits per second for stream. This value includes video and audio both. */ + /*JP< 最大ビットレート(絵と音の合計) */ + CriUint32 max_chunk_size; /*EN< Maximum chunk size of incoming stream (USF) file */ + /*JP< 最大USFチャンクサイズ */ + CriUint32 min_buffer_size; /*EN< Minimum buffer size for reading */ + /*JP< 最低限必要な読み込みバッファサイズ。
オーディオとビデオの合計 */ + CriSint32 read_buffer_size; /*EN< Input buffer size for reading data */ + /*JP< リードバッファサイズ */ + /* Video */ + CriUint32 num_video; /*EN< Number of simultaneous video streams */ + /*JP< ビデオデコーダの数。現在は1固定。*/ + CriMvVideoParameters video_prm[CRIMV_MAX_VIDEO_NUM]; /*EN< Video parameters see CriMvVideoParameters struct for details */ + /*JP< ビデオパラメータ */ + /* Audio */ + CriUint32 num_audio; /*EN< Number of simultaneous audio streams */ + /*JP< オーディオデコーダの数。現在は1固定。*/ + CriSint32 track_play_audio; /*EN< Track of audio playback. */ + /*JP< 再生するオーディオチャネル番号。-1指定で再生無し。 */ + CriMvAudioParameters audio_prm[CRIMV_MAX_AUDIO_NUM]; /*EN< Audio parameters see CriMvAudioParameters struct for details */ + /*JP< オーディオパラメータ */ + /* Subtitle */ + CriUint32 num_subtitle; /*EN< Number of subtitles */ + /*JP< 字幕チャネル数 */ + CriSint32 channel_play_subtitle; /*EN< Channel for playing subtitles */ + /*JP< 再生する字幕チャネル番号 */ + CriUint32 max_subtitle_size; /*EN< Maximum size of subtitle data */ + /*JP< 字幕データの最大サイズ*/ + + /* Composite mode */ + CriUint32 num_alpha; /*EN< Number of alpha channels (current spec allows only one) */ + /*JP< アルファデコーダの数。現在は1固定。 */ + CriMvAlphaParameters alpha_prm[CRIMV_MAX_ALPHA_NUM]; /*EN< Alpha parameters see CriMvAlphaParameters struct for details */ + /*JP< アルファパラメータ */ + + CriBool seekinfo_flag; /*EN< Flag of the movie file inclues seek info */ + /*JP< シーク情報フラグ */ + CriUint32 format_ver; /*EN< Format version */ + /*JP< フォーマットバージョン */ +} CriMvStreamingParameters; + + +/*EN + * \brief Input Buffer Information + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetInputBufferInfo(), + * CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::SetBufferingTime() + */ +/*JP + * \brief 入力バッファ情報 + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetInputBufferInfo(), + * CriMvEasyPlayer::SetReloadThresholdTime(), CriMvEasyPlayer::SetBufferingTime() + */ +typedef struct { + CriUint32 buffer_size; /*EN< Input buffer size [byte] */ + /*JP< 入力バッファサイズ[byte] */ + CriUint32 data_size; /*EN< Data size in input buffer[byte] */ + /*JP< 入力バッファにあるデータサイズ[byte] */ + CriUint32 reload_threshold; /*EN< Re-load threshold. When data size is less than re-load threshold, next read is requested. */ + /*JP< 再読み込み閾値[byte]。データサイズがこの値以下になると読み込みを行います。 */ +} CriMvInputBufferInfo; + + +// TEMP: for internal use +typedef struct { + CriUint8 *imageptr; + CriUint32 bufsize; // [Byte] + CriUint32 line_pitch; // [Byte] + CriUint32 line_size; // [Byte] + CriUint32 num_lines; +} CriMvImageBufferInfo; + +/*EN + * \brief Video Frame Information + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB(), CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers, + * CriMvEasyPlayer::GetFrameOnTimeAsYUV422(), CriMvEasyPlayer::DiscardNextFrame() + */ +/*JP + * \brief ビデオフレーム情報 + * \ingroup MDL_MV_INFO + * ビデオフレーム情報 + * \sa CriMvEasyPlayer::GetFrameOnTimeAs32bitARGB(), CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers, + * CriMvEasyPlayer::GetFrameOnTimeAsYUV422(), CriMvEasyPlayer::DiscardNextFrame() + */ +typedef struct { + CriUint8 *imageptr; /*EN< Pointer to image data */ + /*JP< 画像データのポインタ */ + CriSint32 frame_id; /*EN< Frame ID ot the playback */ + /*JP< フレーム識別ID(ループ/連結再生時は通算) */ + CriUint32 width; /*EN< Width of movie frame [pixel] (multiple of 8) */ + /*JP< ムービの横幅[pixel] (8の倍数) */ + CriUint32 height; /*EN< Height of movie frame [pixel] (multiple of 8) */ + /*JP< ムービの高さ[pixel] (8の倍数) */ + CriUint32 pitch; /*EN< Pitch of movie frame [byte]*/ + /*JP< ムービのピッチ[byte] */ + CriUint32 disp_width; /*EN< Width of the image to draw. */ + /*JP< 表示したい映像の横ピクセル数(左端から) */ + CriUint32 disp_height; /*EN< Height of the image to draw. */ + /*JP< 表示したい映像の縦ピクセル数(上端から) */ + CriUint32 framerate; /*EN< Frames per second times 1000 */ + /*JP< フレームレートの1000倍の値 */ + CriUint32 framerate_n; /*EN< Frame rate (in rational as numerator). framerate_n/framerate_d = framerate */ /* UTODO: 変数名 */ + /*JP< フレームレートの分子(有理数形式)。framerate_n/framerate_d = framerate */ + CriUint32 framerate_d; /*EN< Frame rate (in rational as denominator). */ + /*JP< フレームレートの分母(有理数形式)。 */ + CriUint64 time; /*EN< Frame time ('time / tunit' indicates time in seconds) */ + /*JP< 時刻。time / tunit で秒を表す。 */ + CriUint64 tunit; /*EN< Unit of time measurement */ + /*JP< 時刻単位 */ + CriUint32 cnt_concatenated_movie; /*EN< Number of concatenated movie data */ + /*JP< ムービの連結回数 */ + CriSint32 frame_id_per_data; /*EN< Frame ID of the movie data */ + /*JP< ムービデータごとのフレーム番号 */ + + CriBool csc_flag; /*EN< This is temporary variable. Please don't access. */ + /*JP< テスト中の変数です。アクセスしないでください。 */ + + CriMvAlphaType alpha_type; /*EN< Composite mode */ + /*JP< アルファの合成モード*/ + + void *details_ptr[CRIMV_FRAME_DETAILS_NUM]; // for internal use + + CriSint32 num_images; // TEMP: for internal use + CriMvImageBufferInfo image_info[4]; // TEMP: for internal use + + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< 色変換タイプ。 */ + CriUint32 total_frames_per_data; /*EN< Total frames of the movie data*/ + /*JP< ムービデータ単位の総フレーム数 */ + CriUint32 cnt_skipped_frames; /*EN< Number of skipped frames to decode */ + /*JP< デコードスキップされたフレーム数 */ +} CriMvFrameInfo; + +/*EN + * \brief Subtitle Information + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetSubtitleOnTime() + */ +/*JP + * \brief 字幕情報 + * \ingroup MDL_MV_INFO + * \sa CriMvEasyPlayer::GetSubtitleOnTime() + */ +typedef struct { + CriUint8 *dataptr; /*EN< Pointer to subtitle data */ + /*JP< 字幕データのポインタ */ + CriUint32 data_size; /*EN< Size of subtitle data */ + /*JP< 字幕データサイズ */ + CriSint32 channel_no; /*EN< Channel number of subtitle data */ + /*JP< 字幕データのチャネル番号 */ + CriUint64 time_unit; /*EN< Unit of time measurement */ + /*JP< 時刻単位 */ + CriUint64 in_time; /*EN< Display start time */ + /*JP< 表示開始時刻*/ + CriUint64 duration_time; /*EN< Display duration time */ + /*JP< 表示持続時間 */ + CriUint32 cnt_concatenated_movie; /*EN< Number of concatenated movie data */ + /*JP< ムービの連結回数 */ + CriUint64 in_time_per_data; /*EN< Display start time per movie data*/ + /*JP< ムービデータごとに表示開始時刻*/ +} CriMvSubtitleInfo; + +/*EN + * \brief Event Point Info + * \ingroup MDL_MV_INFO + * Event point info is the each timing info was embeded to movie data as cue point info. + * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +/*JP + * \brief イベントポイント情報 + * \ingroup MDL_MV_INFO + * キューポイント機能でムービデータに埋め込まれた個々のタイミング情報です。 + * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +typedef struct { + CriChar8 *cue_name; /*EN< The name string of event point. Char code depends on cue point text. */ + /*JP< イベントポイント名。文字コードはキューポイント情報テキストに従います。 */ + CriUint32 size_name; /*EN< The data size of name string */ + /*JP< イベントポイント名のデータサイズ */ + CriUint64 time; /*EN< Timer counter */ + /*JP< タイマカウント */ + CriUint64 tunit; /*EN< Counter per 1 second. "count / unit" indicates the timer on the second time scale. */ + /*JP< 1秒あたりのタイマカウント値。count ÷ unit で秒単位の時刻となります。 */ + CriSint32 type; /*EN< Event point type */ + /*JP< イベントポイント種別 */ + CriChar8 *param_string; /*EN< The string of user parameters. Char code depends on cue point text. */ + /*JP< ユーザパラメータ文字列。文字コードはキューポイント情報テキストに従います。 */ + CriUint32 size_param; /*EN< The data size of user parameters string */ + /*JP< ユーザパラメータ文字列のデータサイズ */ + CriUint32 cnt_callback; /*EN< The counter of calling cue point callback. */ + /*JP< キューポイントコールバックの呼び出しカウンタ */ +} CriMvEventPoint; + +/*EN + * \brief Cue Point Info + * \ingroup MDL_MV_INFO + * Cue point info includes the number of event points and the list. + * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +/*JP + * \brief キューポイント情報 + * \ingroup MDL_MV_INFO + * キューポイント情報は、イベントポイントの個数と一覧です。
+ * \sa CriMvEasyPlayer::GetCuePointInfo() + */ +typedef struct { + CriUint32 num_eventpoint; /*EN< The number of event points */ + /*JP< イベントポイント個数 */ + CriMvEventPoint *eventtable; /*EN< The list of event points */ + /*JP< イベントポイント一覧 */ +} CriMvCuePointInfo; + +/*EN + * \brief YUV Texture Buffer Parameters + * \ingroup MDL_MV_INFO + * The output buffer parameters for CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers(). + * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() outputs data for pixel shader.
+ * If an application doesn't play alpha movie, CRI Movie library doesn't use alpha buffer parameters.
+ * \sa CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() + */ +/*JP + * \brief YUV個別バッファ情報 + * \ingroup MDL_MV_INFO + * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() の出力バッファ情報です。
+ * CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() はPixel Shader 向けのデコード結果を出力します。
+ * アルファムービ再生を行わない場合(不透明の通常再生)は、Alphaテクスチャ関連のパラメータは使用しません。
+ * \sa CriMvEasyPlayer::GetFrameOnTimeAsYUVBuffers() + */ +typedef struct { + CriUint8 *y_imagebuf; /*EN< Pointer to the buffer of Y texture */ + /*JP< Yテクスチャのバッファポインタ */ + CriUint32 y_bufsize; /*EN< Size of the buffer of Y texture [byte] */ + /*JP< Yテクスチャのバッファサイズ[byte] */ + CriUint32 y_pitch; /*EN< Pitch of the buffer of Y texture [byte] */ + /*JP< Yテクスチャのピッチ[byte] */ + CriUint8 *u_imagebuf; /*EN< Pointer to the buffer of U texture */ + /*JP< Uテクスチャのバッファポインタ */ + CriUint32 u_bufsize; /*EN< Size of the buffer of U texture [byte] */ + /*JP< Uテクスチャのバッファサイズ[byte] */ + CriUint32 u_pitch; /*EN< Pitch of the buffer of U texture [byte] */ + /*JP< Uテクスチャのピッチ[byte] */ + CriUint8 *v_imagebuf; /*EN< Pointer to the buffer of V texture */ + /*JP< Vテクスチャのバッファポインタ */ + CriUint32 v_bufsize; /*EN< Size of the buffer of V texture [byte] */ + /*JP< Vテクスチャのバッファサイズ[byte] */ + CriUint32 v_pitch; /*EN< Pitch of the buffer of V texture [byte] */ + /*JP< Vテクスチャのピッチ[byte] */ + CriUint8 *a_imagebuf; /*EN< Pointer to the buffer of Alpha texture */ + /*JP< Alphaテクスチャのバッファポインタ */ + CriUint32 a_bufsize; /*EN< Size of the buffer of Alpha texture [byte] */ + /*JP< Alphaテクスチャのバッファサイズ[byte] */ + CriUint32 a_pitch; /*EN< Pitch of the buffer of Alpha texture [byte] */ + /*JP< Alphaテクスチャのピッチ[byte] */ +} CriMvYuvBuffers; + + +/*EN + * \brief Playback Information + * \ingroup MDL_MV_INFO + * The output playback information of CriMvEasyPlayer::GetPlaybackInfo(). + * These parameters represents current movie playback information such as decode delay of movie data and + * interval of video frames retrieval. + * \sa CriMvEasyPlayer::GetPlaybackInfo() + */ +/*JP + * \brief 再生情報 + * \ingroup MDL_MV_INFO + * CriMvEasyPlayer::GetPlaybackInfo() の出力再生情報です。
+ * フレームの取得間隔やデコードの遅延などの現在再生しているムービの再生情報を表します。
+ * \sa CriMvEasyPlayer::GetPlaybackInfo() + */ +typedef struct { + CriUint64 cnt_app_loop; /*EN< Loop count of application. Precisely, this is a number of calls of CriMvEasyPlayer::Update(). The count up will start after app is able to acquire the first video frame */ + /*JP< アプリケーションのループカウント。具体的には CriMvEasyPlayer::Update() の呼び出し回数になります。最初のフレームが取得可能になるとカウントが始まります。*/ + CriUint64 cnt_frame_interval[4]; /*EN< Interval of video frames retrieval. These values are count up when CriMvEasyPlayer::IsNextFrameOnTime() returns TRUE. + * + * The interval of video frames retrieval indicates a number of the loop count when your application calls CriMvEasyPlayer::IsNextFrameOnTime() in the main loop. + * In case that the application waits for vertical retrace, 1 interval equals about 16.7 msec. + * The index of array represents the count of intervals as follows: + * + *
Index Interval of video frames retrieval + *
0 Every main loop + *
1 2 main loops + *
2 3 main loops + *
3 4 or more main loops + *
+ * With these values, you can check if the application gets video frames with appropriate intervals. Please use the values as measuring playback smoothness + * + * In order to use these values, the application must meet the following conditions: + * - The main loop should work periodically and stably (Ideally sync with vertical retrace) + * - The application should call CriMvEasyPlayer::IsNextFrameOnTime() once in everly main loop + * + * For example, if the application runs at 59.94fps by waiting for vertical retrace and a framerate of playing movie file is 29.97fps, + * only cnt_frame_interval[1] should be increased. + */ + /*JP< フレームの取得間隔。これらの値は、 CriMvEasyPlayer::IsNextFrameOnTime() がTRUEを返した時にカウントアップされます。
+ * + * フレームの取得間隔とは、アプリケーションがメインループ内でフレーム取得関数を読んだ時のループの回数を意味します。 + * メインループがVSyncと同期している場合は、1 Interval = 約16.7msecということになります。 + * 配列のインデックスは、以下のように取得間隔を表します。
+ * + *
インデックス フレームの取得間隔 + *
0 毎メインループ + *
1 2 メインループ + *
2 3 メインループ + *
3 4 メインループ以上 + *
+ * これらの値を見ることで、アプリが正しい間隔でフレームを取得できたのかどうかをチェックすることができます。ムービが滑らかに再生できているかの目安にしてください。
+ * + * ただし前提として、以下の条件をアプリが満たしている必要があります。 + * - アプリがVSyncなど、一定の周期で安定して動作している + * - メインループ内で毎回 CriMvEasyPlayer::IsNextFrameOnTime() を呼び出す + * + * 上記の条件下において、例えばアプリが59.94fpsで動作している状態で、フレームレートが29.97fpsのムービを再生した場合、cnt_frame_interval[1]のみが増え続けれれば + * 正しい間隔でフレームの取得が出来たことになります。 + */ + CriUint64 cnt_time_early; /*EN< A count of how many times CriMvEasyPlayer::IsNextFrameOnTime() returns FALSE due to the determination if it is the time to provide the next video frame */ + /*JP< CriMvEasyPlayer::IsNextFrameOnTime() が、フレーム表示時刻判定によりFALSEを返した回数。*/ + CriUint64 cnt_decode_delay; /*EN< A count of how many times CriMvEasyPlayer::IsNextFrameOnTime() returns FALSE due to the delay of decoding movie data */ + /*JP< CriMvEasyPlayer::IsNextFrameOnTime()が、ビデオフレームのデコード遅延によりFALSEを返した回数 */ + CriFloat32 time_max_delay; /*EN< Maximum delay time [msec] of the actual time a video frame retrieved against the original time should be retrieved */ + /*JP< ビデオフレームを取得した実際の時刻と、本来表示すべき時刻との最大遅延時間 [msec]。 */ + CriFloat32 time_average_delay; /*EN< Average delay time [msec] of the actual time a video frame retrieved against the original time should be retrieved */ + /*JP< ビデオフレームを取得した実際の時刻と、本来表示すべき時刻との平均遅延時間 [msec]。 */ +} CriMvPlaybackInfo; + +#if defined(XPT_TGT_PS3PPU) +/*EN + * \brief Parameters of SPURS and PPU for decoding + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupSpursParameters_PS3(), CriMv::CalcSpursWorkSize_PS3() + */ +/*JP + * \brief デコードに使うSPURSおよびPPUのパラメータ + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupSpursParameters_PS3(), CriMv::CalcSpursWorkSize_PS3() + */ +typedef struct { + void *spurs_handler; /*EN< SPURS handler */ + /*JP< SPURSハンドル */ + void *spurs_work; /*EN< SPURS work area. The size is spurs_worksize. The alignment is 128 byte. */ + /*JP< SPURS用ワークバッファ。バッファサイズは spurs_worksize で128バイト境界。 */ + CriSint32 spurs_worksize; /*EN< SPURS work size. This size is calculated by CriMv::CalcSpursWorkSize_PS3 function. */ + /*JP< SPURS用ワークサイズ。CriMv::CalcSpursWorkSize_PS3 関数で取得した値。 */ + CriSint32 spurs_max_contention; /*EN< SPURS max contention */ + /*JP< SPURS でムービデコード用に使うSPUの最大数 */ + CriUint8 *spurs_task_priority; /*EN< SPURS task priority x 8 */ + /*JP< SPURS のタスクプライオリティ配列。配列要素は8個。 */ + + CriUint32 ppu_num; /*EN< The number of PPU for decoding (0-2) */ + /*JP< The number of PPU for decoding (0-2) */ + CriSint32 ppu_thread_prio; /*EN< PPU Thread Priority. This priority is used for decoding thread in the case of ppu_num equal 2. */ + /*JP< PPU Thread Priority. この値は ppu_num に2を指定した場合に作成するスレッドに使われる。 */ +} CriMvProcessorParameters_PS3; + +// [NOT SUPPORT on normal library] +// for SPU Thread +typedef struct { + CriUint32 ppu_num; /* The number of PPU for decoding (0-2) */ + CriSint32 ppu_prio; /* PPU Thread Priority */ + CriUint32 spu_num; /* The number of SPU for decoding (0-6) */ + CriSint32 spu_grp_prio; /* SPU Thread Group Priority */ +} CriMvSpuThreadParameters_PS3; + +#endif + +#if defined(XPT_TGT_XBOX360) +/*EN + * \brief Parameters of Xbox360 processors for decoding + * \ingroup MDL_MV_BASIC + * + * \sa CriMvEasyPlayer::SetUsableProcessors_XBOX360() + */ +/*JP + * \brief デコードに使うXbox360プロセッサのパラメータ + * \ingroup MDL_MV_BASIC + * + * \sa CriMvEasyPlayer::SetUsableProcessors_XBOX360() + */ +typedef struct { + CriBool processor0_flag; /*EN< Processor 0 (Core 0, Thread 0) usable flag */ + /*JP< プロセッサ0 (コア0スレッド0) 使用可能フラグ */ + CriBool processor1_flag; /*EN< Processor 1 (Core 0, Thread 1) usable flag */ + /*JP< プロセッサ1 (コア0スレッド1) 使用可能フラグ */ + CriBool processor2_flag; /*EN< Processor 2 (Core 1, Thread 0) usable flag */ + /*JP< プロセッサ2 (コア1スレッド0) 使用可能フラグ */ + CriBool processor3_flag; /*EN< Processor 3 (Core 1, Thread 1) usable flag */ + /*JP< プロセッサ3 (コア1スレッド1) 使用可能フラグ */ + CriBool processor4_flag; /*EN< Processor 4 (Core 2, Thread 0) usable flag */ + /*JP< プロセッサ4 (コア2スレッド0) 使用可能フラグ */ + CriBool processor5_flag; /*EN< Processor 5 (Core 2, Thread 1) usable flag */ + /*JP< プロセッサ5 (コア2スレッド1) 使用可能フラグ */ + CriSint32 thread_priority; /*EN< Priority of decoding threads on the active processors */ + /*JP< 各プロセッサ上でデコード処理を行うスレッドの優先度 */ +} CriMvProcessorParameters_XBOX360; +#endif + +#if defined(XPT_TGT_VITA) +/*EN + * \brief AVC Decoder Parameters + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupAvcDecoderParameters_VITA() + */ +/*JP + * \brief AVCデコーダパラメータ + * \ingroup MDL_MV_BASIC + * + * \sa CriMv::SetupAvcDecoderParameters_VITA() + */ +typedef struct { + CriUint32 horizontal; /*EN< Maximum width for decoding (in pixel) */ + /*JP< 最大デコード画像の横幅 (単位:ピクセル) */ + CriUint32 vertical; /*EN< Maximum height for decoding (in pixel) */ + /*JP< 最大デコード画像の高さ (単位:ピクセル) */ + CriUint32 n_ref_frames; /*EN< Maximum reference frames on decoding (default:3) */ + /*JP< デコード時の最大参照画像の枚数 */ + CriUint32 n_decoders; /*EN< Maximum number of avc decoders (max:1) */ + /*JP< 同時に使用するAVCでコーダの最大数 (1固定) */ + +} CriMvAvcDecoderParameters_VITA; +#endif + +/*--------------------------------------------------------------------------*/ +/* */ +/*--------------------------------------------------------------------------*/ +typedef enum { + CRIMV_PCM_FORMAT_SINT16 = 0, + CRIMV_PCM_FORMAT_FLOAT32 = 1, + + /* Keep enum 4bytes */ + CRIMV_PCM_FORMAT__MAKE_ENUM_SINT32 = 0x7FFFFFFF +} CriMvPcmFormat; +/* + * \brief 16bit wave data information + * \ingroup MDL_MV_INFO + * Information about a 16-bit waveform. + */ +/* 16bit Waveform 情報 */ +typedef struct { + CriUint32 num_channel; /* Number of Channels. monaural = 1, stereo = 2 */ + /* Number of Channels. monaural = 1, stereo = 2 */ + CriUint32 num_samples; /* Number of sample */ + /* サンプル数 */ + CriUint32 sampling_rate; /* Sampling rate */ + /* サンプリング周波数 */ +} CriMvWaveInfo; + +/* オーディオヘッダ */ +typedef struct { + /* ストリーミングパラメータと共通 */ + CriUint32 sampling_rate; + CriUint32 num_channel; + CriUint32 total_samples; + CriUint32 codec_type; + + CriUint32 metadata_count; + CriUint32 metadata_size; + + /* ヘッダ固有 */ + CriUint32 a_input_xsize; +} CriMvPlyAudioHeader; + +/* ビデオヘッダ */ +typedef struct { + /* ヘッダ固有 */ + CriUint32 width; + CriUint32 height; + CriUint32 disp_width; + CriUint32 disp_height; + CriUint32 framerate_n; + CriUint32 framerate_d; + CriUint32 total_frames; + + CriUint32 material_width; /* width of video original source. 0 means no info. */ + CriUint32 material_height; /* height of video original source. 0 means no info. */ + CriUint32 screen_width; /* screen width for Wii */ + + CriUint32 codec_type; + CriUint32 codec_dc_option; /* 11 or 10 */ + + CriUint32 metadata_count; + CriUint32 metadata_size; + + CriUint32 pre_padding; + CriUint32 color_conversion_type; + CriSint32 max_picture_size; + CriSint32 average_bitrate; +} CriMvPlyVideoHeader; + +/* サブタイトルヘッダ */ +typedef struct { + CriBool is_subtitle_data; + CriUint32 num_channel; + CriUint64 time_unit; + CriUint32 max_subtitle_size; +} CriMvPlySubtitleHeader; + +/* キューポイントヘッダ */ +typedef struct { + CriBool is_cuepoint_data; + CriUint32 metadata_count; + CriUint32 metadata_size; + CriUint32 num_eventpoint; + CriUint64 time_unit; +} CriMvPlyCuePointHeader; + +/* アルファヘッダ */ +typedef struct { + /* ヘッダ固有 */ + CriUint32 width; + CriUint32 height; + CriUint32 disp_width; + CriUint32 disp_height; + CriUint32 framerate_n; + CriUint32 framerate_d; + CriUint32 total_frames; + + CriMvAlphaType alpha_type; + CriUint32 codec_type; + + CriUint32 metadata_count; + CriUint32 metadata_size; + + CriUint32 pre_padding; + CriUint32 color_conversion_type; + CriSint32 max_picture_size; + CriSint32 average_bitrate; +} CriMvPlyAlphaHeader; + +/* アルファのみのフレーム情報 */ +typedef struct { + CriUint8 *imageptr; /*EN< Pointer to image data */ + /*JP< 画像データのポインタ */ + CriSint32 frame_id; /*EN< Frame ID */ + /*JP< フレーム識別ID */ + CriUint32 width; /*EN< Width of movie frame [pixel] */ + /*JP< ムービの横幅[pixel] */ + CriUint32 height; /*EN< Height of movie frame [pixel] */ + /*JP< ムービの高さ[pixel] */ + CriUint32 disp_width; /*EN< Width of image [pixel] */ + /*JP< 有効な映像の横幅[pixel] */ + CriUint32 disp_height; /*EN< Height of image [pixel] */ + /*JP< 有効な映像の高さ[pixel] */ + CriUint32 pitch; /*EN< Pitch of movie frame [byte]*/ + /*JP< ムービのピッチ[byte] */ + CriUint64 time; /*EN< Frame time ('time / tunit' indicates time in seconds) */ + /*JP< 時刻。time / tunit で秒を表す。 */ + CriUint64 tunit; /*EN< Unit of time measurement */ + /*JP< 時刻単位 */ + CriSint32 frame_id_per_data; /*EN< Frame ID of the movie data */ + /*JP< ムービデータごとのフレーム番号 */ + CriMvAlphaType alpha_type; /*EN< Composite mode */ + /*JP< アルファの合成モード*/ + void *detail_ptr; /* TEMP: for internal use */ + CriUint32 color_conversion_type; /*EN< Color space converion type. Fullrange or Limited.*/ + /*JP< 色変換タイプ。 */ +} CriMvAlphaFrameInfo; + +// 内部管理用。ムービ情報をユーザに渡す時はこれとほぼ同じだろうか。 +/* Information of USF File */ +typedef struct { + CriBool is_usf_file; + CriUint32 max_chunk_size; + CriUint32 min_buffer_size; + CriUint32 bitrate; + CriUint32 format_version; + /* Video */ + CriUint32 num_video; + CriMvPlyVideoHeader videohead[CRIMV_MAX_VIDEO_NUM]; + /* Audio */ + CriUint32 num_audio; + CriMvPlyAudioHeader audiohead[CRIMV_MAX_AUDIO_NUM]; + /* Subtitle */ + CriUint32 num_subtitle; + CriMvPlySubtitleHeader subtitlehead; + /* Alpha */ + CriUint32 num_alpha; + CriMvPlyAlphaHeader alphahead[CRIMV_MAX_ALPHA_NUM]; + /* CuePoint */ + CriUint32 num_cuepoint; + CriMvPlyCuePointHeader cuepointhead; +} CriMvPlyHeaderInfo; + +/* Video Elementary Stream */ +typedef struct { + CriUint32 fcid; + CriSint32 track_no; // チャンクのチャネル番号 + void *vdec; +} CriMvPlyVideo; + +typedef struct { + CriUint32 fcid; + CriSint32 track_no; // チャンクのチャネル番号 + void *dec; +} CriMvPlyAlpha; + +/* ムービヘッダを管理するための構造体 */ +typedef struct { + CriMvPlyHeaderInfo info; + CriBool write_new_head_flag; // CRIDが見つかって次のヘッダを書き込む準備ができたか? + CriUint32 num_remaining_adec_head; // 必要な残りのオーディオヘッダの数 + CriUint32 num_remaining_vdec_head; // 必要な残りのビデオのヘッダの数 + CriUint32 num_remaining_subtitle_head; // 必要な残りの字幕のヘッダの数 + CriUint32 num_remaining_alpha_head; // 必要な残りのアルファのヘッダ数 + CriUint32 num_remaining_cuepoint_head; // 必要な残りのキューポイントのヘッダ数 + /* 2010-08-19: TEMP: CONCAT_KAI: Don't refer this member. */ + CriUint64 accumulated_tcount; +} CriMvHeaderInfoContainer; + +typedef struct { + CriBool is_play_audio; + CriUint32 fcid; + CriUint32 track_no; // チャンクのチャネル番号 + void *adec; // 実際のオーディオコーデック + CriUint32 num_channel; // データのチャネル数 + CriUint32 sampling_rate; // サンプリング周波数 + CriUint32 output_buffer_samples; + CriSj sji; // UNI + CriSj sjo[CRIMV_PCM_BUFFER_MAX]; // RBF + CriUint32 sjo_bufsize[CRIMV_PCM_BUFFER_MAX]; + CriBool term_supply; // データ供給終了通知フラグ + CriBool is_working; // コンテンツチャンク処理中 + +#if defined(ENABLE_DYNAMIC_AUDIO_SWITCH) + CriUint32 next_track_no; // ユーザが指定した切替先のトラック番号 + CriUint32 last_track_switch_time; // 切替元のトラックの最後にチャンクをとった時刻 + CriUint32 last_track_switch_tunit; // 上記時刻の単位 (in Hz?) + CriMvPlyAmngTrackState switch_state; // トラック切替による状態 +#endif +} *CriMvPlyAdec, CriMvPlyAdecObj; + +typedef struct { + + CriMvPlyAdec mvply_adecs[NUM_MAX_ADEC]; + CriSint32 num_adecs; + CriUint32 size_smpl; + CriSj sji; + CriUint32 chunk_num_per_server; + + CriBool (*cbfunc_nofify_found_header)(void *usrobj, CriChunk *ckc, CriUint8 chno); + void *usrobj_nofify_found_header; + +} *CriMvPlyAmng, CriMvPlyAmngObj; + + +/* シークブロック情報 */ +typedef struct { + CriSint32 top_frame_id; +} CriMvSeekBlockInfo; + +/* ストリーマ用情報 */ +typedef struct { + CriUint32 max_chunk_size; + CriUint32 average_bitrate; +} CriMvStreamerInfo; + + +/* ハンドル作成用コンフィグ構造体 */ +typedef struct { + CriUint32 readbuffer_size; +} CriMvHandleConfig; + + +/*JP CRI Movie ハンドル */ +/*EN + * A handle for a single movie. If multiple movies are to be played simultaneously, + * create a CriMvPly handle for each movie. + * + * \sa criMvPly_Create(), criMvPly_Destroy() */ +typedef struct { + /*** Member variable is ***/ + CriBool used; + CriMvPlyStatus stat; + CriBool request_stop; + CriBool restrain_supply; + CriBool term_supply; + void *cs_work; + void *cshn; + /* USF Header */ + + CriMvHeaderInfoContainer headinfo_container[CRIMVPLY_HEAD_CONTAINER_NUM]; + Uint16 cur_dechead_idx; + CriUint32 cnt_dechead; /* ヘッダ解析ごとに更新 */ + CriUint32 cnt_concat; /* GetFrameで更新 */ + + CriMvPlyHeaderInfo headinfo; + CriUint32 num_headck; /* ヘッダ解析処理したチャンク数 */ + CriFloat32 def_buffering_time; + CriUint32 def_max_stream; + CriUint32 def_sound_output_buffer_samples; + CriSint32 def_track_play_audio; /* -1 でオーディオ再生無し */ + + /* デリゲートパラメータ構造体 */ + CriSint32 size_dlgparams; + CriUint8 *ptr_dlgparams; + + CriBool is_prepare_work; + CriMvStreamingParameters stmprm; /* ストリーミングパラメータの記録 */ + /* Demultiplexer */ + CriSint32 inputtype; /* ストリーミングかメモリか?メモリ=ユニSJ再生 */ + CriBool is_usf_data; /* 入力ファイルはUSFファイルか? */ + void *demux; /* USFデマルチプレクサハンドル */ + CriUint32 max_demuxout; /* デマルチプレクサ出力の最大種別数 */ + CriUint32 num_demuxout; /* デマルチプレクサ出力に設定済みの種別数 */ + CriSj headanaly_in_sj; // RBF + CriSj headanaly_out_sj; // UNI + CriSj read_sj; // RBF + CriChunk readck; + + CriSj memplay_sj; // UNI (for memory playback) + CriChunk movie_on_mem; /* メモリ指定のムービデータ記憶用(1個) */ + CriUint32 offset_content; /* メモリ指定先頭データのコンテンツ本体までのサイズ */ + + /* === ハンドル作成時に確保 === */ + CriHeap heap_gen; + /* ヘッダ解析用の読み込み領域 */ + CriUint32 headanaly_bufsize; + /* ハンドル内部メモリは最初に10kbyte確保して使いまわす。具体的にはヘッダ解析用。 */ + CriHeap local_heap; /* ハンドル内部専用Heap */ + CriSint32 local_bufsize; /* ハンドル内部専用Heap用のバッファサイズ */ + CriUint8 *local_bufptr; /* ハンドル内部専用Heap用のバッファポインタ */ + /* === メタワークバッファ (ヘッダ解析時に確保) === */ + CriHeap heap_meta; + /* === ワークバッファ作成時に確保 === */ + CriHeap heap_core; + /* 読み込みバッファ */ + CriUint32 size_readbuf_main; + CriUint32 size_readbuf_ext; + /* Video Decoder */ + CriMvPlyVideo video; + CriUint32 framerate_n; + CriUint32 framerate_d; + /* Audio Decoder */ + CriMvPlyAmng audio_mngr; + CriMvPcmFormat pcmfmt; + CriUint32 size_smpl; + CriHeap heap_audio2; + /* Subtitle */ + CriSj sjo_subtitle; + CriSint32 concat_subtitle_cnt; /* 字幕の連結処理回数 */ + CriSint32 ch_subtitle; /* 字幕の連結処理回数 */ + /* Alpha */ + CriMvPlyAlpha alpha; + + /* 折り返しチャンク対応用(使うかどうかに関係なく変数だけは定義する) */ + CriUint32 bufsize_read_main; /* 入力SJのバッファ本体サイズ */ + CriUint32 bufsize_read_ext; /* 入力SJののりしろサイズ */ + CriUint8 *read_sj_bufptr; /* 入力RBSJの先頭バッファアドレス */ + + /* ストリーミングパラメータに入れるという手段もアリかも? */ + CriSint32 seek_frame_id; /* シークしたいフレームID(GOPの途中の可能性あり) */ + CriSint32 video_gop_top_id; /* シーク後のビデオGOP先頭フレームID : 0以下でシーク無し */ + CriSint32 alpha_gop_top_id; /* シーク後のアルファGOP先頭フレームID : 0以下でシーク無し */ + CriBool seek_video_prep_flag; /* シーク再生のビデオ準備完了フラグ(GOP途中まで進んだか?) */ + CriBool seek_alpha_prep_flag; /* シーク再生のアルファ準備完了フラグ(GOP途中まで進んだか?) */ + CriBool seek_audio_prep_flag; /* シーク再生のオーディオ準備完了フラグ(シーク指定時刻まで捨てたか?) */ + + CriSint32 dechdr_stage; /* DECHDRの進み具合 */ + CriSint32 sji_meta_bufsize; /* メタデータ用入力バッファサイズ */ + CriSj sji_meta; /* メタデータ用入力SJ */ + CriUint32 cnt_meta_ck; /* メタデータ用入力SJ */ + void *video_seektbl_ptr; + CriUint32 video_seektbl_size; + CriSint32 video_gop_num; + void *alpha_seektbl_ptr; + CriUint32 alpha_seektbl_size; + CriSint32 alpha_gop_num; + + void *audio_header_ptr[CRIMV_MAX_AUDIO_NUM]; + CriUint16 audio_header_size[CRIMV_MAX_AUDIO_NUM]; + + void *cuepoint_meta_ptr; + CriUint32 cuepoint_meta_size; + CriMvCuePointInfo cuepoint_info; + + CriMvInputBufferInfo ibuf_info; + CriFloat32 reload_sec_threshold; + + CriSint32 num_frames_for_prep; + + /* For Sofdec2 */ + CriHeap heap_playback; + CriMvMetaDataWorkMallocFunc cbfunc_meta_alloc; + CriMvMetaDataWorkFreeFunc cbfunc_meta_free; + void* usrobj_meta_data; + void* meta_data_work_allocated; /* ユーザアロケータで確保されたメタデータワーク */ + void* event_table_work_allocated; /* ユーザアロケータで確保されたイベントテーブル */ + CriMvStreamerInfo streamer_info; + + /* OUTER_FRAMEPOOL_WORK */ + CriMvFramepoolWorkMallocFunc cbfunc_framepool_alloc; + CriMvFramepoolWorkFreeFunc cbfunc_framepool_free; + void* usrobj_framepool; + void* framepool_work_allocated; /* ユーザアロケータで確保されたフレームプールワーク(解放必要) */ + void* framepool_work_set; /* 直接バッファ指定されたフレームプールワーク(解放不要) */ + + /* For Debug */ + volatile CriUint8 end_sequence_info; + CriUint64Adr header_ptr; + CriSint64 header_size; + CriUint64Adr body_ptr; + CriSint64 body_size; + + CriBool sync_flag; + + CriBool error_flag; + +#if defined(XPT_TGT_IOS) + CriChar8 vavfios_filepath[CRIMVPLY_VAVFIOS_MAX_FILEPATH]; +#endif + + /* For Tools */ + void *extended_mvinfo_config; + + /* ハンドル作成コンフィグ関連 */ + CriBool use_hn_config_flag; /* ハンドル作成コンフィグ指定があったかどうか */ + CriMvHandleConfig hn_config; + +} *CriMvPly, CriMvPlyObj; + +/*************************************************************************** + * Function Declaration + ***************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ライブラリ初期化 */ +/* + * \brief ライブラリの初期化 + * \param なし + * \return なし + * \par 説明: + * ライブラリの初期化を行います。
+ * 複数回連続で初期化した場合は、最初の1回のみ初期化処理を実行します。 + */ +/* + * \ingroup MODULE_INIT + * \brief Initialize library + * + * This function initializes the CRI Movie library, including internal audio, + * streaming and video subsystems. This function must be + * called before any other function in this library will work properly. + * This function initializes only the first time it is called; if it is + * called again, it simply increments an internal counter and returns; it + * does not re-initialize, nor does it create an error condition. + * + * Therefore, it is safe to call criMvPly_Initialize() and criMvPly_Finalize() + * at the beginning and end, respectively, within each of the independent + * modules in your program. If you match these functions call for call, + * only the first criMvPly_Initialize() function and the last criMvPly_Finalize() + * functions should have any effect. + * + * \sa criMvPly_Finalize() + */ +void CRIAPI criMvPly_Initialize(void); + +/* ライブラリ終了 */ +/* + * \brief ライブラリ終了 + * \param なし + * \return なし + * \par 説明: + * ライブラリの終了処理を行います。
+ * 複数回初期化をしていた場合は、同じ回数だけ終了処理を実行してください。 + */ +/* + * \ingroup MODULE_INIT + * \brief Finalize library + * + * This function deallocates any resources in use by the library. + * It should be called the same number of times that the criMvPly_Initialize() + * function is called. If the criMvPly_Initialize() function is called n + * times, on the nth time the criMvPly_Finalize() function is called, + * criMvPly_Finalize() releases any resources allocated by CRI Movie. + * + * Therefore, it is safe to call criMvPly_Initialize() and criMvPly_Finalize() + * at the beginning and end, respectively, within each of the independent + * modules in your program. If you match these functions call for call, + * only the first criMvPly_Initialize() function and the last criMvPly_Finalize() + * functions should have any effect. + * + * \sa criMvPly_Initialize() + */ +void CRIAPI criMvPly_Finalize(void); + +/* ハンドル作成 */ +/* + * \brief ハンドル作成 + * \param heap : メモリ確保に使用するHeapハンドル + * \return CriMvPlyハンドル + * \par 説明: + * CRI Movie ハンドルを作成します。
+ * 必要なハンドル管理領域はHeapハンドルを使って自動的に確保します。
+ * 作成直後のハンドル状態はSTOP状態です。 + */ +/* + * \ingroup MODULE_INIT + * \brief Create a handle + * \param heap A valid CriHeap handle + * \return A valid CriMvPly handle, or NULL if the handle cannot be allocated + * + * This function creates a CriMvPly handle in the CRIMVPLY_STATUS_STOP state. + * Memory for the handle is allocated from the CriHeap structure that you provide. + * Any memory allocation failure during this function results in a text error message to output, and the program hangs. + * Make sure to initialize and create your heap with criHeap_Initialize() and + * criHeap_Create() before calling this function. + * + * \sa CriMvPly, CriMvPlyStatus, criHeap_Initialize(), criHeap_Create() + */ +CriMvPly CRIAPI criMvPly_Create(CriHeap heap); + +/* コンフィグ指定のハンドル作成 */ +/* config がNULL指定の場合はコンフィグ指定無しと同様 */ +CriMvPly CRIAPI criMvPly_CreateWithConfig(CriHeap heap, CriMvHandleConfig *config); + +/* ハンドル破棄 */ +/* + * \brief ハンドル破棄 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * CRI Movie ハンドルの破棄を行います。
+ * ハンドル作成時に引数で指定したHeapハンドルを使って、ハンドル管理領域を解放します。
+ * ワークバッファを確保したままの場合は、ワークバッファ確保時に指定したHeapハンドルを使ってワークバッファも解放します。
+ * ハンドルの破棄は、ハンドル状態がSTOPかPLAYENDの時にしか実行できません。 + */ +/* + * \ingroup MODULE_INIT + * \brief Destroy a handle + * \param mvply A valid CriMvPly handle to be destroyed + * + * This function destroys the CriMvPly handle previously created + * with criMvPly_Create(). + * + * You can only destroy the handle if it is in either the CRIMVPLY_STATUS_STOP or the + * the CRIMVPLY_STATUS_PLAYEND states. Attempting to destroy the handle in + * any other state will produce an error message. You can check the status of + * the handle at any time with criMvPly_GetStatus(). + * + * Any work buffers allocated via criMvPly_AllocateWorkBuffer(), if they are + * still associated with the handle, are freed when criMvPly_Destroy() is called. + * + * \sa CriMvPly, CriMvPlyStatus, criMvPly_GetStatus(), criMvPly_AllocateWorkBuffer() + */ +void CRIAPI criMvPly_Destroy(CriMvPly mvply); + +/* ストリーミングパラメータの取得 */ +/* + * \brief ストリーミングパラメータの取得 + * \param mvply : CRI Movie ハンドル + * \param stmprm : ストリーミングパラメータ + * \return なし + * \par 説明: + * ヘッダ解析の結果をもとに、ムービ再生に必要なストリーミングパラメータを取得します。
+ * ハンドル状態がWAIT_PREPになると取得できるようになります。
+ * このパラメータをもとにcriMvPly_AllocateWorkBuffer関数を呼び出すことができます。
+ * 必要ならばこのパラメータの値を変更して、例えば音ありムービで音を再生しない、といったことも可能です。
+ */ +/* + * \ingroup MODULE_BUFFER + * \brief Get streaming parameters + * \param mvply A valid CriMvPly handle + * \param stmprm An empty CriMvStreamingParameters structure to be filled with data + * + * This function permits you to get detailed information about the stream and + * dynamically allocate resources just before the video and audio sequence + * begins playback. + * + * This function does nothing if the current state of the CriMvPly handle is + * CRIMVPLY_STATUS_DECHDR or CRIMVPLY_STATUS_STOP. The only useful state in + * which to call criMvPly_GetStreamingParameters() is the CRIMVPLY_WAIT_PREP + * status. When the CriMvPly handle is in the CRIMVPLY_WAIT_PREP status, + * calling this function will cause the CriMvStreamingParameters field to be + * filled with data. + * + * Some of the CriMvStreamingParameters, such as buffering time and the + * maximum number of files to read, are copied from the CriMvPly structure. + * However, maximum bitrate, video size, audio stream rate and channel + * info are calculated from the incoming stream. + * + * After calling criMvPly_GetStreamingParameters(), you can programmatically + * override any of the fields in the CriMvStreamingParameters struct yourself + * before calling criMvPly_AllocateWorkBuffer() with it. For example, you might + * need to read a stream containing both audio and video, but only output the + * video from the stream. In this case you could allocate trivial audio buffers + * for output by modifying the CriMvStreamingParameters struct accordingly after + * calling this function. + * + * \sa criMvPly_AllocateWorkBuffer(), CriMvPly, CriMvStreamingParameters + */ + void CRIAPI criMvPly_GetStreamingParameters(CriMvPly mvply, CriMvStreamingParameters *stmprm); + +/* ワークバッファの確保 */ +/* + * \brief ワークバッファの確保 + * \param mvply : CRI Movie ハンドル + * \param heap : + * \param stmprm : ストリーミングパラメータ + * \return なし + * \par 説明: + * 引数のHeapハンドルを使って、読み込みバッファやビデオ/オーディオのワークバッファを確保します。
+ * この関数を呼び出し可能なのは、STOP状態かWAIT_PREP状態の時のみです。
+ * 同じハンドルに対して2度呼び出すと、1度目のワークバッファを全て解放してから、改めてワークバッファを確保します。
+ * criMvPly_Start関数よりも先にワークバッファを確保しておくこともできます。 + */ +/* + * \ingroup MODULE_BUFFER + * \brief Allocate internal streaming work buffers + * \param mvply A CriMvPly handle + * \param heap A CriHeap handle + * \param stmprm An initialized CriMvStreamingParameters structure + * + * This function allocates internal streaming buffers for the CriMvPly movie + * player from the CriHeap. The amount of memory required is based + * on the maximum bitrate of the stream, the requested buffering time, the + * maximum chunk size, and the height and width of the incoming video frame. + * However, a small amount of memory is allocated for the + * video and audio decoders from the CriHeap as well. + * + * The CriHeap handle passed as a parameter to this function need not + * be the same CriHeap handle you passed to the criMvPly_Create() function. + * You may prefer to use either one or two heaps. + * + * This function can be called only if the CriMvPly handle is in the + * CRIMVPLY_STATUS_STOP or the CRIMVPLY_STATUS_WAIT_PREP status. Calling + * this function any other time will produce an error message. + * + * If this function is called twice without calling criMvPly_FreeWorkBuffer(), + * it releases the previously allocated buffers before allocating them again. + * + * This function must be called sometime before criMvPly_Start(). + * + * \if ps2 + * \par PS2 only: + * The PS2 implementation of this function additionally allocates buffers for + * internal DMA tags. If these allocations fail due to lack of memory, the + * library will hang. + * \endif + * + * \sa CriMvPly, CriHeap, CriMvPlyStatus, CriMvStreamingParameters, criMvPly_FreeWorkBuffer(), + * criMvPly_Start() + */ +CriBool CRIAPI criMvPly_AllocateWorkBuffer(CriMvPly mvply, CriHeap heap, CriMvStreamingParameters *stmprm); + +/* ワークバッファの解放 */ +/* + * \brief ワークバッファの解放 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * criMvPly_AllocateWorkBuffer関数で確保したワークバッファを全て解放します。
+ * この関数を呼び出し可能なのは、STOP/WAIT_PREP/PLAYEND状態の時のみです。
+ * CRI Movie Ver.0.60 では未実装です。 + */ +/* + * \ingroup MODULE_BUFFER + * \brief Release streaming work buffer + * \param mvply A valid CriMvPly handle + * + * This function releases streaming work buffers allocated from the CriHeap + * previously associated with criMvPly_AllocateWorkBuffer(). + * This function should only be called at CRIMVPLY_STATUS_STOP, + * CRIMVPLY_STATUS_WAIT_PREP or CRIMVPLY_STATUS_PLAYEND states. However, this + * function does not verify the current stream status before releasing + * all the buffers; it merely deallocates them. Expect interesting crashes + * if you call this function while playing a movie. + * + * You can verify the current CriMvPly handle status with criMvPly_GetStatus() if + * necessary. + * + */ +void CRIAPI criMvPly_FreeWorkBuffer(CriMvPly mvply); + +/* 再生するオーディオチャネルの設定 */ +/* + * \brief 再生するオーディオチャネルの設定 + * \param mvply : CRI Movie ハンドル + * \param ch : オーディオチャネル番号 + * \return なし + * \par 説明: + * CriMvStreamingParameters構造体のメンバ track_play_audioのデフォルト値を設定します。
+ * criMvPly_GetStreamingParameters関数でCriMvStreamingParameters構造体を取得したときにこの値が格納されます。
+ * 何も設定していない場合、buffering_timeには0が入います。 + * -1を指定するとオーディオを再生しない設定になります。 + */ +void CRIAPI criMvPly_SetAudioTrack(CriMvPly mvply, CriSint32 track); + +/* バッファリング時間(単位[sec])の設定 */ +/* + * \brief バッファリング時間(単位[sec])の設定 + * \param mvply : CRI Movie ハンドル + * \param time : バッファリング時間 + * \return なし + * \par 説明: + * CriMvStreamingParameters構造体のメンバbuffering_timeのデフォルト値を設定します。
+ * criMvPly_GetStreamingParameters関数で CriMvStreamingParameters構造体を取得したときにこの値が格納されます。
+ * 何も設定していない場合、buffering_timeには1.0秒が入っています。 + */ +/* + * \ingroup MODULE_BUFFER + * \brief Set default buffering time (unit[sec]) + * \param mvply A valid CriMvPly handle + * \param time Buffering time in seconds + * + * This function tells the CriMvPly handle how much time of the stream to buffer in + * memory. Buffering is necessary to cover seeks, error retries, latency and + * other various hiccups in most data sources. + * + * This value is stored in the buffering_time field of the CriMvStreamingParameters + * struct. It is set to a default of 1.0 seconds when the CriMvPly handle is created. + * This is typically safe for most DVD type file systems. + * + * \sa CriMvPly, CriMvStreamingParameters + */ +//void CRIAPI criMvPly_SetBufferingTime(CriMvPly mvply, CriFloat32 time); + +/* 同時読み込みファイル数の設定 */ +/* + * \brief 同時読み込みファイル数の設定 + * \param mvply : CRI Movie ハンドル + * \param max_stm : 同時読み込みファイル数 + * \return なし + * \par 説明: + * CriMvStreamingParameters構造体のメンバmax_simultaneous_read_filesのデフォルト値を設定します。
+ * criMvPly_GetStreamingParameters関数で CriMvStreamingParameters構造体を取得したときにこの値が格納されます。
+ * 何も設定していない場合、max_simultaneous_read_filesには1が入っています。 + */ +/* + * \ingroup MODULE_BUFFER + * \brief Set maximum number of simultaneous streams + * \param mvply A valid CriMvPly handle + * \param max_stm The maximum number of simultaneous streams + * + * This function sets the default value of the "max_simultaneous_read_files" field of + * the CriMvStreamingParameters struct. Currently, setting this value has no effect. + */ +//void CRIAPI criMvPly_SetMaxSimultaneousStreams(CriMvPly mvply, CriUint32 max_stm); + +/* サウンド出力バッファサンプル数の設定 */ +/* + * \brief GetWave16で要求する最大サンプル数の設定 + * \param mvply : CRI Movie ハンドル + * \param max_smpl : 最大サンプル数 + * \return なし + * \par 説明: + * CriMvAudioParameters構造体のメンバoutput_buffer_samplesのデフォルト値を設定します。
+ * criMvPly_GetStreamingParameters関数で CriMvStreamingParameters構造体を取得したときにこの値が格納されます。
+ * 何も設定していない場合、output_buffer_samplesには16*1024が入っています。 + */ +/* + * \ingroup MODULE_AUDIO + * \brief Set default sound output buffer samples + * \param mvply A valid CriMvPly handle + * \param smpls : sound output buffer samples + * + * This function sets the default value of the "output_buffer_samples" field in the + * CriMvAudioParameters struct. The default value is 16384, which is set when + * criMvPly_Create() is called. + * + * This function only has an effect if it is called before the + * criMvPly_AllocateWorkBuffer() function is called, since this is when the audio + * output buffer is allocated. + * + * \sa CriMvAudioParameters, criMvPly_Create(), criMvPly_AllocateWorkBuffer(), + * criMvPly_GetWave16() + */ +//void criMvPly_SetMaxSamplesOfGetWave16(CriMvPly mvply, CriUint32 max_smpl); +void CRIAPI criMvPly_SetSoundOutputBufferSamples(CriMvPly mvply, CriUint32 smpls); + +/* ハンドル状態の取得 */ +/* + * \brief ハンドル状態の取得 + * \param mvply : CRI Movie ハンドル + * \return ハンドル状態 + * \par 説明: + * ハンドル状態を取得します。 + */ +/* + * \ingroup MODULE_STATE + * \brief Get the handle status + * \param mvply A valid CriMvPly handle + * \return One of the CriMvPlyStatus enum values + * + * This function gets the current status of the CRI Movie handle. Check the + * following link for possible return values. + * + * \sa CriMvPlyStatus + */ +CriMvPlyStatus CRIAPI criMvPly_GetStatus(CriMvPly mvply); + +/* WAIT状態から次の状態への遷移通知 */ +/* + * \brief WAIT状態から次の状態への遷移通知 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * ハンドル状態をWAIT_**** 状態から次の状態に遷移させます。状態に応じて次のように使用します。
+ * ・WAIT_PREP 状態 : criMvPly_AllocateWorkBuffer関数でワークを確保しおわったら呼び出してください。
+ * ・WAIT_PLAYING 状態 : ビデオフレーム、オーディオデータを取得して表示・出力の準備ができたら、 + * 出力を開始して、本関数を呼び出してください。
+ * ・WAIT_PLAYEND 状態 : 最後のビデオフレームの表示、最後のオーディオデータの出力が終了したら呼び出してください。
+ * ・WAIT_STOP 状態 : ビデオやオーディオの出力が停止してもいい状態になったら、呼び出してください。
+ * 本関数を呼び出すと各状態は即座に次の状態に遷移します。
+ * 本関数を WAIT_**** 以外の状態で呼び出しても、状態は何も変わりません。 + */ +/* + * \ingroup MODULE_STATE + * \brief Notify transition from WAIT status + * \param mvply A valid CriMvPly handle + * + * This function notifies the CriMvPly handle that your application is ready to + * go from the current WAIT state to the next state. There are exactly four states + * in which it is appropriate to call this function: + * + * - CRIMVPLY_STATUS_WAIT_PREP After your application has allocated buffers with + * criMvPly_AllocateWorkBuffer() + * - CRIMVPLY_STATUS_WAIT_PLAYING After your application has prerolled stream data (if + * necessary) + * - CRIMVPLY_STATUS_WAIT_PLAYEND After your application has displayed the last frames of audio and + * video from the stream + * - CRIMVPLY_STATUS_WAIT_STOP After your application suspends playback from the stream + * + * You can check the current status of the CriMvPly handle by calling the criMvPly_GetStatus() + * function. This function has no effect if called in states other than those listed above. + * + * \sa CriMvPly, CriMvPlyStatus + */ +void CRIAPI criMvPly_IncrementState(CriMvPly mvply); + +/* 状態の更新 */ +/* + * \brief CriMvPlyモジュールのサーバ関数 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * 主にデマルチプレクサ内部のデータの更新を行います。
+ * 本関数はアプリケーションのメインスレッド側でで毎回呼び出すようにしてください。
+ */ +void CRIAPI criMvPly_Update(CriMvPly mvply); + +/* 再生開始 */ +/* + * \brief 再生開始 + * \param mvply : CRI Movie ハンドル + * \return 再生開始できた場合はCRI_TRUE, 失敗した場合はCRI_FALSE + * \par 説明: + * 再生のための処理を開始します。
+ * 本関数呼出し後、ハンドル状態はDECHDRに遷移します。
+ */ +/* + * \ingroup MODULE_STATE + * \brief Start of playback processing + * \param mvply A valid CriMvPly handle + * + * This function initiates playback processing. This function should be called + * after the CriMvPly handle is created and the data source has been opened, + * but before the work buffers are allocated with criMvPly_AllocateWorkBuffer(). + * This function sets the current status of the CriMvPly handle to + * CRIMVPLY_STATUS_DECHDR, which prepares it to decode the header information + * from the data source. + * + * \sa CriMvPly, CriMvPlyStatus, criMvPly_AllocateWorkBuffer() + */ +CriBool CRIAPI criMvPly_Start(CriMvPly mvply); + +/* 再生停止リクエスト(即時復帰) */ +/* + * \brief 再生停止リクエスト(即時復帰) + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * 再生停止のリクエストを発行して即時復帰します。
+ * 本関数呼出し後、ハンドル状態はSTOP_PROCESSING状態に遷移します。
+ * 停止のための処理が終わると、ハンドル状態がWAIT_STOPに遷移します。
+ * WAIT_STOP状態になったら、criMvPly_IncrementState関数でSTOP状態に遷移させて、 + * アプリケーションの停止処理を行ってください。 + */ +/* + * \ingroup MODULE_STATE + * \brief Non-blocking request to stop playback + * \param mvply A currently playing CriMvPly handle + * + * This function records a request to terminate playback. Termination of + * playback is not synchronous to this function; this function sets the current + * state of the CriMvPly handle to CRIMVPLY_STATUS_STOP_PROCESSING. After + * movie processing is halted, the state of the handle transitions to + * CRIMWPLY_STATUS_WAIT_STOP. + * + * This function is useful for prematurely terminating a movie, e.g. "press + * X to skip this movie". + * + * Video frames will keep being delivered until you detect a CRIMVPLY_STATUS_WAIT_STOP + * state in the CriMvPly handle, and then call criMvPly_IncrementState to transition + * back to the CRIMVPLY_STATUS_STOP state. + * + * \note Pausing is not accomplished through this function. The system clock, including + * whether or not to pause or advance frames, is controlled entirely through user + * code. So the effect of "pausing" a CriMvPly handle can be accomplished by simply + * not updating your system clock as long as your pause is in effect. + * + * \sa CriMvPly, CriMvPlyStatus + */ +void CRIAPI criMvPly_Stop(CriMvPly mvply); + +/* サーバ処理(ハンドル指定) */ +/* + * \brief サーバ処理(ハンドル指定) + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * CRI Movie ハンドルを指定してサーバ処理を実行します。
+ * 各WAIT_**** 状態への状態遷移はサーバ関数内で実行されます。 + */ +/* + * \ingroup MODULE_VIDEO + * \brief Execute heartbeat functions for a handle + * \param mvply A valid CriMvPly handle + * + * This function executes heartbeat functions for the specified CriMvPly handle only, + * including handoff and parsing of input buffers and audio decoding. Additionally, + * it checks for buffer situations in which the CriMvPly handle should transition to + * one of the four WAIT states of CriMvPlyStatus, and it makes these transitions if + * necessary. + * + * However, video decoding does NOT occur in criMvPly_Execute(). + * + * Expect that criMvPly_Execute() will take a relatively low CPU load. Typically, + * this function should be called on every vertical blank. However, it may be called + * more frequently in a CriMvPly wait state, in conjunction with criMvPly_IncrementState(), + * in order to "force" a transition into the next state without waiting for + * another vertical blank. This type of transition is not generically + * necessary. + * + * \sa CriMvPly, CriMvPlyStatus, criMvPly_ExecuteAll() + */ +void CRIAPI criMvPly_Execute(CriMvPly mvply); + +/* ファイル読み込みバッファの空きチャンク取得 */ +/* + * \brief ファイル読み込みバッファの空きチャンク取得 + * \param mvply : CRI Movie ハンドル + * \param ck : チャンク + * \return なし + * \par 説明: + * ファイル読み込みバッファの空き領域を取得します。
+ * 取得した空き領域(チャンクと呼びます)は、データ書き込みを通知するさいに + * そのまま使用しますので、アプリケーションで記憶してください。
+ * 1度に取得できるチャンクは1つのみです。
+ * チャンクが取得できたか否かは、チャンクのサイズで判定できます。
+ * データの書き込みが終わったら、criMvPly_PutInputChunk関数で書き込みサイズを通知してください。
+ */ +/* + * \ingroup MODULE_SUPPLY + * \brief Get a free chunk from file reading buffer + * \param mvply A valid CriMvPly handle + * \param ck A CriChunk structure to be filled with data by this function + * + * This function selects an empty internal buffer for your data source to read its data into. + * An area of this type is referred to as a "chunk." + * After calling this function, the ck->data and ck->size + * fields will provide a valid pointer and size, respectively, that your data + * source should copy its data into. + * If no buffers can internally be allocated, this function will return 0 as the + * ck->size field. If this occurs, your program should choke input until a free + * buffer can be allocated. + * Typical data sources are native file reading, sequential memory access, or + * playback from a network source. + * The ck->size field is dynamically calculated when criMvPly_AllocateWorkBuffer() + * is called; it is calculated based on expected data rate and video resolutions + * embedded in the stream file. + * + * After you receive a valid chunk from criMvPly_GetInputChunk(), + * you can fill the provided chunk up to the ck->size limit. After you + * fill the chunk with valid data, call the criMvPly_PutInputChunk() function + * to queue the data for processing. The functions criMvPly_GetInputChunk() and + * criMvPly_PutInputChunk() should be called in equal pairs; calling these + * functions out of order will produce odd results. No dynamic chunk reordering + * is permitted; serial calls with out-of-order chunks will be + * flagged at run-time as an error. + * + * This function will only return a valid chunk if the CriMvPly handle is in + * one of two playback states: CRIMVPLY_STATUS_PLAY or CRIMVPLY_STATUS_DECHDR. + * You can verify the current playback state with criMvPly_GetStatus(). + * + * \sa criMvPly_GetStatus(), criMvPly_PutInputChunk(), criMvPly_AllocateWorkBuffer(), + * CriChunk, CriMvPlyStatus + */ +void CRIAPI criMvPly_GetInputChunk(CriMvPly mvply, CriChunk *ck); + +/* ファイル読み込みバッファへのデータ書き込み通知 */ +/* + * \brief ファイル読み込みバッファへのデータ書き込み通知 + * \param mvply : CRI Movie ハンドル + * \param ck : + * \param inputsize : + * \return なし + * \par 説明: + * criMvPly_GetInputChunk関数で取得した空き領域(チャンクと呼びます)に + * データを書き込み終わったら、引数inputsizeにデータサイズを入れて本関数を呼び出してください。
+ * その際、チャンクは criMvPly_GetInputChunk関数で取得したものと同じチャンクを必ず指定してください。 + */ +/* + * \ingroup MODULE_SUPPLY + * \brief Put a data chunk into file read buffer + * \param mvply A valid CriMvPly handle + * \param ck A CriChunk structure containing source data + * \param inputsize The number of bytes actually supplied + * + * This function informs the CriMvPly handle that the CriChunk structure + * now contains valid data from the data source. Typically, you would call + * this function after your asynchronous file read reports that the buffer is + * full of data. + * + * The inputsize field should contain the number of bytes actually provided. + * This value can be less than or equal to ck->size. In an end-of-file condition, + * be sure to supply the actual number of bytes remaining in the file, and not + * merely the size of the input buffer, to criMvPly_PutInputChunk(). + * Do not modify the contents of the CriChunk after calling this function; + * instead, call criMvPly_GetInputChunk() to get a new chunk for further input. + * + * This function invalidates the CriChunk provided if the function is called + * while the CriMvPly handle is in the CRIMVPLY_STATUS_STOP, the + * CRIMVPLY_STATUS_WAIT_PREP, or the CRIMVPLY_STATUS_STOP_PROCESSING state. + * You can verify the current playback state with criMvPly_GetStatus(). + * + * After you receive a valid chunk from criMvPly_GetInputChunk(), + * you can fill the provided chunk up to the ck->size limit. After you call + * fill the chunk with valid data, call the criMvPly_PutInputChunk() function + * to queue the data for processing. The function criMvPly_GetInputChunk() and + * criMvPly_PutInputChunk() should be called in equal pairs; calling these + * functions out of order will produce odd results. No dynamic chunk reordering + * is permitted; serial calls with out-of-order chunks will be + * flagged at run-time as an error. + * + * After putting the final chunk of data in the stream, call + * criMvPly_TerminateSupply() to indicate that an end-of-file condition exists. + * + * \sa criMvPly_GetStatus(), criMvPly_GetInputChunk(), criMvPly_AllocateWorkBuffer(), + * criMvPly_TerminateSupply(), CriChunk, CriMvPlyStatus + */ +void CRIAPI criMvPly_PutInputChunk(CriMvPly mvply, CriChunk *ck, CriUint32 inputsize); + +/* ファイル読み込み終了の通知 */ +/* + * \brief ファイル読み込み終了の通知 + * \param mvply : CRI Movie ハンドル + * \return なし + * \par 説明: + * 再生したい全てのデータを読み込んで、 criMvPly_PutInputChunk関数で通知し終わったら、 + * 本関数でファイル読み込み終了の通知を必ず行ってください。
+ * 終了を通知された時点で読み込みバッファに書き込まれた全てのデータをデコードし終わると、 + * ハンドル状態はWAIT_PLAYENDに遷移します。
+ * 本関数を呼び出さない限り、WAIT_PLAYEND状態になることはありません。 + */ +/* + * \ingroup MODULE_SUPPLY + * \brief Notify end of reading data + * \param mvply A valid CriMvPly structure + * + * After you put all the source data into the CriMvPly handle with + * criMvPly_PutInputChunk(), indicate the end of the movie file by calling + * criMvPly_TerminateSupply(). After calling this function, the CriMvPly + * handle's status is changed by the library to CRIMVPLY_STATUS_WAIT_PLAYEND + * and the library completes processing of whatever frames it has internally + * buffered. + * + * If you do not call this function, the CriMvPly handle will never transition + * to the CRIMVPLY_STATUS_WAIT_PLAYEND state, making teardown impossible. + * + * \sa criMvPly_PutInputChunk(), CriMvPly, CriMvPlyStatus + */ +void CRIAPI criMvPly_TerminateSupply(CriMvPly mvply); + +#if 0//defined(XPT_TGT_EE) +/* RGB32フォーマットのビデオフレームの取得 */ +/* + * \if ps2 + * \brief RGB32フォーマットのビデオフレームの取得 + * \param mvply : CRI Movie ハンドル + * \param imagebuf : ビデオフレームバッファ + * \param bufsize : バッファサイズ + * \param frameinfo : フレーム情報 + * \return 取得できた場合はTRUE, できなかった場合はFALSE + * \par 説明: + * 引数で指定したバッファに、PS2のマクロブロック並びRGBA32フォーマットでフレームを取得します。
+ * 引数CriMvFrameInfo構造体には、取得したフレームについての情報が格納されます。
+ * フレームが取得できるのは、ハンドル状態がWAIT_PLAYING/PLAYINGの時のみです。
+ * それ以外の状態で呼び出す、または入力データ不足の場合には、本関数はフレームの取得に失敗し、即座に復帰します。
+ * フレームが取得できなかった場合は、関数値でFALSEが返ります。
+ * 実際のビデオデコード処理も本関数内で動くため、フレーム取得できる場合には、処理の重い関数となります。 + * \endif + */ +/* + * \if ps2 + * \ingroup MODULE_VIDEO + * \brief Get a video frame in PS2 macroblock RGB32 format + * \param mvply A valid CriMvPly handle + * \param imagebuf a pointer to the video buffer in memory to receive the frame + * \param bufsize video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * The format of this buffer is specific to the PS2. This function will only return + * a valid frame if the CriMvPly handle is in the CRIMVPLY_STATUS_WAIT_PLAYING or the + * CRIMVPLY_STATUS_PLAYING state. + * + * This function is an EE-intensive activity, and the amount of time required + * is variable, depending on the complexity and size of the video frame being decoded. + * Therefore the preferred method of calling this function is in a low priority thread, + * separate from your I/O, buffer management, and criMvPly_Execute() routines. + * + * If this function returns true, the preferred display time of the video frame is calculated + * as: + * + * \code + * frameinfo.time / frameinfo.tunit + * \endcode + * + * Humans notice audio stuttering much more readily than a dropped video frame during + * a video decode process. If the frame reported by criMvPly_GetFrameRGBA32_PS2() + * arrives after your system clock says the frame should be displayed, you should + * simply drop the frame without bothering to DMA it to video memory. + * + * Here is an example showing how to drop frames in this case: + * + * \dontinclude crimvt01_simple_playback_ps2.c + * \skip Get video frame + * \until *tutor_update_video_frame_on_display_time* + * + * It is not preferred, but it is possible, to call this function in a single-threaded + * playback model. In this case, it is important to allocate more heap space + * and service the CriMvPly handle with criMvPly_Execute() or criMvPly_ExecuteAll() + * frequently, as well as criMvPly_GetWave16() frequently. This helps to cover + * for the case where other I/O needs to occur when a frame is currently being decoded by + * criMvPly_GetFrameRGBA32_PS2(). + * + * \image html crimvply_getframergba32_ps2.png The DMA reordering step on PS2 + * + * In order to get acceptable performance on the PS2, a macroblock reordering step + * must take place during the DMA transfer from EE RAM to video RAM. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameRGBA32_PS2(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 bufsize, CriMvFrameInfo *frameinfo); + +CriBool CRIAPI criMvPly_DecodeFrameRGBA32_PS2(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +#endif + +#if defined(XPT_TGT_PC) || defined(XPT_TGT_XBOX360) || defined(XPT_TGT_WII) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) +/* + * \if pc + * \ingroup MODULE_VIDEO + * \brief Get a video frame in YUV422 format + * \param mvply A valid CriMvPly handle + * \param imagebuf A pointer to the video buffer in memory to receive the frame + * \param pitch Number of bytes in one row of the video buffer + * \param bufsize Video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * + * This function is a CPU-intensive activity, and the amount of time required + * is variable, depending on the complexity and size of the video frame being decoded. + * Therefore the preferred method of calling this function is in a low priority thread, + * separate from your I/O, buffer management, and criMvPly_Execute() routines. + * + * If this function returns true, the preferred display time of the video frame is calculated + * as: + * + * \code + * frameinfo.time / frameinfo.tunit + * \endcode + * + * It is not preferred, but it is possible, to call this function in a single-threaded + * playback model. In this case, it is important to allocate more heap space + * and service the CriMvPly handle with criMvPly_Execute() or criMvPly_ExecuteAll() + * frequently, as well as criMvPly_GetWave16() frequently. + * + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameYUV422(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +#endif + +/* 16bit WAVEフォーマットのオーディオデータ取得 */ +/* + * \brief 16bit WAVEフォーマットのオーディオデータ取得 + * \param mvply : CRI Movie ハンドル + * \param nch : チャネル数 + * \param waveptr : オーディオデータバッファ + * \param wavesmpl : 要求サンプル数(<バッファサイズ) + * \param waveinfo : 16bit Waveform 情報 + * \return 取得できたサンプル数 + * \par 説明: + * 16bitのWAVEフォーマットでオーディオデータを取得します。引数waveptrには、nch分のバッファポインタを格納した + * 配列を指定してください。
+ * 引数CriMvWaveInfo構造体には、取得したオーディオデータについての情報が格納されます。
+ * 入力データ不足などで要求されたサンプル数のデコードができない場合もあります。
+ * (未実装機能) 本関数の処理が重くなってでも、なるべく要求された多くのオーディオデータを取得するモード。 + */ +/* + * \ingroup MODULE_AUDIO + * \brief Get 16bit wave audio data + * \param mvply A currently playing CriMvPly handle + * \param nch The number of audio channels to get in this call + * \param waveptr An array of audio data buffers to copy audio data into + * \param wavesmpl The number of requested wave data samples (must be less than buffer size) + * \param waveinfo A structure filled by this function with info about this wave + * \return The number of wave data samples actually copied into the buffer + * + * This function copies currently decoding audio data into your output buffer + * for you to send to the audio output. The output format is a sixteen-bit PCM + * format. The data provided is "current", e.g. you should try to minimize latency. + * while delivering the audio data to the output device. + * + * This function will return an empty audio buffer if the input to the CriMvPly + * handle is starving for data, or if criMvPly_Execute() or criMvPly_ExecuteAll() + * has not been called recently. + * + * Note that this function actually copies data. However, the expected bandwidth + * for moving audio data in memory is minimal -- about 176400 bytes per second for + * a stereo stream, which is typically a fraction of 1% of the bandwidth available + * on modern game systems. + * + * For debugging tips on stuttering, see \ref crim_section_stuttering . + */ +CriUint32 CRIAPI criMvPly_GetWave16(CriMvPly mvply, CriUint32 nch, CriSint16 *waveptr[], + CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); +CriUint32 CRIAPI criMvPly_GetWave32(CriMvPly mvply, CriUint32 nch, CriFloat32 *waveptr[], + CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); + + +#if defined(XPT_TGT_EE) +/* スクラッチパッドRAM使用設定 */ +/* スクラッチパッドRAMの使用設定(ハンドル作成前に呼び出すこと) */ +/* + * \brief スクラッチパッドRAM使用設定 + * \param sw : + * \return なし + * \par 説明: + * スクラッチパッドRAMの使用設定を行います。
+ * デフォルトはOFFです。 + */ +/* + * \if ps2 + * \ingroup MODULE_INIT + * \brief Enable or disable PS2 scratch pad (SPRAM) usage + * \param sw : ON to enable scratch pad use, OFF to disable + * + * This function determines whether the video decode step uses the PS2 + * SPRAM memory area for its work. The performance of this library is + * increased by around 30% when using SPRAM; however, this use might + * conflict with graphics engines that depend on exclusive access to SPRAM. + * However, on the PS2, the video decode step occurs synchronously to the + * criMvPly_GetFrameRGBA32_PS2() function, so you can take appropriate external + * locking measures to intelligently synchronize SPRAM utilization. + * The value set by criMvPly_SetUseScratchPadRAM_PS2() is internally checked + * exactly once, during the criMvPly_Create() step; calling this function + * after criMvPly_Create() has no effect. The default setting for this + * function is OFF. + * \endif + */ +void CRIAPI criMvPly_SetUseScratchPadRAM_PS2(CriBool sw); +#endif + + +/* メモリからの再生開始 */ +/* + * \brief メモリからの再生開始 + * \param mvply : CRI Movie ハンドル + * \param memptr : メモリ上のムービデータの先頭アドレス + * \param memsize : メモリ上のムービデータのサイズ + * \return なし + * \par 説明: + * メモリからのムービ再生を開始します。
+ * 本関数の呼び出し前に、あらかじめムービデータの全てをメモリ上に読み込んでおいてください。 + */ +/* + * \ingroup MODULE_STATE + * \brief Start playback from movie file on memory + * \param mvply A currently playing CriMvPly handle + * \param memptr A address of movie file + * \param memsize The size of movie file + * + * Start playback from memory.
+ * Please read movie file to memory before playback. + */ +void CRIAPI criMvPly_StartMemory(CriMvPly mvply, CriUint8* memptr, CriUint32 memsize); + + +/* + * YUV個別バッファへのフレーム取得 + */ +/* + * \if xbox360 + * \ingroup MODULE_VIDEO + * \brief Get a video frame to Y,U,V independently texture buffers + * \param mvply A valid CriMvPly handle + * \param yuvbuffers Information about Y,U,V independently texture buffers + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the Y,U,V texture buffers. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameYUVBuffers(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, CriMvFrameInfo *frameinfo); + + +/* + * ビデオのデコード + */ +/* + * \ingroup MODULE_VIDEO + * \param mvply The movie player handle + * \return returns the number of decoded frames + * + */ +CriUint32 CRIAPI criMvPly_DecodeVideo(CriMvPly mvply); + +/* + * ヘッダのデコード + */ +/* + * + * \ingroup MODULE_VIDEO + * \param mvply The movie player handle + * + */ +void CRIAPI criMvPly_DecodeHeader(CriMvPly mvply); + +/* + * デコードスキップ指示 + * \par 説明: + * この関数を実行した回数だけ、その後のデコード時に自動的に1枚Bピクチャをスキップする。
+ * スキップ指示を出した次のフレームからは、実際のスキップが実行されていなくても + * 表示時刻はスキップしたものとして補正される。 + */ +/* + * \ingroup MODULE_VIDEO + * \param mvply The movie player handle + * \return returns the number of decoded frames + * + * After calling SkipFrame function, Decoding function skip B-picture. + * To avoid that application judge continuous wrong skip, After calling + * SkipFrame function, next frame time will be adjusted. + */ +void CRIAPI criMvPly_SkipFrame(CriMvPly mvply); + + +#if 0 +/* + * YUVA8フォーマットのフレーム取得 + */ +/* + * \if ps3 + * \ingroup MODULE_VIDEO + * \brief Get a video frame in YUVA8 format. + * \param mvply A valid CriMvPly handle + * \param imagebuf A pointer to the video buffer in memory to receive the frame + * \param pitch Number of bytes in one row of the video buffer + * \param bufsize Video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameYUVA8_PS3(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +#endif + +/* + * ARGB8888フォーマットでフレーム取得 + */ +/* + * \if ps3 + * \ingroup MODULE_VIDEO + * \brief Get a video frame in ARGB8888 format. + * \param mvply A valid CriMvPly handle + * \param imagebuf A pointer to the video buffer in memory to receive the frame + * \param pitch Number of bytes in one row of the video buffer + * \param bufsize Video buffer size in bytes + * \param frameinfo Information about the decoded frame + * \return returns true if a frame has been copied into the buffer, false otherwise + * + * This function finds and decodes the current frame, if any, to the imagebuf buffer. + * This function will only return a valid frame if the CriMvPly handle is in the + * CRIMVPLY_STATUS_WAIT_PLAYING or the CRIMVPLY_STATUS_PLAYING state. + * \endif + */ +CriBool CRIAPI criMvPly_GetFrameARGB8888(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +void CRIAPI criMvPly_InitializeFrameARGB8888(void); + + +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) +/* + * RGB565フォーマットでフレーム取得 + */ +/* + * \ingroup MODULE_VIDEO + * \brief Get a video frame in RGB565 format + */ +CriBool CRIAPI criMvPly_GetFrameRGB565(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriUint32 bufsize, CriMvFrameInfo *frameinfo); +void CRIAPI criMvPly_InitializeFrameRGB565(void); +#endif + +/* + * 次のフレームの情報だけ取得する + */ +/* + * \ingroup MODULE_VIDEO + * \brief Get a information of next video frame (without actual video frame). + */ +CriUint8* CRIAPI criMvPly_GetNextFrameInfo(CriMvPly mvply, CriMvFrameInfo *frameinfo); + +/* + * 次のフレームを捨てる + */ +CriBool CRIAPI criMvPly_DiscardNextFrame(CriMvPly mvply, CriMvFrameInfo *frameinfo); + +/* + * 再生準備完了状態(PREPからWAIT_PLAYING)になるまでに貯金するフレーム数の指定 + * この関数を呼び出さなければ、貯金フレーム数 = フレームプール数 + */ +void CRIAPI criMvPly_SetNumberOfFramesForPrep(CriMvPly mvply, CriSint32 nframes); + +/* + * For Debug use. + */ +void CRIAPI criMvPly_SetSeekPosition(CriMvPly mvply, CriSint32 seek_frame_id, CriSint32 video_gop_top_id); +void CRIAPI criMvPly_SetSeekAlphaPosition(CriMvPly mvply, CriSint32 alpha_gop_top_id); +void CRIAPI criMvPly_CalcSeekPosition(CriMvPly mvply, void *seektbl_ptr, CriUint32 seektbl_size, Sint32 frame_id, Uint64 *offset, Sint32 *gop_top_id); + +/* for specific use */ +/* ボディアドレスの設定 */ +void CRIAPI criMvPly_SetBodyData(CriMvPly mvply, const CriUint64Adr body_ptr, CriSint64 body_size); + +/* 入力SJおよびバッファサイズの取得(バッファサイズ、リロードサイズはNULL指定で省略) */ +CriSj CRIAPI criMvPly_GetInputSj(CriMvPly mvply, CriUint32 *buffer_size, CriUint32 *reload_threshold); + +/* 名前&タイプ指定によるイベントポイント情報の取得 */ +//Bool criMvPly_SearchEventPointByName(CriMvPly mvply, Char8 *cue_name, Sint32 type, CriMvEventPoint *eventinfo); +/* イベントポイント情報からフレームIDへの変換 */ +//Sint32 criMvPly_CalcFrameIdFromCuePoint(CriMvPly mvply, CriMvEventPoint *eventinfo); + +CriBool CRIAPI criMvPly_AttachSubAudio(CriMvPly mvply, CriHeap heap, CriUint32 track); +CriUint32 CRIAPI criMvPly_GetSubAudioWave16(CriMvPly mvply, CriUint32 nch, CriSint16 *waveptr[], CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); +CriUint32 CRIAPI criMvPly_GetSubAudioWave32(CriMvPly mvply, CriUint32 nch, CriFloat32 *waveptr[], CriUint32 wavesmpl, CriMvWaveInfo *waveinfo); +void CRIAPI criMvPly_DetachSubAudio(CriMvPly mvply); + +void CRIAPI criMvPly_GetSubtitle(CriMvPly mvply, CriUint8 *bufptr, CriUint32 bufsize, CriMvSubtitleInfo *info); +void CRIAPI criMvPly_GetNextSubtitleInfo(CriMvPly mvply, CriMvSubtitleInfo *info); + +/* 入力バッファのデータ量を見る[byte] */ +CriUint32 CRIAPI criMvPly_PeekInputBufferData(CriMvPly mvply); +/* メモリ上のムービを入力SJに追加する */ +void CRIAPI criMvPly_AddInputMemory(CriMvPly mvply, CriUint8* memptr, CriUint32 memsize); + + +/* 取得できるオーディオデータのサンプル数を調べる */ +CriUint32 CRIAPI criMvPly_GetDataSizeMainAudio(CriMvPly mvply, CriUint32 nch); +/* 取得できるオーディオデータのサンプル数を調べる */ +CriUint32 CRIAPI criMvPly_GetDataSizeSubAudio(CriMvPly mvply, CriUint32 nch); + +/* メインのオーディオの再生が終了しているかどうかを調べる */ +CriBool CRIAPI criMvPly_IsEndMainAudioPlayback(CriMvPly mvply); +/* サブのオーディオの再生が終了しているかどうかを調べる */ +CriBool CRIAPI criMvPly_IsEndSubAudioPlayback(CriMvPly mvply); + +/* メインオーディオが活動中かどうかを調べる (デコード中かつ出力バッファがある状態) */ +CriBool CRIAPI criMvPly_IsActiveMainAudioPlayback(CriMvPly mvply); + +/* ワーク確保前に設定変更すること */ +void CRIAPI criMvPly_SetPcmFormat(CriMvPly mvply, CriMvPcmFormat pcmfmt); + +#if defined(XPT_TGT_PC) +/* [PC] マルチプロセッサの指定 */ +//void CRIAPI criMvPly_SetProcessorParameters_PC(CriMvPly mvply, Sint32 thread_num, Uint32 *affinity_masks, Sint32 *priorities); +#endif + +#if defined(XPT_TGT_XBOX360) +/* [Xbox360] マルチプロセッサの指定 */ +void CRIAPI criMvPly_SetProcessorParameters_XBOX360(CriMvPly mvply, Sint32 thread_num, CriUint32 processor_mask, CriSint32 *priorities); +#endif + +#if defined(XPT_TGT_PS3PPU) +/* [PS3] SPURSの指定 */ +void CRIAPI criMvPly_SetupSpursParameters_PS3(const CriMvProcessorParameters_PS3 *processor_param); + /* [PS3] SPUスレッドによるマルチプロセッサの指定 */ +void CRIAPI criMvPly_SetupSpuThreadParameters_PS3(const CriMvSpuThreadParameters_PS3 *spu_thread_param); +void CRIAPI criMvPly_SetGraphicEnv(CriMvGraphicEnv env); +CriMvGraphicEnv CRIAPI criMvPly_GetGraphicEnv(void); +#endif + +/* フレームプール情報の取得 */ +void CRIAPI criMvPly_GetFramePoolInfo(CriMvPly mvply, CriSint32 *num_input, CriUint32* num_data, CriUint32* num_ref, CriUint32* num_hold, CriUint32* num_free); + +/* 再生中でも字幕チャネルを切り替える */ +void CRIAPI criMvPly_SetSubtitleChannel(CriMvPly mvply, CriSint32 chno); + +/* ポインタだけ取得してフレームプール内のバッファをロックする */ +CriBool CRIAPI criMvPly_LockFrameBuffer(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, CriMvFrameInfo *frameinfo); +/* ロックしていたフレームプールを解放する */ +CriBool CRIAPI criMvPly_UnlockFrameBuffer(CriMvPly mvply, CriMvFrameInfo *frameinfo); + +/* + * For Sofdec2 + */ +CriMvPly CRIAPI criMvPly_CreateWithWork(void *work, CriSint32 size, CriMvHandleConfig *config); +CriSint32 CRIAPI criMvPly_CalcHandleWorkSize(CriMvHandleConfig *config); +CriSint32 CRIAPI criMvPly_CalcPlaybackWorkSize(CriMvPly mvply, CriMvStreamingParameters *stmprm); +CriBool CRIAPI criMvPly_AllocateWorkBufferWithWork(CriMvPly mvply, void *work ,Sint32 work_size, CriMvStreamingParameters *stmprm); +void CRIAPI criMvPly_SetMetaDataWorkAllocator(CriMvPly mvply, CriMvMetaDataWorkMallocFunc allocfunc, CriMvMetaDataWorkFreeFunc freefunc, void *usrobj, CriMvMetaFlag meta_flag); +CriSint32 criMvPly_CalcSubAudioWorkSize(CriMvPly mvply, const CriMvAudioParameters *aprm); +CriBool criMvPly_CopyFrameYUVBuffers(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, + const CriMvFrameInfo *frameinfo,const CriMvAlphaFrameInfo *alpha_frameinfo); +CriBool criMvPly_CopyFrameARGB8888Buffer(CriMvPly mvply, CriUint8 *dst_buf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *src_bufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf); +#if defined(XPT_TGT_IPHONE) || defined(XPT_TGT_WINMO) || defined(XPT_TGT_ANDROID) || defined(XPT_TGT_CQSH2A) || defined(XPT_TGT_ACRODEA) || defined(XPT_TGT_NACL) || defined(XPT_TGT_SH7269) || defined(XPT_TGT_TRGP6K) || defined(XPT_TGT_TRGP6K) +CriBool criMvPly_CopyFrameRGB565Buffer(CriMvPly mvply, CriUint8 *dst_buf, CriUint32 dst_pitch, CriUint32 dst_bufsize, + const CriMvYuvBuffers *src_bufs, const CriMvFrameInfo *src_vinf, const CriMvAlphaFrameInfo *src_ainf); +#endif +CriBool criMvPly_LockAlphaFrameBuffer(CriMvPly mvply, CriMvYuvBuffers *yuvbuffers, CriMvAlphaFrameInfo *alpha_frameinfo); +CriBool criMvPly_UnlockAlphaFrameBuffer(CriMvPly mvply, CriMvAlphaFrameInfo *alpha_frameinfo); +CriSint32 criMvPly_GetNumPictureData(CriMvPly mvply); +const CriMvPlyHeaderInfo* criMvPly_GetCurrentStreamInfo(CriMvPly mvply); +/* for debug */ +CriBool CRIAPI criMvPly_GetAlphaFrame(CriMvPly mvply, CriUint8 *imagebuf, CriUint32 pitch, CriMvAlphaFrameInfo *alpha_frameinfo); + +/* OUTER_FRAMEPOOL_WORK */ +/* フレームプール用ワーク計算。ハンドルはNULL指定OK。 */ +CriSint32 criMvPly_CalcFramepoolWorkSize(CriMvPly mvply, const CriMvStreamingParameters *stmprm); +/* フレームプール用ワーク設定 */ +void criMvPly_SetFramepoolWork(CriMvPly mvply, void *work, CriSint32 work_size); +/* フレームプール用ワークアロケータ設定 */ +void criMvPly_SetFramepoolWorkAllocator(CriMvPly mvply, CriMvFramepoolWorkMallocFunc allocfunc, CriMvFramepoolWorkFreeFunc freefunc, void *usrobj); + +/* シークブロック情報の取得 */ +/* <入力> + * - seektbl_ptr : UTFアドレス + * - seektbl_size : UTFサイズ + * - num_seekblock : 出力配列の要素数 + * <出力> + * - blockinfo : シークブロック情報配列へのポインタ(num_seekblock分の領域を確保して渡すこと) + */ +void criMvPly_GetSeekBlockInfo(CriMvPly mvply, void *seektbl_ptr, CriUint32 seektbl_size, CriSint32 num_seekblock, CriMvSeekBlockInfo *blockinfo); + +/* フレームレートの強制指定 */ +void criMvPly_SetVideoFramerate(CriMvPly mvply, CriUint32 framerate_n, CriUint32 framerate_d); + +/* 同期有無の設定 */ +void criMvPly_SetSyncFlag(CriMvPly mvply, CriBool sync_flag); + +/* 再生可能かの問い合わせ */ +CriBool criMvPly_IsPlayable(CriMvPly mvply, const CriMvStreamingParameters *stmprm); + + + +#ifdef __cplusplus +} +#endif + +#endif /* CRI_MOVIE_CORE_H_INCLUDED */ diff --git a/3rdParty/cri/pc/include/cri_movie_pc.h b/3rdParty/cri/pc/include/cri_movie_pc.h new file mode 100644 index 00000000..4b2443d0 --- /dev/null +++ b/3rdParty/cri/pc/include/cri_movie_pc.h @@ -0,0 +1,96 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2013 CRI Middleware Co., Ltd. + * + * Library : CRI Movie + * Module : Library User's Header + * File : cri_movie_pc.h + * Date : 2013-11-26 + * + ****************************************************************************/ +/*! + * \file cri_movie_pc.h + */ +#ifndef CRI_MOVIE_PC_H_INCLUDED /* Re-definition prevention */ +#define CRI_MOVIE_PC_H_INCLUDED + +/*************************************************************************** + * Include file + ***************************************************************************/ +#include + +#include +#include + +/*************************************************************************** + * Variable Declaration + ***************************************************************************/ +namespace CriMv { + extern CriError ErrorContainer; +} + +/*************************************************************************** + * Prototype Functions + ***************************************************************************/ +namespace CriMv { + /*EN + * \ingroup MODULE_OPTION + * \brief Set processor parameters for decoding on PC (Library Global) + * + * \param num_threads Number of additional threads for load distribution in decoding (Maximum 7 threads) + * \param affinity_masks Pointer to an array of thread affinity masks for each thread specified with num_threads. + * \param priorities Pointer to an array of thread priority for each thread specified with num_threads. + * \param err Optional error code + * + * This function sets the processor parameters for decoding as default setting of library global. + * Use it when you want to change processors or thread priority for decoding load distribution. + * + * If this function is called, it must be called before library initialization. + * + * On initialization, CRI Movie prepares 7 worker threads for distributed decoding.
+ * + * \a num_threads specifies how many worker threads CRI Movie should use.
+ * \a affinity_mask is an array of affinity masks for the worker threads. This array must have + * \a num_threads many elements. The format of \a affinity_mask is same as for the value passed to the + * Win32 SetThreadAffinityMask() API function.
+ * \a priorities is an array of thread priority for the worker threads. This array must have + * \a num_threads many elements. The format of \a priorities is same as for the value passed to the + * Win32 SetThreadPriority() API function.
+ * + * If this function is not called, 7 distributed decoding threads will run in parallel by default. + * Also, processor assignment of the decoding threads is handled by the operating system, and their + * priority will be normal. + */ + /*JP + * \ingroup MODULE_OPTION + * \brief PCでデコード処理に使う追加プロセッサ設定(ライブラリ全体) + * \param num_threads 負荷分散デコード用に使用する追加スレッドの数 (最大7つ) + * \param affinity_masks スレッドアフィニティマスクの配列へのポインタ。num_threadsで指定したスレッドごとのマスク値。 + * \param priorities 追加スレッドの優先度配列へのポインタ。 + * \param err エラー情報(省略可) + * + * デコード処理を分散して処理するためのプロセッサをライブラリ全体に指定します。 + * デコード処理に行うプロセッサやスレッド優先度を変更したい場合に使用してください。 + * 本関数はライブラリ初期化前に呼び出す必要があります。 + * + * CRI Movieは初期化の際に7つの分散デコード用のワーカースレッドを用意します。 + * num_threads引数で、そのうちのいくつのスレッドを実際に使用するかを指定できます。 + * アプリケーションから明示的にプロセッサ割り当てを行いたい場合、個々のスレッドに対して + * アフィニティマスクとスレッド優先度を設定してください。 + * アフィニティマスクの値は、Win32 APIのSetThreadAffinityMaskの引数と同じ書式です。 + * スレッド優先度は、Win32 APIのSetThreadPriorityの引数と同じ書式です。 + * + * この関数を呼ばなかった場合、7つのスレッドで並列デコードを行います。 + * デコードスレッドのプロセッサは割り当ては全てOS任せで、優先度はスレッド標準になります。 + */ + void SetUsableProcessors_PC( + CriSint32 num_threads, + const DWORD_PTR *affinity_masks, + const int *priorities, + CriError &err = CriMv::ErrorContainer); +} + + +#endif /* CRI_MOVIE_PC_H_INCLUDED */ diff --git a/3rdParty/cri/pc/include/cri_sj.h b/3rdParty/cri/pc/include/cri_sj.h new file mode 100644 index 00000000..045a121c --- /dev/null +++ b/3rdParty/cri/pc/include/cri_sj.h @@ -0,0 +1,189 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 2006-2010 CRI Middleware Co., Ltd. + * + ****************************************************************************/ + +#ifndef _CRI_SJ_H_INCLUDED +#define _CRI_SJ_H_INCLUDED +/**************************************************************************** + * * + * CRI Stream Joint "CriSj" Library * + * * + * 2005-06-21 written by M.Oshimi * + * * + ****************************************************************************/ + +/**************************************************************************** + * Include file * + ****************************************************************************/ +#include "cri_xpt.h" +#include "cri_heap.h" + +/**************************************************************************** + * MACRO CONSTANT * + ****************************************************************************/ + +/* Version number of CriSj */ +#define CRISJ_NAME_STRINGS "CRI Stream Joint" +#define CRISJ_VERSION_STRINGS "1.01.00" + +#define CRISJUNI_MAX_LINE (4) +#define CRICHUNK_MAX_SIZE (0xffffffff) + +/*********************************************************************** + * Process MACRO + ***********************************************************************/ + +/**************************************************************************** + * Data type declaration * + ****************************************************************************/ + +/* ストリームライン */ +typedef enum { + CRISJ_LINE_FREE = (0), + CRISJ_LINE_DATA = (1), + CRISJ_LINE_HOLD = (2), + CRISJ_LINE_EXTRA = (3), + /* enum be 4bytes */ + CRISJ_LINE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriSjLine; + +/* チャンク */ +#ifndef TYPEDEF_CRICHUNK +#define TYPEDEF_CRICHUNK +typedef struct { + CriUint8 *data; /* データ */ + CriUint32 size; /* バイト数 */ +} CriChunk; +#endif + +/* CriSjハンドル */ +/* CriSj handle */ +typedef struct { + struct _crisj_function_table *vtbl; + const CriChar8 *name; +} CriSjObj, *CriSj; + +typedef struct _crisj_function_table { + /* ハンドルの消去 */ + void (*Destroy)(CriSj sj); + /* リセット */ + void (*Reset)(CriSj sj); + /* チャンクの取得 (FIFOの先頭から取得) */ + void (*GetChunk)(CriSj sj, CriSjLine id, CriUint32 nbyte, CriChunk *ck); + /* チャンクを戻す (FIFOの先頭に挿入) */ + void (*UngetChunk)(CriSj sj, CriSjLine id, CriChunk *ck); + /* チャンクを挿入 (FIFOの最後に挿入) */ + void (*PutChunk)(CriSj sj, CriSjLine id, CriChunk *ck); + /* ラインから取得できる総バイト数の取得 */ + CriUint32 (*GetTotalSize)(CriSj sj, CriSjLine id); +} CriSjVirtualFunctionTable; + +typedef enum { + CRISJ_UNIMODE_SEPARATE = (0), + CRISJ_UNIMODE_JOIN = (1), + /* enum be 4bytes */ + CRISJ_UNIMODE_ENUM_BE_SINT32 = 0x7FFFFFFF +} CriSjUniversalMode; + + +typedef struct CriSjRbfConfig { + CriBool use_cs; + CriUint32 buffer_size; + CriUint32 extra_size; + CriUint32 alignment; + const CriChar8 *buffer_name; +} CriSjRbfConfig; + +typedef struct CriSjMemConfig { + CriBool use_cs; + CriUint8 *data; + CriUint32 data_size; +} CriSjMemConfig; + +typedef struct CriSjUniConfig { + CriBool use_cs; + CriSjUniversalMode mode; + CriUint32 num_chunks; +} CriSjUniConfig; + +/**************************************************************************** + * Function Declaration * + ****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* リングバッファ型SJの作成 */ +CriSint32 CRIAPI criSjRbf_CalculateWorkSize(const CriSjRbfConfig* config); +CriSj CRIAPI criSjRbf_Create(const CriSjRbfConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjRbf_CreateByHeap(const CriSjRbfConfig *config, CriHeap heap, CriHeapType heap_type); + +/* 常駐メモリ型SJの作成 */ +CriSint32 CRIAPI criSjMem_CalculateWorkSize(const CriSjMemConfig* config); +CriSj CRIAPI criSjMem_Create(const CriSjMemConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjMem_CreateByHeap(const CriSjMemConfig *config, CriHeap heap, CriHeapType heap_type); + +/* ユニバーサルSJの作成 */ +CriSint32 CRIAPI criSjUni_CalculateWorkSize(const CriSjUniConfig* config); +CriSj CRIAPI criSjUni_Create(const CriSjUniConfig *config, void *work, CriSint32 work_size); +CriSj CRIAPI criSjUni_CreateByHeap(const CriSjUniConfig *config, CriHeap heap, CriHeapType heap_type); +/* チェインプール数の取得 */ +CriSint32 CRIAPI criSjUni_GetNumChainPool(CriSj sj); + +void CRIAPI criSj_Destroy(CriSj sj); +void CRIAPI criSj_Reset(CriSj sj); +void CRIAPI criSj_GetChunk(CriSj sj, CriSjLine line, CriUint32 nbyte, CriChunk *ck); +void CRIAPI criSj_UngetChunk(CriSj sj, CriSjLine line, CriChunk *ck); +void CRIAPI criSj_PutChunk(CriSj sj, CriSjLine line, CriChunk *ck); +CriUint32 CRIAPI criSj_GetTotalSize(CriSj sj, CriSjLine line); +void CRIAPI criSj_SplitChunk(CriChunk *ck, CriUint32 nbyte, CriChunk *ck1, CriChunk *ck2); + +/*** +* New APIs +***/ + +CriUint32 CRIAPI criSj_GetInputFreeSize(CriSj sj); +void CRIAPI criSj_GetInputChunk(CriSj sj, CriChunk *ck); +void CRIAPI criSj_PutInputChunk(CriSj sj, CriChunk *ck, CriUint32 input_size); +CriUint32 CRIAPI criSj_GetOutputDataSize(CriSj sj); +void CRIAPI criSj_GetOutputChunk(CriSj sj, CriChunk *ck); +void CRIAPI criSj_PutOutputChunk(CriSj sj, CriChunk *ck, CriUint32 output_size); + +CriUint32 CRIAPI criSj_PutOutputChunk2(CriSj sj, CriChunk *ck1, CriChunk *ck2, CriUint32 output_size); + + +/*** +* Old Interface (for compatibility) +***/ +typedef struct _CriSjConfig { + CriBool use_cs; + CriHeapType heap_type; +} CriSjConfig; + +CriSj CRIAPI criSj_CreateRingBuffer(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align); +CriSj CRIAPI criSj_CreateNamedRingBuffer(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriChar8 *bname); +CriSj CRIAPI criSj_CreateRingBufferWithConfig(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriSjConfig *config); +CriSj CRIAPI criSj_CreateNamedRingBufferWithConfig(CriHeap heap, CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriChar8 *bname, const CriSjConfig *config); +CriSint32 CRIAPI criSjRbf_GetRequiredMemorySizeWithConfig(CriUint32 bsize, CriUint32 xsize, CriUint32 align, const CriSjConfig *config); + +CriSj CRIAPI criSj_CreateMemory(CriHeap heap, CriUint8 *data, CriUint32 dtsize, CriUint32 align); +CriSj CRIAPI criSj_CreateMemoryWithConfig(CriHeap heap, CriUint8 *data, CriUint32 dtsize, CriUint32 align, const CriSjConfig *config); +CriSint32 CRIAPI criSjMem_GetRequiredMemorySizeWithConfig(CriUint32 align, const CriSjConfig *config); + +CriSj CRIAPI criSj_CreateUniversal(CriHeap heap, CriSjUniversalMode mode, CriUint32 nchunk); +CriSj CRIAPI criSj_CreateUniversalWithConfig(CriHeap heap, CriSjUniversalMode mode, CriUint32 nchunk, const CriSjConfig *config); +CriSint32 CRIAPI criSjUni_GetRequiredMemorySizeWithConfig(CriSjUniversalMode mode, CriUint32 nchunk, const CriSjConfig *config); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif + +/* end of file */ diff --git a/3rdParty/cri/pc/include/cri_xpt.h b/3rdParty/cri/pc/include/cri_xpt.h new file mode 100644 index 00000000..80411aa8 --- /dev/null +++ b/3rdParty/cri/pc/include/cri_xpt.h @@ -0,0 +1,51 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 1998-2010 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header for Windows + * File : cri_xpt.h + * Date : 2010-05-19 + * Version : 1.17 + * + ****************************************************************************/ +#ifndef CRI_INCL_CRI_XPT_H +#define CRI_INCL_CRI_XPT_H + +#if defined(__BORLANDC__) +#define XPT_TGT_BCB +#else +#define XPT_TGT_PC +#define XPT_TGT_PC_PRO +#endif + +#define XPT_CCS_LEND +#define XPT_SUPPORT_MULTICHANNEL + +#if defined(XPT_TGT_PC) + #if defined(_MSC_VER) + #if (_MSC_VER >= 1400) /* Visual Studio 2005 or later */ + #if defined(WIN64) || defined(_WIN64) || defined(_M_X64) + #define CRI_TARGET_STR "PCx64" /* WIN64 */ + #elif defined(WIN32) || defined(_WIN32) + #define CRI_TARGET_STR "PCx86" /* WIN32 */ + #else + #error cri_xpt.h : Preprosessor definition WIN32/WIN64 should be defined. + #endif + #else + #define CRI_TARGET_STR "PC" /* Visual Studio .NET 2003 or Visual C++ 6.0 */ + #endif + #else + #error cri_xpt.h : CRI_TARGET_STR is not defined by reason that the compiler is not assumed. + #endif +#else + #define CRI_TARGET_STR "PCBCB" +#endif + +#include "cri_xpts_win.h" +#include "cri_xpt_post.h" + +#endif /* CRI_INCL_CRI_XPT_H */ +/* End Of File */ diff --git a/3rdParty/cri/pc/include/cri_xpt_post.h b/3rdParty/cri/pc/include/cri_xpt_post.h new file mode 100644 index 00000000..89413936 --- /dev/null +++ b/3rdParty/cri/pc/include/cri_xpt_post.h @@ -0,0 +1,256 @@ +/***************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 1998-2012 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header / Post-Process + * File : cri_xpt_post.h + * Date : 2012-05-15 + * Version : 2.07 + * + *****************************************************************************/ +#ifndef CRI_INCL_CRI_XPT_POST_H +#define CRI_INCL_CRI_XPT_POST_H + + +/***************************************************************************** + * マクロ定義 + * Macro definition + *****************************************************************************/ + +/* コンパイル時の静的アサート + * C++ BoostのSTATIC_ASSERTと同等の機能をC言語で実装する。 + * 条件が真であることを検証する。偽の場合はコンパイルエラーを起こして、コン + * パイルを停止させる。 + * Static Asart when compiling + * This function is equal to STATIC_ASSERT of C++ Boost, and is imprementated + * by C language. If the condition is false, a compiler error is caused and + * it stop compiling. + */ +#define XPT_STATIC_ASSERT(cond) extern int xpt_static_assert_array[(cond)?1:-1] + + +/***************************************************************************** + * コンパイルオプションの検証 + * Compiler option test + *****************************************************************************/ + +/* enum型の検証 + *  enum型がint型に整合することを検証する。 + *  適切なエラーメッセージを表示したいので、可能ならコンパイルオプションによる + *  チェックを行う。不可能な場合、汎用的な静的アサートによるチェックが働く。 + * Enum type test + * It is verified that the enum type adjusts to the int type. + * To display an appropriate error message, it checks the compiler option + * if possible. General static asart test works if it is impossible. + */ +#if defined(__MWERKS__) /* CodeWarrior */ + //#if !__option(enumsalwaysint) + // #error ERROR cri_xpt_post.h : Compiler option 'Enums Always Int' should be ON. + //#endif +#elif defined(__GNUC__) + //#if Compiler option -fshort-enums is used + // #error ERROR cri_xpt_post.h : Compiler option '-fshort-enums' should not be used. + //#endif +#endif +//typedef enum {XPT_TEST_ENUM_0, XPT_TEST_ENUM_1, XPT_TEST_ENUM_2} XptTestEnum; +//XPT_STATIC_ASSERT(sizeof(XptTestEnum) == sizeof(Uint32)); /* enum should be 4byte. */ + +/***************************************************************************** + * 定数マクロ + * Macros of constant value + *****************************************************************************/ + +/* NULL ポインタ型 */ +#if !defined(CRI_NULL) +#ifdef __cplusplus +#define CRI_NULL (0) +#else +#define CRI_NULL ((void *)0) +#endif +#endif + +/* 論理定数1(偽、真) */ +#if !defined(CRI_FALSE) +#define CRI_FALSE (0) +#endif +#if !defined(CRI_TRUE) +#define CRI_TRUE (1) +#endif + +/* 論理定数2(スイッチ) */ +#if !defined(CRI_OFF) +#define CRI_OFF (0) +#endif +#if !defined(CRI_ON) +#define CRI_ON (1) +#endif + +/* 結果判定の定数(成功、失敗) */ +#if !defined(CRI_OK) +#define CRI_OK (0) /* 成功 */ +#endif +#if !defined(CRI_NG) +#define CRI_NG (-1) /* 失敗 */ +#endif + +/***************************************************************************** + * ポインタまたは64ビットアドレスを格納できる整数型 + * 備考: ポインタ32bitかつROMアドレス空間64bitの環境で、両者を透過的に扱える。 + * The integer type which can hold an pointer or an address up to 64 bits. + * NOTE: In the environment of pointer 32bit and ROM address space 64bit, + * this type can treat both transparently. + *****************************************************************************/ + +#if !defined(_TYPEDEF_CriUint64Adr) +#define _TYPEDEF_CriUint64Adr +typedef CriUint64 CriUint64Adr; /* ポインタまたは64ビットアドレスを格納できる整数型 */ +#endif + +#if !defined(CRI_PTR_TO_UINT64ADR) +#define CRI_PTR_TO_UINT64ADR(ptr) ((CriUint64Adr)(ptr)) /* Convert pointer to CriUint64Adr */ +#endif + +#if !defined(CRI_UINT64ADR_TO_PTR) +#define CRI_UINT64ADR_TO_PTR(uint64adr) ((void *)(CriUintPtr)(uint64adr)) /* Convert CriUint64Adr to pointer */ +#endif + +#if !defined(CRI_XPT_DISABLE_UNPREFIXED_TYPE) + +/***************************************************************************** + * 互換性維持のための定数マクロ + * Macros for compatibility with old version + *****************************************************************************/ + +/* NULL ポインタ型 */ +#if !defined(NULL) +#define NULL (CRI_NULL) +#endif + +/* 論理定数1(偽、真) */ +#if !defined(FALSE) +#define FALSE (CRI_FALSE) +#endif +#if !defined(TRUE) +#define TRUE (CRI_TRUE) +#endif + +/* 論理定数2(スイッチ) */ +#if !defined(OFF) +#define OFF (CRI_OFF) +#endif +#if !defined(ON) +#define ON (CRI_ON) +#endif + +/* 結果判定の定数(成功、失敗) */ +#if !defined(OK) +#define OK (CRI_OK) +#endif +#if !defined(NG) +#define NG (CRI_NG) +#endif + +/***************************************************************************** + * 互換性維持のためのデータ型宣言 + * Types for compatibility with old version + *****************************************************************************/ + +#if !defined(_TYPEDEF_Uint8) +#define _TYPEDEF_Uint8 +typedef CriUint8 Uint8; /* 符号なし1バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Sint8) +#define _TYPEDEF_Sint8 +typedef CriSint8 Sint8; /* 符号つき1バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Uint16) +#define _TYPEDEF_Uint16 +typedef CriUint16 Uint16; /* 符号なし2バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Sint16) +#define _TYPEDEF_Sint16 +typedef CriSint16 Sint16; /* 符号つき2バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Uint32) +#define _TYPEDEF_Uint32 +typedef CriUint32 Uint32; /* 符号なし4バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Sint32) +#define _TYPEDEF_Sint32 +typedef CriSint32 Sint32; /* 符号つき4バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Uint64) +#define _TYPEDEF_Uint64 +typedef CriUint64 Uint64; /* 符号なし8バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Sint64) +#define _TYPEDEF_Sint64 +typedef CriSint64 Sint64; /* 符号つき8バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Uint128) +#define _TYPEDEF_Uint128 +typedef CriUint128 Uint128; /* 符号なし16バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Sint128) +#define _TYPEDEF_Sint128 +typedef CriSint128 Sint128; /* 符号つき16バイト整数 */ +#endif + +#if !defined(_TYPEDEF_Float16) +#define _TYPEDEF_Float16 +typedef CriFloat16 Float16; /* 2バイト実数 */ +#endif + +#if !defined(_TYPEDEF_Float32) +#define _TYPEDEF_Float32 +typedef CriFloat32 Float32; /* 4バイト実数 */ +#endif + +#if !defined(_TYPEDEF_Float64) +#define _TYPEDEF_Float64 +typedef CriFloat64 Float64; /* 8バイト実数 */ +#endif + +#if !defined(_TYPEDEF_Fixed32) +#define _TYPEDEF_Fixed32 +typedef CriFixed32 Fixed32; /* 固定小数点32ビット */ +#endif + +/* X11 API(xtrapproto.h)との競合回避用 */ +#if !defined(_TYPEDEF_Bool) && !defined(Bool) +#define _TYPEDEF_Bool +typedef CriBool Bool; /* 論理型(論理定数を値にとる) */ +#endif + +#if !defined(_TYPEDEF_Char8) +#define _TYPEDEF_Char8 +typedef CriChar8 Char8; /* 文字型 */ +#endif + +#if !defined(_TYPEDEF_SintPtr) +#define _TYPEDEF_SintPtr +typedef CriSintPtr SintPtr; +#endif + +#if !defined(_TYPEDEF_UintPtr) +#define _TYPEDEF_UintPtr +typedef CriUintPtr UintPtr; +#endif + +#endif /* CRI_XPT_DISABLE_UNPREFIXED_TYPE */ + +#endif /* CRI_INCL_CRI_XPT_POST_H */ + +/* end of file */ diff --git a/3rdParty/cri/pc/include/cri_xpts_win.h b/3rdParty/cri/pc/include/cri_xpts_win.h new file mode 100644 index 00000000..1e339dab --- /dev/null +++ b/3rdParty/cri/pc/include/cri_xpts_win.h @@ -0,0 +1,164 @@ +/**************************************************************************** + * + * CRI Middleware SDK + * + * Copyright (c) 1998-2011 CRI Middleware Co., Ltd. + * + * Library : CRI Middleware Library + * Module : CRI Common Header for Windows, Xbox and Xbox360 + * File : cri_xpts_win.h + * Date : 2011-08-10 + * Version : 2.04 + * + ****************************************************************************/ + +#ifndef CRI_INCL_CRI_XPTS_H +#define CRI_INCL_CRI_XPTS_H + +/***************************************************************************** + * 基本データ型宣言 + *****************************************************************************/ + +#if !defined(_TYPEDEF_CriUint8) +#define _TYPEDEF_CriUint8 +typedef unsigned char CriUint8; /* 符号なし1バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriSint8) +#define _TYPEDEF_CriSint8 +typedef signed char CriSint8; /* 符号つき1バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriUint16) +#define _TYPEDEF_CriUint16 +typedef unsigned short CriUint16; /* 符号なし2バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriSint16) +#define _TYPEDEF_CriSint16 +typedef signed short CriSint16; /* 符号つき2バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriUint32) +#define _TYPEDEF_CriUint32 +typedef unsigned long CriUint32; /* 符号なし4バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriSint32) +#define _TYPEDEF_CriSint32 +typedef signed long CriSint32; /* 符号つき4バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriUint64) +#define _TYPEDEF_CriUint64 +typedef unsigned __int64 CriUint64; /* 符号なし8バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriSint64) +#define _TYPEDEF_CriSint64 +typedef signed __int64 CriSint64; /* 符号つき8バイト整数 */ +#endif + +#if !defined(_TYPEDEF_CriUint128) +#define _TYPEDEF_CriUint128 +typedef struct { /* 符号なし16バイト整数 */ + CriUint64 h; /* 上位64ビット */ + CriUint64 l; /* 下位64ビット */ +} CriUint128; +#endif + +#if !defined(_TYPEDEF_CriSint128) +#define _TYPEDEF_CriSint128 +typedef struct { /* 符号つき16バイト整数 */ + CriSint64 h; /* 上位64ビット */ + CriUint64 l; /* 下位64ビット */ +} CriSint128; +#endif + +#if !defined(_TYPEDEF_CriFloat16) +#define _TYPEDEF_CriFloat16 +typedef signed short CriFloat16; /* 2バイト実数 */ +#endif + +#if !defined(_TYPEDEF_CriFloat32) +#define _TYPEDEF_CriFloat32 +typedef float CriFloat32; /* 4バイト実数 */ +#endif + +#if !defined(_TYPEDEF_CriFloat64) +#define _TYPEDEF_CriFloat64 +typedef double CriFloat64; /* 8バイト実数 */ +#endif + +#if !defined(_TYPEDEF_CriFixed32) +#define _TYPEDEF_CriFixed32 +typedef signed long CriFixed32; /* 固定小数点32ビット */ +#endif + +#if !defined(_TYPEDEF_CriBool) +#define _TYPEDEF_CriBool +typedef CriSint32 CriBool; /* 論理型(論理定数を値にとる) */ +#endif + +#if !defined(_TYPEDEF_CriChar8) +#define _TYPEDEF_CriChar8 +typedef char CriChar8; /* 文字型 */ +#endif + +/***************************************************************************** + * ポインタを格納可能な整数型 + *****************************************************************************/ + +#if defined(CRI_WIN64) || defined(_WIN64) || defined(_M_X64) + +#if !defined(_TYPEDEF_CriSintPtr) +#define _TYPEDEF_CriSintPtr +typedef signed __int64 CriSintPtr; +#endif + +#if !defined(_TYPEDEF_CriUintPtr) +#define _TYPEDEF_CriUintPtr +typedef unsigned __int64 CriUintPtr; +#endif + +#else + +#if defined(_MSC_VER) && (_MSC_VER >= 1300) + +#if !defined(_TYPEDEF_CriSintPtr) +#define _TYPEDEF_CriSintPtr +typedef __w64 signed int CriSintPtr; +#endif + +#if !defined(_TYPEDEF_CriUintPtr) +#define _TYPEDEF_CriUintPtr +typedef __w64 unsigned int CriUintPtr; +#endif + +#else + +#if !defined(_TYPEDEF_CriSintPtr) +#define _TYPEDEF_CriSintPtr +typedef CriSint32 CriSintPtr; +#endif + +#if !defined(_TYPEDEF_CriUintPtr) +#define _TYPEDEF_CriUintPtr +typedef CriUint32 CriUintPtr; +#endif + +#endif + +#endif /* end of _WIN64 */ + +/***************************************************************************** + * 呼び出し規約 + *****************************************************************************/ + +#if !defined(CRIAPI) +#define CRIAPI __cdecl +#endif + +#endif /* CRI_INCL_CRI_XPTS_H */ + +/* end of file */ diff --git a/3rdParty/cri/pc/libs/Win32/cri_base_pcx86.lib b/3rdParty/cri/pc/libs/Win32/cri_base_pcx86.lib new file mode 100644 index 0000000000000000000000000000000000000000..dc0d4bc74ba493d2722738b73fd7d1287c7f3cf0 GIT binary patch literal 605824 zcmeFadyr)5RUde(tGc>pG(tU6Baa@4MjE}PnXGs9j8Nsxn|U*D=FP`cRzC*DN@Znc zb!B%}W+@-tT|$zz3}Q8ONDJZhKL%rvcLTi323}Cive>H~FE)p^f%&iUTwd!6r`A9zo_-`Icey$@f|KT9i{ zYip|;tBDOAo)E9AtIMlv?DzZcwXB6-x8~m8d2ybPyw{qGdw%?j*4#_={L0T+bCaIm zNLX{`^My}abHDv#-~G>5K4s0lgwLrnPg_%;SN)iEYS!niU$jmg_gVj>b!wI;>szPB zJ&*mOb!wKU{yyu}NuLjV!#XwY`QWN`>bvFn>1FHGai4#(W1Twb^E;omPQ^W6{)%-< zeV)5+&Cgx^&OG(swdUpX;ZEV(6IVdF2Dv!nfmj_eZUT<2;XEuol!Ob>3P~pWL^s1^JW`)`EPt zzh*6byPiSPS{V0y_;c36OZoi5?^p|e!=BR%IqL;IuYRv}`nb=VKWd$hd*1b&b=rJ3 z7Oc~=JlT?U`n%y7owrWMJs)|%I{i{SKV7j-&-(oGIqS51K8gQj^N#mfXO8o{_Z!w3`E37v>&y#zo<47#x%=ELgBPg{oc#yCYrSaCKf7$5 z{Z2f8aIbY%eZKx>>+B17?wMb(g6IA(S@)duNqo(^XO`#DZ*FbXoMbJL_LH7n$UC-M zPG*)9ODlz#I!er&BZl2%BW_e;65Z`%sx5-4x=`ZsEW z_6J*%elXg@043-$PO|LhGWk-fBI%ZvSd5eDO36&7l&fSjIZ1|uuB5geMEsI>Dd`t; z6~B-HGS3WHBS{RW=4^XTZl`v$)gQEb-P&N-w`z@k+u0v_&6?A1)rYNAr{290fx7+P zLApMyD*@To@N&H~YAK+q0jfFmPGi&o*DENHD#}A5$3-S!W>mFw3+e0~1*C`=306~6 z3qe{WW)f>!0(Zc-=Js1WQS1!_JM9AlFzU94EOLfYtam!SM)+Rox4Xl=@V(k;wGL%% zEM+pqyzP305agu29H0<>XFz$M&_bR5qC@X7hz~)=O?Z=%m@RhHByoZgz0v8XD+r*!|9-o)Y+OC^-om5PG9&+Cv z6JrI0o>MHQGEu^!H(hdc8v=soOLX?WB|0tY2~SDI_|`tKI2rtqu2) z$06zn9q?AGkC(xy(P#|@d!tU!+|#LKIhQTxQ?^P^RK4BnHR`}xwoxpUl1M2-}3hoTqt7o-e7@+#|Gs*)*}iYbM4W_!E54Vfz%Kks~7YiN(xx&fb% zMx0I*YQ11 zEj@deI`OLPw=`TZIh5|#Z-r7XbGy|T4O_)}yBh*sA*wMr8lU!L}*=+4C0YkiRG!uztVkvmPxTe3? zch?iU>tT2!v5C*c0Kd6h#|ITC__d7py#)IN;d`6Ldvk5K*$`NXM2OeogyL@q4^TBe ztBEDf*uY;+tc-!LX%R^NtBJL}h7xlK-&|K2h49^#-B|oqJbY2{1Km@ZI zWi@CI>)mDJbv1lMD(ly(-vMAy61Ayr@AR=nq3aRlF&IJN=Q68;p{@D#2I!^+UU_M;*derBHA($y7P- zlpq*rI-S@|EMYpmytPugwT75prKdcY1cQ2#~2-9AskS*A0Nr+{|=4^!J zid(F(#Rx^1*jP%;M3>1`a-~!@r9`+o6Cq@NDPORa7!&I=5oT>nm5RQj#E7!-y0qG9 zH`)+Xn7U!+j{&={7EL}^EV_k)uh1I1^zRWs}ZgjTkmKDx7HzE}P8zp6wJXo+L!W zA;KOip?z@JVZ$b7c58d+8A+>F%@;Fi&)z9-2SbAb3Wf&-mgx@rN11-#WnD`Nz(C&~ zU|di@81kI`5v?S3phq1BE12qaGX$d>U(@LXmqu-f2L(nm1syPmjjS??Nx^n&(9)?f z%#BIYrS7#L6NBpqt!BGE#ER%)9 zJ7k+F*nAiW_Gpt~p~P++s0F4V2W>SV4;zFEqWRN4W~h~3PnHh~fHn_ydP6ixxj(_9 z3ENM=L$sdYU2P!%vU1Q$U=!<^LZ;wjVolY(y}M_$kAm;!OW7RyENdSd=5|gonaibI ztZy?(MxKIX#el#1X7zNy+@j5A3#lP73`E>bkarMEFoXaW?6LYT)BY3OEgPe zY=I!I%@H`Z@{QuJUKi9{u!(}vUwFsJnS|YXTVW%yJZl0G&0o8U#?G9fxqzBu( zqrIBlY-&jl!CC!1)C`Ca~G5KFh<%^C}&Zd)> zus+z-`qo;plJ|=^G)Q7GV}z}zQ+_2|!d51QE$KVP>uJ}+nSonmOjqt2>5~nG8bQ9LxK%=)g!}4RcydTZcPGhpn9+O$j7-5?5}!)oG3euBoV);W2F4 z6S0c&vaajq^8AD@f#Ga}owV)H=|XpOuuIGL-rm+4qr-^K_nzdgieyf$1xayQoes6S zF<`B|2z0h3h|@F5n@YBgJ;In)M&M}m5tLVz$s$@q5?8AY0xAVg*}=kRbci1+M+u{L zl5^~0`*y2OmD9zc0JdIx*wx(WF{m2er*lIEz%f%eCc6>jFyN*Hdc1KdK?8o!7ed;D zh88;=4w~_Y+spx-x|`3ul&}{7M2bw z$>m;WMD11VS&A(}`M#Rawg#~m2U@R~c6P*cM*##QPJp82j8hpoN|}UYP~ze z^a9O9&Zx5N5CCjMi&1kbK}su7n@CJ>*hut1C0SuW*nT8TD?$mRuDM@FtM16fw31o` zx_yYCD)QFqHd=hoJ`RD+s`LP!D!!7`LwuY&#LGe^AM#5F8;3GRplIO=)M$k=dT&6&F>`P@#A&^XKFD;N zpkTRz}c~oIXyz zz|CnN?o$V2au(T)WL-nZ;M7Yi8#af&T|q-?4QZZyY0zq>j&MT8B!Bg~4C4G_fnwfZ z;_~s%gz|wWga&d=O9<5>8cRi}poHimK-rDC9Y_$)!B`L7CYgr5!gDCoPrxX|T+7_9 z(Pof=7lOikD|kV!6W8RaokneVA)5@2Ky*}SiS&&mFc1ikhi zB@%1P8wngR412w;wf*+B{jIg#_HgSW9k5E}jNm}Th5k*t;FN6-)S$h%yhPi8Dlx}NMZA5(9TK(cP8R9PShMLo05%XcM73R9!OXvaI0(KrIq3|h=J4C6;T z`~B8nzt?F7ZB3>^HmE5ysiR`M+ddc_&@?HOPU9l>+Xw9-lqA~S)S-~H<4`r_xUs2{ zSZK6wY7j=e9gAk{)*Col ziY+amI=y}$(>Ba@SffIFayxZ#0%X*TDdols!&%ZeIz(ejLqTj@$`}F{p>bt@>97fb zSH{wQAAM$QX>c@I*2tdHH061^pDdSbC`>^&iA&g3h&mi^lgb+%CPCAuP9+2_GZaZ6 zB8$+RE2PWiJXe`bBtW*jq-|AU6CApa*gTW6n^0B^lyuQ6`z4p1=0ZdhioOGf?J7T; zEfmvSiI}0_6kS!##aT|eSaJM3Qwb1Upr=RLyK3o$6F}MJjo@ex*JnhcP4LM>zom7> z18;Y<$7aFWq-vjVD4Y;U9ZN{fmL~@l*K06!0``kF0y9KekC{Pg7d6A^Fd~+p zH$WRE-3^kHu^6I_6Ng#wxDKU`$%?2ZvM18PVRG2Vh7QvJ;VBSdL7Mq{ILe0DSWFac z-!D6n)dWw6zH$*TwDIUlLWG5pVE(`C^xH1BJDVcuy*`V1uij`SlU2K7U-c^Xr3g|o zSxEj6$X6mE8u?YCpA~U@Jk);lMCv7NgeeWk2$Ahabk>Uw4xXG0E)F0Ymj-+3gWKB3 zRYDJOQZBTMLIfP{g+mvoi4I(Jj7x(Ut80lA4qqB14p*j=GA@wSxu*chmZipmis#3V z)$972U(g^NB7ZpIf=vLG7NNvQ(oXUk9*9l6FhS@v?DUf~nlz}SF~C@e^hUkWuzIV_ zlxYiS+HX`d9>FN>v>l9(MTrUj(t;1R4f}))lyp27AgmDc+g~w`)!8 zsMq_=8g^`ZO`x;rL|6+-+%>-6rGnc~xT-b89t5Iu4!Ue=LF!#z)9yB_p19bf1gd(< zAz0lW<@pxO!T{Rg7qixou2OF{F;xymZxK?g-)P~dARh7=xd^M&`vW~tH1>5IKjKIe z8l7~3ph1@qAX>Ecj>)F$7R#v;>E)~~EiW%8mTl46rEW55_F{YzpKt{&A^iUkzM=(4 zICPD%+~0#@w2r@;P&I*-m3X4Lx2LSKSv}d!+t?MvDxrnh1?^VGLxYWWl)OTMo)B&s z7FxVjDdBurr>3m{(deDgu(!8IyHK>eHlqYWx^sjJVq*jNA-c|UVnV=DY?doLMUGST zLAw!Z*RuiXcIDj8|}zHU>qPXWE8TzSWDeGaQDgAg!bOjkyE@abw$$_$CxnwY` z;AR(;*Ro01yGmD*l#7b%j$bIJ3PpDP1xa*VTpe;KttENaM0VJ6&Mz1J9J~AkEV|mn z|5Mmq%;fS8PQUW3S9h`P*2QKab#5)zl!Gm^ToJ0dnPg>WdkgD4$4zYB&f$M{Jx=`2 z8>vk}gVDhiET_z_|G0^@CTQ1+DZel~k5aOb&7{&9+_=d=dzmTk=eAZVQj7dn9hqZ_ zzPd66^e8K(vg_G4?u&vDo05qo5XMfWheyE#)yXCiS-Dcgf)ixRORI@xkfrKaF9&MY zEYkWR-a|Ss>6QuwyHLc87=&xfD=a<|lWXW6xXDNN!r0W91_zC@P|P8nS)Nj&Od!e` zC`(Bvop&mg3@M%Q#8Mtf^$y7$qC(jcAG2_DWF<;m-_7RSlxOp0HQTklxQ2N@?F_Z| z+O#=v5Uw49OhWn1%V%<_GT%HEbXcIIkI-`34UMX&T>7m*M=)J1XQ6DvW)^(@P30EYhvr(KU=ZY^EIy>5NJSvBhPe@}UJGHDZcRCx7wee8&T1&{v4ZK&`Mi zCgJF7Uo8<8T$beZ9?zaNj0yR}P6A(d^XaF?8}sGCFmoHHv@yKdZDW>l8ggh9z*-Iw z8Kuj{?D2^VHyK#W(CcsY9qLsLXhHLx#*m>lyJq;o3X{DVlV%3<>-rkaOBf!XrLwa!zM2!Qq}Ny0Zvi$+ zVAL2UlWa{!YrmPWE2%VJ?#)bbWfi=sNJ!b@xX~HJ(_+7xpOl-c`EaGGWtP^a2~J9@ z*qE>hgyEt#LWgB+d~wId5{DgRcxDQt#DW#~Oo=mygV>psh>Ko1;}mjUmR7*_sMc-W z5@H()hV~_Yr)K+Jwp7fNb{K}--$^Ey^C@c!;!f|^22#}))x#oN%jEoYuHcgzW5&L; zX!Hh7S!Q#|jAyL3SQ@!0iogG^qGx9%D1(`$=PE2{j(mX0 z9(8Mxag^@p5F;VfD7gq94dteTOuO%Uc{juE60npdL~9b^n2~4vj92nKn(%BwJrk2n zy0#{!nrdZW7EX(I+pF*y^wKgW!<1USqqw!kYFev5koeGU_OTLS?1=;i^Akz@WU81g z<*)$|kYGDFD3c+zBAWi{5#f%HgGpD)<@un9)RK&+a_nTbR7jO_)EPklB5WYDJ9|ux zYHQ7-Yv3@&z#>%(14V$VmldY~jd0fHyyoql-Hz5(smtL&hVft=uyS;9^1wCw)QaS1 z!($P3tysC0p)!CH#?3%e7fQVR%uqBFh(A)DmD>R!ly+81bYoty&ko&XysH#2Q&`YWV3`!R|tiA z8M_gRN)nQB)wQ#@*;Jw(2R6)WUEA+9)N@C0BZx5o5(qVf0@N}jz*6~J&;k*V)DbH- zk%na`CKWudl%{PJ+M!Was>|t0A#WEmE(?Rn7&WYvuVl-`91GGfJ+7qvbjeGRO(d}F z=z*&^Wx%y*5r&n&%5=4u&v~8$k)Fk+U@d49>)}$`hZx0}%9^eo>{U{k5>D$VnDtIA z_+qN)7O}sRmcho2m5Yw=;7)cnBg2hLG#6oTrj&AE8b-u!+*-Mq@hYyJhJi5=ZqjFp z#gdc54SbP2lRj7Rin*N2t{GGA%=CF_TyJ+UM-kf(!Jd?s%@lU;ynHF`VX&8o7uk>1 z+glTU@GUZpm5&`g2X@bJT#F>Lon<3Uu&M@YDz1xt9f2S-g=S0Bhqy~0A_Ogwh70P~ zbR57XMHnUp4)6B@j?+zS_*s%UTOb-^4s`|08l`C#N&_I?o;W~|-Cgt;77IlWJQ^Wn zw}g%#bp29krmn|qLTq3c2SdHQC93XK4fkRAfW#%KpVeVw4d){L9@Necf@L#X!fQBU z8jSO)MrbrmGGKuuPo(O4$XxCG0v-9YVT%EqbVtSdfS<#KL1K%F1H_?A7>Xk7ktVsC zHq7_N@k3B71+#}nmgjbI+Zj6@IlUDTDjP^)67;iMA(Na!64&dB*bil@K+6f7*3+yB z1%cfr?1XQvab{a<{nk*O>iT)u#mjh@>M|wGRqUg}CW9ox)SD~RV$xg>O?hBT879GC z9|NX=h;Dgl3AK*;mUIVPA(c@F$eN$a=hOKV zS6^Djsn;f%9Z}nKABy_}%(StV2sBAo6PtUhayp3rgL5tDztV@bo$AelntE(Y@7k^s z0jMX^UUI#|a~Wx7aY$N&69_!7Sa>Sh(OOWBPc#LL$5x~g4H6slO@5L_m@%4v49a7p zI}KDc!dwy&NRUX5s&+xaMk?dkqf1RM6B8*?CO|M^;~8arMM@-I4DoV_Q>(KL0Z|2x z0BQBiV?fQ0t5O3&YAYIGJx4qcnVQTrKnSRX_$Vd|SUC9}R(BXWXx(#-w6fVmgTz!V zjrC~O-pNEHmBbyhixCEMAwQ`|L)>uZzZjaqqloJ4 zvZ04U~G7<8bTNr^c) zOeP<*Gs&x@yc7-e>qnisg0U1sUXKS3^+T;{FBXmm~c9d9Cf;r#i^>y6ikZXx-ghw)ov<5m_wJ1WEqY!I5v1MNd zD`j&zxkVyZ;kHMFaw6X=N*c*$taqE9^P_5^QhI7;2^8*$ z&5*E|gi1r+&(c8wi}2#o(yBO>p-DpyhQ3NL5gNVfmg~yPBcda#`uJgB{K1G49?la? zVC0ZJh*7PFkSfz19q{~$)8_ymljiu;q1Ld6RIJ~Qr{lqNs69433}g)^ObwQJ?Y$#T zCxU#;rPbMH4)2sqLBy?WyKq|4rE3co}78_^ypRPxeYy#n`}#ghoIt|?JJRa zp3}cY%Mr2oWDE#|V~)^ni~uwa`SMu24#eFAdaWMzu~Wm9#n?L(FNN+HdmZ+n03I;M zmZHiFubmcOrwHV(f!$TnFArp7G=WXo)#&6E8gea>qnd~59Iow)S4ES6C8vgDGY#z; z)|sPDtJY$c#2fo9TxHl|M=Y2|4RN!r)lZ@>07)iS*y$+?OeSsFQI}wou#!&au-~Mg zF+zE!=$5^5t^lhv-5cHBEp*i@^?sM`ILdLF4gKk4+Qn%kHPL_6)m7HJ5<IQ-1Jw8;yLIyjYMbsU=05hA&qgu%;#Q-Xe6P@e)**%q!O3q`+@bF;RIB}$8A zDYN+<>6Bnbos#hkuQwAEr)7{Jtm%fYurkb>rU>S0nPE8NQ)PBB4NPVTxy`SYhWM5K zf!*&5-OUgznykTyso$^|^ps-V068CC11CO!F-(>VDB!Sbe%#E6$N(_>-Zd--t_8%R z(CLW3T&ke{FfYb!l}+4L=^fIjw*{+Hv|qnz=u(0L=F(u{K3`#5z~~(`(n0gP)g(>1 z(9pMx0uCiI1uvb##WrdI;oTPODuSRzvVq$CV1QfMk!At={&~BS$zt10>0*KMAv3&# zL5HV;R3C%Z>*SIi-P?0YxJeYWbB&S>sL(jz)FCC#?6HQ=l`CW8WRybNEu@2fX5KEP z%N{QCO^8uwzXf!drh8DfOXKVp=C0_JowDU{y`S>#b#^5Y+D5Rv0^u$>{AKtn8)F^J&S_|{sU6ilgRQ>{jQ z6p(tEWPy%byh;JFQ!}8a9;s6hvc$nRKtKzD;bzJOI8K4&;2MTfEkZOLVB~Bsm32vR zLg*lx(#OTUcN^AjIR=?W)%AyQ%7BxPEFHWs9>7SL7+Kg^gORdO({V{xPlmXz6jB+R zc8g_7O>IeN$flvW!?gXOmJ5d|W-OIbB~>VwNvjokq3zfRMmgu^3UobHU@Qv^DTgp- z-h_=SuL%oEytf2`M-3WWlY=J=w&lHymm-~Gnslz?D%>VrOpDXk3u*>bzLT|aYR5NH zI2BYLCR62-ZpwFxj<5pFsjyc~+crZ(l`o9TPZlfbf(IkeN(!;x9FB14212bcpmObG z#V(feMff*CzEGCy%NTrcQ?EUMLSqBQ5~u^QkrDH|-GC6IMkeD{pz@&5AvPHYIvQ7A z1cTk{0U0hWK^Z<socPAASeRMA3Uw)BJ|a%{sJ4dtjh4F&aCmu%2tNa zUam}%s!a(zrWc9&r5zV%0NH@KlDdr|U>ONx8z%y&?1yYRG;Jy6+1VNk*5*u(lXNpq zv4A|IHImZO+R8EvN~jqT@&tPBd+Y{vP+ER6m(S(W)OxtS6PZhsGcwv33DX$e3K3y) z7en2s5JBN4f(D>E)Bv=G7XV|`E}(QL@A48_QdG;(w$;fft%$=l|8#0Y4KT_~)IBZ6 z1vf14uSW4$qnL`tn#5Er8drLIXfSBt3Nq9Nu~9&iCRl)mbkV&!NyEz6v8;4(kx@3# zaBYJT0@Dg9aBx|^Y^Td5bWq+emmzWFBDaC@tWhuCc5qT6?9$+eM@t2|Bq@2o)N?rp zLzI~k7YP^XQ5|D;5?2mbw4#2I}Z`_MnO2HN|A8f8m+OLIpVI3 zRWl)&4Mc%_@KoWroP<250sI;{*=V-O1CQ{nb*)w% zws7Z=`2x9CYct(%Y7Mf$v9NFb5nH}OX73IJSywt`q zwB0;xz@rFigJ#z3M_8X!?lmk_`n_76@M@HFJ}YKW24pa~18Da|+QI!Q8f17yVbdzMqHQ2h1I<{fEo|gM0LO?pW-b^MRx1j+JQH~WYiOLY!Jq~j5ILKF~BiHwD1F2TWA2qQn z75nieNDb^CTtZ4~wuj}x5^Xpr1ULuj>qO2~N5>eT2WcpU5MeJGXEBU`LMKPSFeXKC zFfjrOog4wfm=wXSi4jofYy@`tYA(H9V-_G&Ex*^jrj{aWN*DpC8EJ^seK?Vd zV!9@#KPyYWHHD=R_WaCDk2znl9X$AViKh|`NF)RkITC5dqRL%ORiz6JJtCT$ppjBA z%}3c}rJApmp}>ZD3%{-*!j(CN)-MePqJt7goEbK&@QtNMNtx2)gzFOCs|67b8g&wO z)F6@p5s_-+aQHw+iQ%d+rJ+v8S6OnKkoHZ?GD(G5N1VcVkm<2gm9R*n1WH06komP9 zQ@R;Nf-;iTpipxy&RL37A=-hO+O#YQbf;LN%^tf$_mp>ZvG%x~N6zA9n@&DDBpI$p zNjG?;>`puBT57)uyLRbzcQ1m+gk}m|n72j}p=mBcMKnYo&X&W1r_PeQN}<$zsVN8T zmw;Mxijrhz zWl46DFfVTZAQzV#jWm+{ILSe2pG;M4)H|&c=6D%dUs{gjoy~jnj894j*FZ4v=?qdN z9D*U;Zw&pLM$?NFrcxrHac>(e&7y!9W=Eo7G&pA>+q^p6lxRSM+OA^H-XPO+05sI< zR5aM_fDJN(lbLWmpCGABO|#m@P&S~6Ny^lCU~l?ZNn^Hx$uNYp)Qq29x;aWtWOYun zcCw(w<>fCNhZOY^sggFO&VEWIvOBY=qT?0H_`!#|vWF4G5Q39Z!DjS&q9=74Nb}Ud z5O@)MRH!~6E9C?Rxafy3Yod{u)%FIOSw;?qM)Uqig0umKq0x+g z1~i)Mk4LMf+zG=Cg+_)O0*;+7L5_q(qNE8hNxo6|_+~_*GZagJHa)+XVqkBRrq?Sm zGGEI9x>X<_tNBSIGlj~c3T8LxpJ;w7>R?TH6H71PBTEke>}2(i+zvAy7O6`b+mzVX zX(f3zPa~?7>=epaz})pAovh5p!(ag8L^;?LokFXmdSaa;Ni?Rl8tI|miXUylOest` z(Ihc7fvgfYoz;rZh-t!*J1!c&|Du2jsGL{17;f_^cQztOvVj{5!Pu9na z3^d0VT@=%?W!HqU5yAjtBcy1g?Tgt+m}RxvIZbq;H;rh*WGRd&oGcLxQF-0!b-ipO z@jxyZI|70heKdAu5#eBDFRt^7VaD09cVM=WTWp+x1_s@*i&DD=Umd$p*@H4( z%yzv)0~y<46?>NoRqOWf_(UCy4zzWP@X7ZT~i1 za%f|hk*rXvMYxjZ`|=G~q@;}Z{yonWi-tim4kV{fsH^uN0A$3cpbkjh%*n0YCvo4xO@c(9>4+U z9`k8c+v{js_A*NhBen=-k_lr{B?RF-BDJ1yE5Az-0%L0oQ-ETkUSbK*W+K zk)W;?i@kJA^rho*kFLiiCT8V$+*gl>zIHtHV__dJqsPnV@v?cmT&^E0mm9~z-aHoe z#o4emdBx7hVq4U()`~8|bj*R+HW}nsNPuqE?A_u*Z2|#1_KTdI z2L1o~1fh4h2MHY4z131e@+xe5fMv{1C8qf`ZDOs=Xo!QsgfFwkx=m9g=hv~A;KxSPliZvVEbE%ji#BhzR?@9Zm|Nt z2waWvBJ@Goou{C_8)T3h2BXqOZvbThE^xV47y1IxK|g3J9jSxi>PE(sod|@6DLJ4( zZL(5^{yA$$#2cmk!H2?ofD&;R12@OG4vnr8qUg?~aVrgF>*R7=L6~P5hFs{z zMGfL<8B0Z}Bqd&h9wFY@zAP>v(6($q!*@=DSF~wiRbCMBj>3$h$Y=lxyF`d~35I$C zKD3b#z6>I4$x9x!;Q&WySP6FMK@_FzKOvN^tr<|oW4KViT7`Oc9#(eJ$t(6{shVA@ zk?k?K1?vxY;SsTqdl!B35zFDX;Nw{XL*eQQ44X33@_lThljtFUxS1_tg8D7=XZ;+R z#750QKwgA&g-B;+-4t=h1#~FUp@VJPR0CaV{EIiM_3b%|A7U@-S4%;Sly`58rG5WC9oT|9E zJEX*DXn886XpX{ezVH~wjDtw~AXJ17iT-hFh?HtY|Bzm(=o@1-4?~P`I)@`1F30K0t4N`Feua-3}I;5ioPI?DBJa0mC3r9DhB8kwaZ$+eybL0 zY)bXRO0oodfu%C6NM2#B5;aYA9jAWS!WoUMGT7EpExd##UJ@$?9O;JL`$;t!1S7@c z)D_u)D%nt<*OVD46q_BBt3N;(SNj1%r1FgrweHOzwd%vL_JFny0%QI`K%_|oAz_OM zK+y(ak9fHTIg%40R6NfF)Q718Bp#a&i4f&>tqd25k3$eJA>WjaVUL0!BbQ-_%%&El zB$I(bw+QJ>W!o?$ES?ZHzI=o^4xVb!Deisvg8o@r*<4#&-B?X*=2T`z4s$?))#+#&ic7unX?kVF=u`H3vw*0Pgz&z=B?kY&s#e`GHxo~Qw|?w%A)wkkh;+B)~kc>nZiYxT>gt=oTm z+WOXCp0+-C|DyF1uUWMEZ&075Xmx%a&zBah`~DQ+UthEqtTR^gb!V*iz2l7ajrX3h{{HqE>-^Jatl#|y zXRXWs?5uU~ADp$m{PnZe!u&nfm+rsE`dZ>1>zj|>WBvMqW%-tkFaMjc!tXnj-voUJ zz8q`b@~n;E`>?f+_#d{eu)hxj{xH7xTT9kFp8Ktb*xUX16@Dq4zP^>RUIvPL@Vp$) zyYLXb9t*iJyZ=J>aS@FF$ z_{AX)TW_^C5q_Wbp!GfY|6zn*1^$1{B-~=<9UR^-^_6GNZDKQrF2kS^LXC| z#$!m!C98n1hvyL%!v8*O&EZ=B&xfra0{>Uy?GeV~5xhCTEFcB+B|6G0&*!qW%-#sH zfyc++m!Y(X4}J3}y@!BH;d$%LR*B`mfL~M&m%)wylJ9Q@^=0b^@i=(qP>QQ4_c_!C z#m8${wui7~gb=m8>{x#jzg3HWeO4L?(K~!AhhGW6{1-XbGCuSF9n{aH@0^vfil{Tk zdb@Snx@f)8a#63c?`&A#hwtmH*RtUufg*WdeIMw_cQ1*98+?55ReCf_aM?hct3>j zS-uO9V)DC<9(^h1yJgY$3G0VrzAo}X-%!?#`^E9XzY>q6MBMkikVW*(jQJMO7D(>! zzdwkU5dS@Asb48)sPCKKcUtrrS$g>h!`mqz*}%qQe`6>n=8{|LH_af;qf{-xOj zQPYUZrQ}t}oh-)e$01v|lu-ZD%;jOokH;e4SFjdD?S|S1FRl3?Z!6%Ye;;O&k^Yht zK8vl!gcDq94K5}V%(RAeOxtndo@{WhIchSFSzzPl=%Rtbd{&8U=rhn_%YQ=78)IQy~B{FAmdti;2nl;u1_d%D!SOU3bq?pIIdZE-D?hs|sph$hK=ync!> z)!R@ZS14qha&o7+}ugKrrYr^(j! zVUz}LW|NnFI<(MAZ9VIzvQ9CbVr&h&`RmzYHkG%1#?=g)#S`WRT;zDUw4F-EndRSr zZE!f`%)-PGY2X;i-YAjbRGd4(WJ)QL?kQ$R#u%Iw1-%JNRfS9e2VM|y)$7~4y5omw z4jkN)SIOsKCy7yC>bA8K-JI;-VY6VTP#e%AVAL?=r%_LL|1jA-_6v6pF_Z7o?-DN( zQ{9VAaaJ|nlNukEE}qmqnP_Mir#YOO+4SH`U|kL8ZZkW-f~Bt$xvu?oT2O>8LNS{! zq+!YlN+xOctTo{70#~sEyV_7d(I*&CVJMX=pn^WjRzesYs|{g;tTt>juf2+`Gxg{_ zbv#4RDKD9|T{rK-C$wStl6g2woy=Zl>c#U_ z16C*Vy9~k?V*4=ll56ZB#uIAHr7Gwto>MHQGSQy0wYJ?N6)ot6!L%f)ilfWI_@myb zaRvRPuI!u_Vz3OvCsVh8>qGbjbn__)p+I(F@heQv4I#o{5AhbXLSR^K)M&tH-`=Pb z>Oh>_v?c7+mh(;tixASD5L$GkAOZuJife8%$9PzWVR5Mg=A2ls5rkf*kS*9uS&(9c zqs7hHVk}ok?@XpNu|Z0PGo%#8`g0{{Z-#`VNI3(c>-Z(O+fia9rO#Oi(|*>=K&OR_ z*^)I$=*~zr$~Iaq#-+fJpIW9_+lB>0pWDykMT5$~6~Yl*CpFqF7|&dTE)aC<>hR_y zrWvRUjK)Q`P~a+DoDTXFr4couz))#iCFU#X43<>V*dWyfk~%{UQ7VO8uEI3{d5qAZ zoPp4HQT0XGf)VWvF+yu|20~c%MK1GP!HmZUmq{}amQgn8Y$hmFs6kQTOmE>Qb9E0Z zXgS+KF1bPy+^WOpgQ^Y7tcoz}y3Bu(ti@wH^9l)1tSRhgOQlrBhh86Rr|ZkGusE)v zhV9KwmfSMD`j(+V3%V7!M}bd^S?J0Y*!(S$Wm4)E8%rCrk)2SXISXyhbQvnbh!5UO zm!LnC+geH0p|2fuid%KEGz-1oP(#>(wNu}-onnP6XR@|NcI=qe95d8R&J#&Zc#p1- z2mSEGT5~5iFzhAWQlVfM$iWEmxV8-CY2*>RKf-CP(9nb2pc^wvCQq)Z2g+j3w&8{# zh%+%;oapq&^Qa)*3e4 zOSX$mAvP4_BE;&_It|5p%i!CV^VK6%ESSP(C;J_>`E+$ke8H^f21W@;&p%}ea zb&rSVHp@(@0k9DteJ-mwjN^pbVVlRNZ7$qUcg7?aWX%qX)JGZc0L8~ z$V%idPQD7sYz8+2J@{M>^YsG6C_FL14~%E$`2v~d*B93y&y~9u2jQ3ymJQq-!LOW8Um=Ojrh#pFTahh6Rm!}NqcJ#9Rw&^_VTG2OH8Kw+>1iFR(w)HO zK8`-Td?uGF7vUU_-ASVSVSOZ=U<6)k_=p$AR!REVbg`Vp0U5JzB84a$U+7|?o7lXa zgS(4SzmMrT3s$L*dFMcgi5K8f!@-Rf*Tr2QUaVwi8LntitPuwr%)xVzR;*OZ@SK~+ z%1qV=maIfLxjs(rtQU@eGO3d5#*z;PZl7wRh*DmFqu%~|qCO6dJgT``V7Z!A~3h&`XY*nyUM*9>S zxPrJc?7`Q|e)}4nU%*hs)wK3u;Bh?%V;B}hI9rd? zIKap{)kV()mm}OynFoCx*Jb`r;`A2$WWjgyr7T_S<(pj8FZ2?{ZjGHIKXMWS+h96| z?-jhV2R#w#C}_=e6y(F9n&)J(<11VVtwu25P%WRKd-VciC4vEGO_g$qcBzG1qzJ}T zhehxsCEqhmK8cZ|P{-jPJV$3^m7Ax-|i zgjmEL1um(p^+VUu$9X3Sxx6?x)~EXmLM^*c8- zw(w-md&gFxm?P{ zR!ke65@eQ+BFE({#Mn5+1O3|n+i zdgv5L7gc4r_D-eza+doSER}b**3ual1}mUVk}hlfUL+@zD6MghtfHR3zdf$Og+jb= zlqDRAn@aYRLWMf7KzXtJg^OfyCtaGKaWidGQA7eme_uFR@4>w#DeQ+pEke>=kB=uB zqOm6(>`h-}@bFF`lb2AvjtLXo7=rE?<*o-6=3?Nk2Nly!nDAUc z1#{PfN|HOGxa&b>S9lSEF)wK#Qj|?Pbi#7igG%7m%y7LROlt~{H_~U!T@NbE?iq}9 zL@hFtdr8FyOzEx%73|ByGRj>KDvB>CMFcTpEwmE^D|VrG!Lja-V8`XI2Nk`nqK;Ok zSg(eE5^m#7FLo~L$SsL<3lcc&BA~GUqti(9-2suPSt6L|O#|ViO>b}$vLkSfGR3Gj zn4mq34yWh$t_KyPq(x=Jkh!RA?uF&92bD=q%R-j{vYDg&V4{j!jnYeaisOqhe$K)e z?s`yRKJdZ<(TiMoUWs^-m{RO_J*ZH7#jab-#LW~5dVz!Ht_PJ^-xpJw++7bU(q**a z_iLPAlDi&MQsghy@DDS#8ObSFFq9jFcRi@YtSutL%71n4&chkJ*b%S7RQhG+F`BG; z?zifPH7IC|$P$TdGg~Au+Dv=tB-f8aZP+oH#7y7d7Ms{CVKKYk7;hperL^HJ$G+t6 z)NJ3&mWr9u4x3noX93Ik6p&!g_uvrvyv*%tY`mB3Os!C%KMCenP+7o;A_KM0fevs$wt-AGZ)8x3nq}KCYBiV_R720q3En2g9-D-a@Wz2;X~=JqoK!_aElkJ zo;0@C?9efI{jQ^-DSnCWIvR?1*rd6e8Sno_ID@+DXejC+>#n0Av6U=cm64Y+({CE{ z;ue)%+}WBW81Eh~z#z4I8Y<=X^-95Ep2!Gc4}Y|eIak93GK@(%AO}z5BZznZq(;CnVk0=2|0m(XgHK-ruODK@7QAC-)<60i?V_ZH zo5N0Sr$*jK+PyB#^eqP4z7mC1BOrF2Cj!kuNwfs3blZ`TqV4--Cj#CsWh1bi+;+xJ zN5Nh(hHoupS2GdZS{f#fvi6P{(r-hztcJNXay{HRI&AIqxL*KtKMKKI*lBe-G>LWl zy#vBPp#)*<_C~t3N8th78^CW<_*#KQH^$_0y<^pKj_tG$_sN@-bdJzJIvk?FcgST! z6d}`XL=k!i2dJUI4TIB%+Z=FCJ3E2BqW}K$pwIM`uEkTf6_J}#ehTOCx;Ui+FE==M?0)z$|_ z@D$SW;G#4hfz^$YDX`_K;9>RQMIt2`@vhNWDpp3ZUeG zU|a|wTGQo7M!9ofSbF?j?}SB|%S8@*XzdMArv05BgR=CAa3(VpfYJli4$85Wz_5GD zps)`LNPE!GVkddWf|TgAymC4tuN+vZkH~`+%80**dFSt_{8YW$B)dW`^9ZZpBCHC- zPCndVad{b#$QJGu?V6pgI7Q(d#;TbR>{dj9=r*l7L|%vt*$M|qQHVj#(I}%TD$A2- z%@H^!!2s$*g*m+f-x!=ABVfoOECK9X0xZq@Vmfuv)rmGza)*4`3? zlkiQp(M%+oiKXBj7i6{f`tEvScRdVmBsTH67~nUT>-g*j@1|c<8Bfc^Yam^?lq)^~ z{T>IH?@_!J31a_;__$xRyxNq>2;oLKM0~PIUu~4G@DtKE*LIr?k-9|S5Nu^n#>8nt z`~Z~&NVw)b3?U(Wi6>A*t-x{NaSxTiKOuZp2W328s|nE%B7D}g421mG_SBLH;hXDf zLKXO)nzsL-Mc;g6fD z^a=1pyOHm^k$1J!h>rZYcX7S7b}+bswQ_fbyDXE=-bk2{*E}XD_Ua7`4-G8EWiUj@ z$$iFw3uL_0>y!2#A9^@%9U6?}dLT`2g2h0gg}Iv^F65mKr1Xx4y}dp7r~E*x+lWvB zA>BD*Ym*2i57;v!0?EXLAY4qB6-trgRDIA!+0tA+h)x8#y&lGkC|r(cCO(H}ZbvDI zzuoSt2^VotNai-1JYcnAa->i(pGmhmb+xP%`oOIouTCWd^K+G{HxRzxSVVh+<#5Fo zjM%-tnmxinHFFT9hO-l30;G;Sj1`n{9oTKQL_r8R)c}r&Fd4=~SmJvFB2#1BpX@48 z22(S_;TTLbVUdc~DyH>8D^z?S*E@|-2P+<&A>H6BEQ(!05OY`^8q7g-@PAcKl36hi zdk5`?vI?jCaF}RWY&jZ2$@q!gZK8mAH3`>=aV`WIf9YD$EM_z{E>lDklz6PPMTq7P zkx4l;UbYa3Ll7|0zUAzhQvO}+f)VniC6>uG58kt}b`-DFd&n0#Th$^L&Tbc%3gr$D zpN__YxuDR|H%q+38{zA#1~2Yk zAQm{56VcEPO_)|Bih!})&D5jzku8Io`y+@2j!g#9M3O}NOke$Q^mh;%53WVsO#?(Mqf-z@mUBk#frj3Nbn3wc>ot^zY`V6KO!N3>_ z=MWb-v?GUP7_ckt;XbO5?F*}+YW4yWY;1bno4p$br*J<@<$yw{4(r1apEw0Pf@B&@ zya7#(IxywO#ZN$hrfI`?Gxm*+iuD2SfodR5270sytmkg0f0V-BYgbM0V0(A8SF@W< zId9}70hpZ62i+vi!C{k?0Hr87idIw{guGK6Fhih50jThA&!9L5lTyoTVwVysQ}t`S zRLr0OA2bLICit({cY32PZ~p{^W!?53FM{wD+Z(8m@STra;X8iy`c-C+*TBrSpc2)_ zafn7==^xnrzL?O5Y_8P%T?}gmBesrWG3Y5pb>hUOvx}|%fIVOgljQ=PgF1%TxfBTi zhTpq}`n;wQ>rS|8LcNNYp%Er`3Bk|^QR^?)sPh>eiaBNhs|I6Yr*F%Ha}bX7jtMVL zTq>trIiEa(tl2`-qw_v9ZVU@7j!8Heq!|vEEm|TfFbT>` z*B!;PXQuBas$P}s2I#0(iM&zj)n z5QwlaLPORv3^ve=4)h?=)zkd2q;7du#U1 zUYif2Mu1X(MhGYGV-R9-MMA@dX#^o3lTJ|3k_`er(o;-gsOLsYgQ{ln3z*iz4VWhm zMl^ic{sk@)7oCZTFr#-wpa%cpe$5`%yL=EW*5&J}h#v1wtIc~m3#B(Tuv0%cRB(H| zoH=T5pkQLP)#I~d7RX+e;7ae-aw%j~>9_V;=(8bY8#4o5`HY^uD)d;bhPZf9gFet7 zDq(n20(bfl2w^CDRf4bd>xXtFUInN zHVGzQLZZcDAROJTPaI~!u4oo7E@IorsPrqq>gC7WChRhw7fG!s^WciW(zULkpS9; zGEKYRYKGGgW0e(PvdKs=PvPM36gJ?=<_th$LQ+hwyQfW3mx|qjY)`Gus!vd)-4+ zry@84APql?JRmsk_r_pzsJ4+&y-w(6qcd9^y+`8*FeV-y%4a@^MQyOyr-Rm*mX}ET zy+I#BHKnqZk49hq+?hq!uONL&mQRB{#4&1Le_ z2vBO^wrD64(GVcFsmLKKcn$+30HYAIW^UI=xEOdLD9pEl7vx%j1$m~bHP|7i0BU$thrKbjdet(l!nLwg1CU!r85WxnN`;Ne@5{wSH70yK@gQAd`ejs81|c>W z`>ZOb7=Da6N)z^O3+XIu<1C5h$(McYw}m6w_t8Q|9k zyfBTxaQP+jhaKlJoKPK@EwdPO`M~o{EtU@)Eqxxv*pEIK9c-hVl%_K#V!wUR9;W-4O{5NG zfsH}cHZsN*g2ckoz;EvcyL}OSL?U+m%^=!9AGRcPO5y7rUr)I<`8TRpgelt;GD2B5 z+Vb8EL^~9<%?~K1q%uUG*pe6;wKQ@Ef&$!u434i9U>>8%7`q8(X6Wcg`Y4WX;;fsH zD8X{=#@Ln#al@OvX!UNr0XwX*jTop(XHpZM}>M?LPYC*y7`8GVdslF^y{6T0^vOU9$5Yq0bB? zA{r5Cs;Pb8=0Q#CHF($i0RSKq?Pc7OHwH;x_HqQicE+@l-S6P10#!9A$9IDSjK@~Q zcq>*tKn)u%uNwkITQh_5*yL8P+;u>Z1c~IR8!;5Kk;-`XXi3w{#6*ge2@s6fSgx4& zB*^Gn;hU(WBD*Gm$p=HxYKlYTo)ddR#RZKo0F0Q@yJP{B=$<6QHA3aEVDa<73wSz)*kN0RW{K9;T`Qwr{EQa1oZ_DUQ%&c!G7fkpP&1 zcMh1I3|riJO;WG(#DSd>sA@-sV46T;B$EexaRH>xBI-H}uGE`NjBF-hv3{ckB*Asa z2T(y(srLu5fv{p9730)mY5K%E6gV)Xu<2`%I9#=D3uIN83y>xy1PqnOm)Oanqn3T9!k@1UeydXGMupp6haV-!x zVFQ&j+=bd+vmBfL`aXq;Hn41%ad5=x*jsc{$=$|w6XWXdQ`MX^(Awu|^s z$W*hW7uZ}`cKH+{8YXoVV?u{%Gw6tygV~sC5Q6TOaRoaS@;= za+O?z4eMK}b~lvsyjOt}3o`qpsSqr(z`G^uphN5+ge_c+jw2x%C8+&l=07$pS~(D; zOfRW8xR&XXPD`+Q3K9U_RP1Q)Vjo@OJ364wXp2YBRJh=DQB;}2JXJQsKX9xqb#7)0p-Er zih|3Eo|XLMf;92Qm8XdpDb{!dwRFc|sD*5zM2gfzD0itI*lsN=2{Sw_c{3zh0fXyG z`3~;5u)qn!*58&Icln;hO8)cQCuoQ%}i?e>Q^ zr_?V;8qY{tznF-@ZGr4zIWnQy2DV1_U?rqEkzbB&Ura=ygFI7)Z`Ou&|86(K+WHd~EAl_;iCTr7qD#$a*=n#LVM6_wvF$?BY z94tPk;!LfFA>WCg+MPJwNj9byu=GC4v*qp9M-VGRZqI`vxPa7r6CDJJvZ?@AFk6|aNa8V_rI!bovoK^!VX-X(%@|xNnbP+;cZF=0SYUB_G8z!Dyq<~!CuCD`#DaA~Q^7#H zJh(oY5v>4ghjgwqff2Q0ULJ%#nIXp$+g-DuVj!CZ?XWY#oyh5#4$~?qSb|s#_dYBa zhGKmftRL6(^&=c_udlCPxUjLdvC2cJQA2H?p2H-rT;KlKya^4g;j3NGvOWzjo%2W7JIX^xl zzdGAbHIDetw#pU+``28n=gP-g(j^FEEW?ApVL!WW&^!pLE zCU6)c{*2?d1H9%Ges2POcSe3c1-zf1!Y=`S|1)s@wZJ;A;YhW0KrJ z`V2hE$1o1hkT17@_shV0%lB|@lrI*qf%hrEOThVafj23AJFnop%` zP2l|_;JtT?HwEwY!21kv{y^YOl0#ny&VLbj9oDgIiBDTQ}*cA(8O@@Z5tMpF=A;gMvJ>Xj!Krsn1ZyLq(r?z_RYYfbfK6y)KF0?+5&&zJjS%ln&LO5q#y7RTmcSdKgpTGPk7Cv_}_dT_ECv)y8 zci~Rv{8R4PJDCR_f66`g_?^$c?{7a#f`~fPdFxq1riMcw`9D?c8S75^!G${{D1$^lb=2NwS36ThtMFIX#A7f1AMwn_AbRbq#+X zXD}MxsfC@leiVOsD-26^C8ZSeQtFXgG>8nKX2}bCFoLC|MjIL@YKb!)GAd?BI}|1g z>&}PI-ueDJ$k9K4D)SAV!_j?DWu9X{pKP7A?)>>z-}3zEuTk#L-#YjFrEj2Yo_ua@ z`0hKIvrqoJ`T5n4A#K+4nX`93zw)L3IC}2RKfm)EjP|L_UqAWW^P|r_`CHF_b^cD~ zuUQfOE#OkqKTksslK|(f0)EkgVUZONHPQ1Tc`spIzjNi8E7c^=zfsu`vQsPjfTjO9 zm3^I2gq3|8@4T{~#4oL~mzEMsL1p6weQJiv)~(gW)%kr|owvV9f|zO?wg1%zXQ}d) zFWve4F{(U|jPZ)5HXl^q^gvm~5DqoEe|9?`=78qxhGMfb%! ze{hFOC~9E;>Q3?OC(=J_%F!AVr0?UB6rGc1IlSe)IY`DMK{77i89vCR1cs1vcYX^Z zlD|IwzGq4Ny$uiV*0hk|;~CX9edgKp#Ik6%i$ULi@GN-T*Zu+(C-|IYnR@(Ll9(Ye zO+D!|&;PT21plA0lC-b;P`i20?I*40pQq5|9xiTSLPesGL)1+bg3iw^2_E5p>V^uY zOu+fAFi`wb7af#}`MG~7LSFkTKbr~BY0gR?!XaK3n>Os=e@4Y1B(V1bh`J3z)bn%i z#$QV7e|zpr|8F?OaRH&vf^|V~rgp(U1X1~%26&#&8}RGizk7hB5J&oS`G1(%F)C#f zfvRqPj>d3_dm31nSttvnGYp6R(&s1syKkbIN^H52btc03EO2$sXCj=btiP+ zegp%P%;{$Z)qS9vmm6}df?m$3)H1v;k{%LQ^Kt?S2D5wmMW5G+ALk>SX%?Y#J|E#s3yJx; z3;0W)?=A2CZz1P*3(l{OaHe5c=ltpj=LZ;$oPPfPNB{k`kaJFOejvh`kt@s~bxzw&qgciv~{?H>v%-jCF+r8gjSeoo3u!VN$FN>DKzt$$Go z>-li_&HrOiJrs2+^u{mqO@<~=e04NTPqvh~~I2jL)v%68ma z7*z^?>2vyj_zw^dlIqXJ55m#&^;SUU=V(GeW8~Za`%ft{>TLwV=dF=^y$#U$xicM?+j(5d$oLLMrAqa;M_S!G z84mU6IXsnr|FBX!yMpsOBb?tA;rvdRWS{#(jYp`E}H7!dkSM?_- zOZo0mpr@_EaAM8$bO}Z$Sha>+`LYF@9!5%{IwU?q#%O@FU|B6JOb7glA_O~#Hc+zF zE-67>T-uA>+NwFpS|aTyJ-d*1Y`2^Y*P8!7dtU+{Rdx1#hZ(|124~PwVnrDs3J5|% z2oQrZ*(M7~NLYd?OJqp|WHSqB6}L!bn5M1PT50S1*4DT0*V^@M3wBWnu`FsW+C|Vx zS1T6nE3Z~jY4iR6=bStD+?jimD7Ajy@An>ejysv`4tar^0jDc_Xlz7?9P>e`CA)!<}>CKsVe4xr31al9;jqwL5gN|jgUw`6XR zM}H>;udb=6tDaMa5Xc!1F;tU+D@<8QbZ&J;SygRuod#lr_ALT@vO*&1<%ZuoyzZKo7xp}z~&lTN(SkbLR-OTEOMjw3eokNc|SUc#(VMX^ze80%7 zHx*W_=xP-io!L1*0ob zv*Mo)OiaTuyh!`^x1#YV7~cBftZ3-^=cl!*@iJqEG0TA)yX-Rm@UNM5IXD<%B!L{S z*nuRc;fQF6fw{=i>`)!&6pqm~@mkEBPRECl{4laX&MS64HgZufd;ErcZ){rD!vPzc zUpe!@4tW^e2IK-^W7%W(Kf{=TCrPC!%%e0OV~`M=u44AIzP_vMWS#V6+nx?z-ZKY# z5@jb73r`&s3mVLf8Jv1c0S=C)BF73Or1wc~VvdB8almaD%!M>&WUzzuK~8S4cCj11 z9$?Y(dRS5^&$s^LG4%3G$yD}7RT5EYEaQ;e=%TL(6Kn6Nd(*m1^u^6D#t)60rl2jK z4`EXMVm#XYa+|ndYSY)I&rQ<0!7;&=u};oS+%BkGWVra!kaRIr*s-#wjG&S#!I}%L z=9EZ!{IG1;Wpsa_ACN}cSudi!vZQ({rT>C3df@p3fCsS@x$a71aNg$>? za6%_i2WdzO@q({Ir_8Xcm?iroN{`I!tC$*Qxw*OdGle7jBeRT8K*MY)s>J_LX_ML? zVOeiy^{pF+{>TA*-;#n8{Sj^GM;24@qsEYKq6RcJQrcaXS84%mQCQ|Cw|>E`z}%_f z*zTtCs|5WQfccZcF@FhuDe^IYFEOiI*lCP$lMAA9fn2c%f)5 z1Hk10ckKXhY?B`t0FLeUubglW{j}r2y{oWp@xorhVD>pQBjUw@--W;RC78R#>W;o7cFGw>^@mzrKQ=D)P@~sB$I)!zU?_uz}4Vc-?I56z}ILXI+KYTb5 zmT{7g<#)~iaBR8i2Y_R}vB?RSQg8eexGw{DH8U~{%avQYEy7Im)tqgHaf=t`=WBtv zQQ=rWxbgcmFkkA2AH(}~U=AuA`#^5|P5|Rk-6uEsW`aHwm=c9!pTUjaXMp)iKm3M( z{+qyjU&Fcadjy!LG+fl7-X*`o!2DLjx$%1$n71{Y6F;Vh7n$=+W>A>E(qjxTQx(oF z{w@WNS-`AOxMX^y)Vq1W-KjA2mqz4!hw}CqaKBVoH-C?S{wOfJS>R!qwcX-nIff_K za)<)s#*d$Gz~e53>nmQq3d}BrbK}Rwfjz)Hui@O}dl8twX*j2JBfnl?KEeVCLx0`) zWdk!!!#VN067*L9bC1HY$1eD#q#NtW0}2DHFmCDQL8U(&KN`1qVfH*9m?;X^S3H*h zGe3nNx?ap;C-7sp`lb(WgfDg|oX+rG=q$1qE%X$jq&T%dJ;jF*Vxxyq%W8^Eg!vR! z@n8YRI3Fum7*HMKbH6W}e}ug^UvzBpN#C2#m|UIwCehYACIFW8i1Yy@LwI=sY+<37 z$?5$JF}{~>TtZ_~Wf+m9?c$_uB5W+E8A6jvQcTCYv~gLB)p>>yO}Y&=#*U3}%)u>; znCTsV(W(iPBDj5Ill9hu)4kR~zX*Fwu=C7x7nJ5m!8)TXLifx6c}Dhw*)5jF!(#Rg*JbvN*Bq|)tB-=Vfd^tW?1IT29T8LXxO#|V3 zOR8K!k%Om9pnTY5;uga;S$r)|ew~~Ax-e;50vi)O!&r&ucwwW=lHbOp4T+3t^ho>a zW|7!!kuA-w&5^c_l`C-`cT2}QY_uR`#m3flX`R1uy$#y3e9gL!*5m|h>x*E6dQJE7GjDlkN&Dbi-kH+j z?JDvV?HGRhGaaw=5U46IT7@aVbBNJ-W47N|^eA0!9HJ)IsF#xved?~jtqD&e>T7_W zo6dQYC%Pj<&IwQNrf{Mnkf;kKx+m_fn^)gpWd|q^f_=zXcH;;t{a7E&NxgtMo7cmx zg)DaL+sc%&it&87mExCST$%j34z?oUc5TvaOVV~r(l$w^LsR?eHEm7M))rCAgj{^l zrPFfSmPX9zo@6GqEZ!v4TEP~II^xOxN`@$CSKwXEAwp-+3Z}iXb1!ar&!ep6 z_2#`sr~Bz$!uK7-vG=+#bayKPo|=;rANSOp@;(Gyo1!G z^Dj!ESbW6~S>c$K_e|m2md0^BAI?Vna*-3nex0wdnT!u(ZzVpA-Jkd{*3a=_5%J8% z^QH^uclqu~WX0$B`3Ue4N*GWzk5`0m{L|upP791l_u=qNrauQijre5XL#VUM zuTzpZ21mMGmb68awph}}be1^gIcZ~Qm$t32MexfIyB=gt*nxN1^nVIA>GoOJBn78O zrH$oB+P(^#Z2BLBO;T7nW*6LKF8XouD=Y?wp)@`tz-CRYr9ZZgb zZQ)>MqZ`layogTt62S8qt+G-P*(u@M-g%YZ5N&p<&uj&x+c`-a<6OFphK;?Bu;El2 z;Db=w+u4p$mRV&TLtv~2>yJ9#X*b2zEgw^22vz~KWO46 z=93spKYNz-)Y;mxz_vHH4tnb-cDHD(*%HfmV5;1VpVVlV`3m(%jW~)Vf`g;3Np=H9 zM;4$VikJ=2q=-1*OFPM4wyb(V%>@k1mF=NqMPg8raqCHyCzMvv_`;YLc zsptL({;cio&1VXW(2Mj{D2OMQ)vi<@312P-d;v5ZYNveL%hooq4qlx|kradpy- zSw((rOWJNr+E`D>uWVUlI^7GKOedCl`SszX?Mc|AzrTWwK^0MG9Dz-mAtG^Z$BU{7 zuw>}zK^_v3pSLF}GYSi2STw1GN+!%Kx{2c@$)tUF=XHKhM`prEL<8u459P#DQ%G+ke|tn(KY*=-7R-bjK@BEfZ?pUj((>O(i4zLcGfeXM?a4zp!ZT zr5lP(*}Qpk=b4SKS{I67aCP+t787pZ*s!rZvS}l_=WUUVEs^#u8`U1@E5VFrkm?mP zmE}&e-c6@uO(N2#vF8kYksfjmmwgJEIPxi{4B#lL$@jZB%M5Qf?@#l5s$z26Qt!JK zKcBMF7rV|Izj!^Y_?Su08uZ2+R(Kd@8mU#TFEk8>t9_BqCl=}S#TWAQdMfc`JM!Ce zFL~YKoCg;g4!R+aHg&^_-RlueCu}>8{r5X^s*mUrK46H!qM=6Rhl|(4EJE|_e?*sB zR7<3zm<9lqwoJox_2RIFRMT{IQ`_}z(p6w=ez7L^dRT$d{Nqd4%(DFYhIAC#lrju2 zDi`)h>@u^#_j=fOrTO)J&msew;r^R+6rBQ4X;Y1iOMA>`q{TejVW~5D7HqGMYr4gX z`5mGz!shO@m}lO$bcug?;-ODl^4zPah_QzvD5%WN%Uy3?a*suISWyvUr(%2I^_aOJ zG5C%>7S$jX3B=f`*t4i4 zqTrgL=u{P+(oWYx!8Xe(%V&LR{7sfTpH@`F*h9f)N7iGo7_IM=XIoUq6%{ddDmF4+ zkJ&R`{O|2=T2$N_O+$>Gij9)jW7f1kKiT?>MOCG!hyj(hNJU?~o}c2$*!;xgJ^yXR z#%~qXC?f(Yn%Chn9)DH+qvgy9T3Mz( zTYQy|D?rvvf_ME z8t04CIA4^;d7Qwo)nFWSUA+i@XrqZK&Ps<|i)Y5ZJvPRrah@PBCgYS$ALc+v`_Y^1QA%=cI)+H;r>n z8fTVJuSeE+(7ONR+lMU9qRWHtQ^DCTGs9?)!>MVUrwI&eArF3&9=J}cpU-8-2WDCt z=X|)@IZsRDJY8T+&K0+;(_$lAah{&Wc}5!N>1mu%v@nodN8p_M9*qEU>&lH?- zY#lYkfua%dqvZs)6jpmN=E>*gTREXh@gc?@tL&TE!#*=j!a{*ztIAqyLr?iDmV}>F zoC~FdX=-?Su0w|`#jir)*S~`Y_f0G)o4>$3CNH_mKxlw2rysW&qw6e4;Iy<|hRQ&R_iF`Oz;ul+mN7d|{ z+4<(mknKa%^r*NpT3!^3RmDn*HGb)fM6>fvL6W*=O2f@mp0A76#j0aPwN)h+qwLb! z*&o6$nv7Pl5N3w8q%>MyUR@WfDz33a%*QIr?0hV<;DJRoY?|Og%j|q>r6n0x)zOkz zNp)qV9#digX7)5Qa#UoLmPU&!%ID0fn_I5=#1)zpU(7`saL7+4P}0NF;^^Fp^0`&T zMY_PJk=W(YvYPU$Ii=;5npkFHn~OSHQa4|>a$UzNo~nn_x;Nm)&t$}6RmhCi;__(i z+&VC=f|ST`VtK+^;YbEcWJs}5#Ehk?Xso)Zvb>_MNE2svcB~rE*z5u}=qTN+6rNmGI21=YeSQlWTu zK4(o)lGh+kc;P}vJGk2}9CW;e(0);&{mwrTU`xx`l&mURQCwFxx3)&lxnfER`?+ko z%Cqyuq*Ssv$m9}iP2J=vxj8o7-TpLs^9rVFXGWeYG01s#`hG4I2tF-LE;{A!f72!(sE+pVc>qI zupYcSX$qCW{n-?LLOut6BjNcZ3IOBAFB2c8D~v>{@H+4-LRX_+by?i_b%DuZV2)`x zAzw;7-woXV0P}HFV8&>;sDlO{JB*WnS*79J_-z2@ zCJpDrkAtP{zhcuiU zzrDabqv06d$o~@>UdhWpPDjIwiXNdhE;z3Bt!CU(CF2+^T)^4WF(~Tv;jP2x?}_#d z11gALhFCofz$RDxIF`*YI3kp8=!n-DMX~uDrOC>Kf0-$0nD#@A9d#MEyfdid+^*`1 zPzw$R^R(btuHf!H!ChzIG_YIV@pX*qs@@*L7cUO*8e|^eB~S9g+wor`2xM2rhh{j) z;BjLWnLFwRHw1TW8ruDPf96xLoMBr0rX?fzZG8Bj;J2|D?>*2}eP&3=B;|o5l&K}N z8)EHT*0Uozc$TkYY??&C3F-LgewnLGv;4trx8N_JLv{uq*z3oq#A|rVSd@5YXC`ff zGv5h5@Rq;(&wlytOL_OEybnrw_t@Xn>rU{?d@b{x#IsFYqvT0+%S0rxf}`;meqrMr zpHx)|?kXSJ*?h`COl`>&U~`}A9Tc=}Fo_v^=plmvJ8;BYGfz58}f-23#&;O@i0-A^R;i@b*8 zh$bHBcnF~5Ua(!f>|oDkh{Uur&$SYMVh#3S50ayN7#?#2R(e3M1-a#LqGu;gsu1 zm>Bcp07D-R=#qlQGq8w(l$$KK~IO9<8zA@WW)?#=DHTBTTFoHQ!#BbxW zCQZ=MAmmSqJOMTupIVh;CEqt&!IHey`l6jXXKy(dE4O=E{*W(?=?~{-(KzTp455tTnS{OS~Lw-%+T@ zWWif2z1RZLc#RBE4|3AvU%a5G^*z|0%A<(biOP!Xe8!rNF}qb>BZ3^DFU9eT+_wpf z@!*;N`D3e6=YjwYG1yCq9zX8Y6E0}EQ~0o#WAVA=zgn)e_%N|(h_O#Iu`6YtW=h{# z%5Id`W3~u0$E|Fz!c~WFG~DfJpIT)q**UxI$uz6c{F7(jVR3F2d^w??%2_TbhVb2! z#4u#~q%9jyuZKNGVk%mXowU$c9}y-~a@JCi4XxL6H=gA8_SwH4Z&BSNXxJE2o+jQ! zv%X`UbYxlxmsM+6;lha2(Kxe__j(vxlxM-UH?&)vzXcZ>E-~6uhs%fdI80wuW7om! zVeLZBYY*Lt`B>U$kO74Wrg3KM**OPAnDsd1^s?8(3WkO2XTh6pusHt(E;Pf_IG+Vq zJLlnPoX-}R96s^;$MC*Z_y%!HpXrFJ{N}c_rGAh%$BGO6#3y+nCAq_P=5%d5o+(cJSc|GIg4Cc%9gpY2?Man}0>FpMc-%UON+QL0T$_}qYZHDy zHT%yJW<-r>+78=le9J~g-Neia!`fJkb2QZm)17~HBX+QA^#H#y2=^*pCf04-v=g|m zDJWzzBPd+Bk2xaF8{$=I+Ck+!rM$llKu!mh%Y$>}5yJsXrx|^A(WP7K z$EUR+*{j3ufc?ffKU+Lxf7JKl!q1@6yJnDnOz&L=Ql#FZjjlVGTsv9rZ7@S;@huqp=P#9VZ>|WZOwoBA$GR)>Nyp z*u!x{I5{aRwNo|AKEPP*l(H;(M@RRtwTZ7Q* zG$(#O+&j%oq3~{P;lBa*ErsPDwuJ~K3&sij9>woNItNO>{r9w5ki3HhIK+ALSx^D? zdAoyIq0a75AzWJjDrz*w7L8e>vCO>R8jUGwH|aGRQ_*hpx``aT9#f{~@BjH4t6W(% zT54S&Yc#!F$q^^};4Bz5T$@E#xTU#$pXy)f!k)OW@&+b&g zaLUg=VfCaNhx~j1-ycoEIpt@L*zZ8H+|Q(eVLlc4S*z3OUW?y@!0;|F8pevirSwtx zd9<20Cypi>LLb!uH(`Ld+yUYWoNx}|C<5+N3fosWc02KN2*;xX#O)s-?&kxrqb#Pw_+&BB-cPVhYfiX|zar1XPaDN5vTvdU) z;n;@lj1NU8p zP3F@S+*;s{0ArrulfE!`N7iJXqoj9Yl83=o$$K-`Q0;tHK`4)HP@xVZ|;^5GOO55v6?m~%P3 z2E*_>m0wKb8CNI_aWqai_G|yk3Fjc+pMZNqVcp~-zkdvnUk=*8C>vZDH-2nqsuV^5 z@etu~kZ&GvEBfJgDd^V?kl#+=zLvsI>(`;T{$ZW|!G7IopZjr0#9_-1+7cQJ-7?bd1$0`HbwdVfYC~S;v4&`7jKDS8x{m%EI z;;*qx{mqI>$)!-_d}NQX3z>c+DvTq?j{ZI=+uo#1e>wX2krb(x_Hb2cB7Pa-NZ*Tu zjoEmNuto74C2V-$#F8>-c)!)}<3wPspvxRhl&R0S&EXk&HR{REVJJOM| zz|tPh7*D~^T>WGimcD^cB9eK_OJ3OL{bC%e3}1n&8ed=A6W|TLft1vjV(JR zc^n2cC4r}bgFT}m=5$k3kr$Spf_!fs>OMB=qTb${AH~WmSRXEvlRc7i-(=1dBXy4u z6iv{j;-m-%DVSJ~GQnp%^Rx?3>FZx$too0rJpY^ZCmThaGjIP!WL;$K$B+I6*+gcf zrHDbK03$c)0=p?4tOv!0#{v;YT$ruJPv+}6!WP4`LfF{(lA(YF<|>iHfBx{VWZv1+ z#GKvvr`I}PsS8fPDY-}Rt2aeGvLrk7dN3rNv*1dID!KZnk?K>a5Ya{zQJ_97b^b;b7z8 z;J#;Idm`9)AlUeHaLL}__(K4QI1V;G5!|=O2sU;HuiVR*@lWHEi16UPgK&R5xTHJj zGX8hL@j&&+Pat`$ht1wq_+=Q(0_^0;qkBFoZ1eEs!hMEu!GF)3?ip5B5Z~^f_2Abp zxdM*38_jMO;B|;$%AWL<(l_oALHUL7dCB7@MuZIVG#(0GX*p6r(i{qENYim|@XBr> zH5=v(p*eG{u#LxagRotW=QYAc`5CJjhG*EJ8Ot+wT?X0l`4;9Akylp1qMK&C$m`&k zd#(yjs8+eB9vQ&LoH8DnX}p$~!U#-hb{MWB3BlhSMhY3z^=s?^7-7?2cNJwvnirc`=zxZ z7Hco-{;JM@bfSeZC%q;Jnxry=MkObw%>;V4c^sO03dNmZ5mCsYfj zUyaHyV(e7JTM`~Tvi}W>iZu=mG4|Lv11?^V85`RRj~%sQgBgj23J-R_FrL@^`u3=& z_gQ}3BWQT!wD3y{SEh~Xh31@hEUIrQDq`$@aeQor>zcopEVroOtuVycso11gRJT0& z+?OpX1W_1b>{MsM#iDxpXx1@{>P<-`j&}f+mRC9Ik^8Pau-);KSN>te;hA)TkqQq@ zSpMFStQ{isUE{+(u-C)B0?idKjk?R?bAjR$GE%9A18XUA%p5wT+@hMKsH9Q^xki-> z22&}%v&2~UsP$GodY{FoT2b-FFT2c~w()w#<4MR(%RcdEi)yi=Qi>B=NW+4Pw1hnN z)xY;zRBIF!_g&lllByJ}rwGYC`-!J5s_PV$Ql-%RIu}^4hdl+B;eVWHLe-+c#vRJS zo!Ib8%d719SUKVTk6es~*DQngC@Ny?R9pbFsM(?wQbD@A3I~7Mp7S)`4>YlTx z_9?%JvBw7MMz4pZjrG{oUtRE`6|SR-ihHx|RGb|5de{>p)&7ac(Kact@v5?%FR8TH zV7+K9%{`oZ?64)_yNZe!d$=yJQLP>Q+(L^gQ$;2*cB%_)R2gO6_gYlvD=K2_RHJNE zxu5&g?<}f`ii#LeX%h$$LB(=s#=-e%i*=&~2FWkJeEQ=}yDW5};ygMn#>NOL#xc#s zcmE!hsRA43Ne9H(L&3>hE1omIz2sess!@>>W2eftQ6=_${CbOOjiMsPPQ`AQ<=5sP zyx3(?U9YH!u~S`aqq_Xk7Q}`E8*ybJ22@%+j}ugSJg4tVXC318Jd7t}&1?9dvf|l1 z<$*VTfwNY+CkQID{lD{p-7_t!uPJ%d{%wuw5{o8*BMRM6}KKo`(O)cx%JKC@q zY`L%50B2l^wJtg>H+TBf={ZT0bkA9lw<779lViE(H*3zCd+toTySa8(vXR$6NY8Sb zU6{_Cu2Wn1Jl#3zSzb$v?w96nlMU{s5JjTpPrjC{TMot9eri2cl0EmLcg;mOrv8X+*< z^IBHruUNG*87R|zT26k;N-d<8FHBi^FNTn4{+bPVlaZV^J#S`nOD=;VB0aAlKPP8Z zPHysjWzI~Pg5-Pi)a5WMEapfti`$G>QY+tDWQrxZt3X-YMN(+8 zTam9hiWt}48Rgomh;!{-MEW$W4o{mZ^&I50KW&E@c{A0eWLzD-M63?ipg)Omf-p|2 z!w+PrkLDkT)!`@c?LSj+Vs%*4w;{RNK$)!g*X@prHjX(o6Xo3>ym?P^V^xv>?#Bvy z2Ht_&qgUC4^Yb~V%SNjDjMa_X?Eb~TOxJKxhgBo;ivm-w;oSJu1G8MiIq|CoziWWm zt#FJ=!B6WH!O38=`ntmKoyKVuintMs49y6f*1Yf&8<#@h<|r)V#YsLku?vB@LE$)D zc9U;m*3I8(pnm|E!wSdx!7Y8oT&C%1AO2=zbUqC~8aICz{PhE{Owj4 z!4MA-UafOS_geg31TJqF-()@K7LLUVBa!a>ZU*jW1K{_!0r0y4o}Gu;hP&~j8H}Hs zeESqe0P%1NFQ*{>0^HjQ>sCHkZww*f`>62AAi> zt`W8fo-2fnO~X848;|EEVVi{KW?}1P&X8y4vYC-hx@uhcMHo)q@a$Z^h_iFup`5dj zXJqCbEbQ(GttO4!G|4kRd$?~n+@{X@f2pBs(~z}+`p!R}lso9KcX+=LVZXdAleu0ta1adon5nX z4NjSe@IKhca`YZ2Yna^2YCCXZzd8kjCxdQUj$ZPr$>1eV4(DHHeHu0yLyWvV1<+jV zI8%hv++WzUHo)s9ll!5?`JjyR46*N7hJj6;l-!as@3Pv3)zxkiuyE0sIfywz#x?d( zrbqzYa(}$SFMMVk={_s}czz> zp(}vBFW-D3Y^6Xs_=Xgp_MUtz(tS&f%cviR-wsh>72ejQc+07uD*VD)cFONl0Jgw1 zW^h@Q9fQm5(&r&^k;a}LCTs7sE)tqiFXU-}gB}gz@Xo3=L!1CTA2waG>3vGZ>_THE zJ1Y-$A3>tbk2B{ByW3|aI>Ln~+Vde7O8JoZnekfR@o8N(C+mAVLQp8M$%uPT;~7}m zhmr#JL?0h!s}rzgoB2u#I|H^R{KDd#{$;Rbh`MXEaI?zE4A%fqOQ9ZOBEhC6YCOh?Tj7vV(HLvFZM5`h#nC@s_vvGs0_bCbuyT~+bH$TXA%O`~|`a?gFm{M4?syfOV zYzvHSwZSK-*iWF@cGrrZN*kZ&E33d@R@EACvuoh>aL9dz!dQP;GH8gA6~*PSad@ft zXdPy@=w1&y6-JmPqAFjEuuW$|apo z0ADOVw~p8b0!ah)Y(+(kJ*2|~6;s8OU2f^or%PA_y`GEt#P8f+-To~Lou$amObZuF zg(c7Wm$qVXYRY4-3KC-%5;^6|rz6bezY{;FcA57_+l|^mB*5a96R7;-K zH+(`{qqtd75o4E!D};7=(zkB2V)A;}JE1(=dp>uWB@Z_a(WtdVO`db$YRU8Id!A27 zdZM3ERK(cjIag5W=@m|kAGva9%5(cC#@u7cW3GCQFe2ov$-}a5$usARk33_^GfE{K zF?M;*OOt0rnmlry@FF7d`{;;Ip>9zDG_F*f9}KprfFuh>^bUQ7-Ae zlY^xpV)y-!qRLM5UF5f9z52+l7ozvAlE8RLQ4u5EA`F-?5xD5JpQ!gdH{jb~{J!Y_ z!IM_lrz)z8(|l+5+KTyK4*x33py_+1q9Vrb*LXoCYekIC7nPxD@xYDdRz;;&AhnV^ z0bgbPOx*V?K7Pvb>+_0=7<;+6L{RB9$#@aMXF$|%1SGX7R;T810UCbkLG{_B-ga9wmE4VKTBG-G~txS zw&r&8c!`oS9Jz_}GHa?!qRF0K&eYj?`sf`eykhu{^AcO5V$r3nwY3R-xHT=;Yiz12 zYHDJ0=2UBJa%bmpfImB5jqqpZ^AJdm@xezE+T44p&TxcGRduChI3=_~W0nVI7_0Zo z4Et0o(W`95eU9_jYVys6c%|iK$zXCcK0ub@WC{nC#dE7lYH+DlxJKhv9h*~BT2ob}ahuT>HyLh-CK>5D ztFA*iTJcd@SvIE}9%$TW_Rl@ZNawzA!_}sz7XRA17)nA_na01MfBqUP-G|DyWUwqB zO6S(aYU;Ge&duq|1FfKyZD?=39;G+N^<|S`d9}H*hCMr)gQygG8tzmLpyb+i`C>#f`PILGiKA24vtip&ncdZejBZocW z9zcPR54X8_PQNy&#)VB()L~7OU7f3dxk=#|bRnO^n&Vx-e7PTf9BzLDnCCQ{;HPy} z05Q-nH2wsPd6`7g-xM4h;7gIN3)r&5FdR<&vf;iAnA`fnT?E`Gfcb6;PFu71DIj(?w$FiQrR)=q+N{2OF~{vzOd|z&E*4F+|wH;z>8$ zXUgO9j=_NkhK@`u$sV~DXIieNL+3t!!+h~6aT2GwU@|Ja_V40La)u7`Q4>4&oowhT z_j7_hD?Uo#F`tAfs?0@_y0P*2v-`==z+I$0e*ERIAuKkCaj+t1GZG!v+g9hl*iiIi4JjhQ;;?4yLiBkW-K|HFs+6jAEmN4cx*FYv3+tvG~_(ctv?- z*GtalHZ1DebTV;;3`B#RT7$$m+m9Sa;}^z1(Kry%4*?iIvvw9t&{bi?Erg}RlhVnUdP;7f+w_0xU ztG5UONdgm%DOa*)_f?^B=plp>5@F`BBb3UV<2}hdx^mwlUaS+NACNcHLBpahQ>ND=Pv1hrzzo=(p3kSIuZJ}T&B+_DFSYobl#VEBrrQW6 zoiLPHA6v72v5&3OZ<%APcs=HP(o;w0)m!nCr#N$tQ09y|u6|KkyI*dzhRg+I^TMaU zR&4pTRB=`Z?`Vw`{QK^F(HNVajRIFqO>3t{fn-QOz z097TA0jJNUhO^XaZMU&jzqbj#ra(a?n|PJr3`aT9LFg z@mzgPHf>~T4JpOJLu-=V)9Pq#O;Jr%c{K(`$(BH!bqL=CTXF1>*`J*mtF5f7s+fZV z6IF9zp+)Oq9bUKyqgpYNu>z-tqMG26#vGzbq&k8LvBrxWmakj1rhPRII&4{UwH7)= z-Mr>&JJz%|uaY+-(5n=r5Wlo}MaR`ZL!7quvg_Jg#fgfF6A3nA6f-~7&$RE3{v}0J z@H8$%r{qmly>s-dVEWT=%+Jl!G#oDwz4_-+qReVmZvv20MKS-PRhQGru{V!-AmiUt zaBjW%YfvwCvTlT7wdK^CXV2qNg&~f{t+#vxxR(`{#VhL2`_6_tFTWZ=4`GON<2M?Z zTn*>MkG-HmVDvi)-1zZMf@}KW$Eo8EV9aZo`jYQn;QmiP{5Wm)U%+&0I5+v80OolO z=M-M@dl8s7G@Kj1e*kkP+Zq_R^!OvbWdZZ9!m%&P_#;^sLyA`f4`Th?u z`rQgqhkXBe@Z;SIOV~q&VG$MbrNqk?xZe)Uy9(D=IH)Z-LG^0f!m$bbcy`cN6s|9R z-N2aV0-5|!l~L3a_&to@%^%_@@q->6vP&;Vhf!f;j;j(j77BK><>;_h*f{hl6E>a! z*E!R(Hm9+}yY{+9=xucW&ev7y_xIql!3vay5lX{!zyPZ#y8&ZAU*4O?!)rqr++Y`e zL%c{HUw}~-HON>M$zdGnSOBH*3088Twl)O1V{}iHXU8)@8Q+rK!@9wuWEH6!zN-`A zaicmE9x~NHwZ(5VE)%*99Ih~c@^}*d^%x%EEh7oyr>ho?!3RmgDoQt_@#07_9v_@Z zSUaeZV;F<)uCiCuph^Ul2dKWXcD$5&?fAUj#9=jtPIUM?AIsj)Om6HiVa7E&ukdtC zS?eK1g`!Y@J0AfO0V*brzF#JojMZ6uS67LE~FNdi(mgHn-*{M)rg}?RpN$NyTBS!fL z#la^t;d$6#EK!drEH?Pd)VmDte*7|wB0Q%H8}p&WEru-*zcBKSJX|n5)N>!>8n0Hxh`I>c59$B-2ca4{{sh-XF36rgP0^W;`%LDd_KqX?? zdA-NI38NhO_ifX0Kc)p(Q!*4`F%iHdl!;3ljX5n)2>TFY{=$Yui5qcw!hXSat*@&o zwDkBHiHx{c`jdy7*iVek>+JE>bo@^O9xPq_GTE>INpF}-WxzNHu{>m3K;todLV_sl z$nf+oVBWxiV?z?9cZ5*>275OJ5(WbEmii_x53vGs5vVQRj6Rw{hP=+1Re;K=A^5P> zZ+cJ`=mP&l4ni>$lOLmVMsM;RZ<(K1=8rEunP>>a7oI9y7}|1nq9z}u}}9rq;;ptj0DbiLVm1H}9YRMpN+6a^CXe(#~e5eVxdpZ5?>_C21J;N`p++V5!} zmIy+rGcnf}uL#65gbtNR$|h0AN%0y0l@mYLCWRvT7CvCSssdu|D{HS%C#G;Wuk5_S zXkRA8U8KaNU=+FQ#?DY;NXPk*U_|1~M1#-!bYY#pBa^b!`aBhZ<0CB@ha&-mJ7k2o z{`in4=z1*^a>}|`%E^e6aAzUtN}I4}4d^x}BdSFqDYLOYrsfx~ z$853oX<$w6q(%2YdG!ipDVhuBeESeDY0C)A(=_-EEeyL{SkV`K++< zp*QB-my%HH;Ij;QJ*+cGo9KN6v?lqz%5pl_X|UmA8tv*u7SmJ9NZC%Ije}!La}3M^DVN`20grsS_VG3E7dgOPH>K#SVto!?0=gCee*2!@vt=N=Go{RF!ugxltugf}5D>|$?@43KB<4?# zXr{lJ#Jm}~3QxU&v&2kd*$~5sBFoY^%_ROwWnPKE(?u`fr4*doOyZAGK7PS60>h@> zX(q7^?m?9F+gRFR{P>9(5UmQQI~zx;d+Ek)rs)MIoL0!mg9Y)=z`d!ktPz}MXt>nE za(W^AGcXLgkk5hNRA7n~&W#^xV51tCk83!m86VVo#;1Y#xxyv=)hb~?#QB(i1m-M8 zFiaAc5`Sz~FIE@<#6!ei3cpL?J{7nog=ILL|Sx;6ubFiIW7rp>S#&QN3sCp8r8iU(P8{GS6*hEPAa7&d5% ztVJvqV^=9!d>gyoj;ti7aHM_2m99;*!7|7vI;DqvX4emEK$*W5cAts*OYn*H*R=tE04F)1Tl zBS5)pX#C~=NsBB#|Nm=fuuH+_a?w+(Z?{Gw{b^{hgTZ*abz=Pji|TeVg0VC-zNK8y z4PdNl&9`V~y z#g|LbZ&YC8ESdZ`Ycf?rIrA`1QQ37!W-2OmxuzB_R?_lpM?#+e?p_QEO}|zvDmfRS z$A+9|U^j-?&we}W6^rT?MWuFnX@1FBh0&lO5QQ zEw^+@95heL=GM+Bn^RpaHBaD=g%&NBtL6zsQo~Q1=85KR4$NfmYM0~CjCpG|TrC^J z6s;2J8HRKpfc}Z)sX3;tiB?n;$L3ZQmqoSqSr2-u4oiykDrgqUQF6^=na5O0ySY1i zl18LO-ITn70&V!(uO`g2sZ+J_>p5cl`VwYiOHoW{oW`$9)L2s@@N^izJ_%2xh+%pncu#_u^`{-WWW__23S?VF2I#-;icAmf3JO93#I3g?y& z9szDXFvB?^0>idI$fq?Pbl->HMZlPvFw7E8xNpGy0+gSF_|dQk5T}isKU7VQ))g%u zv?fOcL6({vGlY#XJ4@JD$V!Bb$-|yehFGP(SlD>8X=j0FZRtllyq$Y1u&n7V@_UPX z-n~8eo;-4ZDM`bbDpS9mN(yhJDk;3Nc9v2(n3Z@fsi?74=qQL>rp^oMoQ?Hf>L|S7 zq@zF`jgE7~AVzZIi9}c>hPp^zz32h*qK6!)ipfVSHZ`Uh^RDy)8_o&hU1 z8dFsz0{akyCpURI{8Z9OL_^{rC&PRV_uv2^l8_0F>W7JeprgvlB!HxEtX6cx{-7ht zRD5tIVNGHx;wa^c+U&eN@fZ>{D;^sek4=ila^kUR@z~6GEs{*GMl(t1TUZ>DLne|v zZ8T>1nfFEZ#IYxSrKo{>D{BHBm5JE+iLtCiZML^NQ5!Bi&^9R1omhwyaKgA3xNt9C zv4rnS#3Eh@;z`7^ynFMWd24faydeu02v3NG@$|$d9beSB6*>Tt-AKhQ)F-=upOj}!jQJ9Ck-kW`6N!w8

6?h0k>a<4svmZ}OCf@tjaT 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

TywZX^^AgAxcxdxxJ*vCuJL4a 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

|tg#u}A00V$*4bIR=Wl;BId^sH;;g0rPG+Zm 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

nj zy6a)K4BjNlRIAIer=ri%XnCx-=N=wTGu=geKfYl#Rm0Ni)b#q(4_tZbet0$_dPf*I~<(8_2P7FlW}r)X&WYr^72$|*LoH3uVjQo%I!yOMC+L(F+Q)7$@NN1 zTnmobOXOH66U{Yd_nN&prfmp_Jw-3~XW3-(JhryGq_6P?ucvL!Q?rra%JVb&#z7b) z7xkrP;7Q1%xb2UdRE`41vF#72JZ}9f#n!qEkiRuN0ne2>hcu3ze=$w{*egXHB`Wf` z!TA7FvpVb;BJYz=;thl@A`g2Jxw}zBk}nQAbjJF3Jla?1!^7*wZ63VVUeTDsNtG|9 zH*&Un@EUP=c&+y0_4)Xw%a>bsES1zfb;oI5#eB(OP0oRFBD0>!S?86UjWR-PyNc5u zqSLQlk1bkqTfkqf&06@rAMMT;dJ%GUr0Hyvu?yLJ>TkB_IQSghWPI$N?drEZ*gSQ4 zQmL_2yuHr>`#r^`V`vcG?Nu7Lo7U!Zz>Cws!@=pv|MAGvKgN3GDXy+ld`w}7VeNCa zdkXX0KKAI&QBAYGctyn_PSqwaJ|z$jzU7gt+$Q8?SJarT9*ll>nMd&*VwN0=f2S9( zZik20Z@gMm-K8G+iW3W}0PiV4;vt0jo_o>pGA~|%1txcbqTx7qb$3Y+w6%M)V^)Ho z7rKM~{SuGNA^}zIpig)OEnX1w?J-#W79u)ER6;{q6Qb|Lrhcy`v+n1v)yFi z!wqaO!RlJ<`;)8s&$@R2HjMGiS}X-qQFzx);l*?)v_w_OH2B<=c2hbO&QKIOxheGY zqENiRycQ-DC?Qy4jCMNtUV)=cGDb@eFh^TCjv?_Xz9%Ia6ULF4??qyX7m2tAbO?I2 zUng6yI&$3Bi&r$qae8%tIdPvyvAvCh0!i}hA`%7>6dH>^TJ|+wMB;LNNNQv7iFUrT zqTG)4;ug(!u=*%$L=$3ZuNX|Tc35h44l?hKOq%mx^%3!8mU)r6(~C@8-h2yV-V4QXy1l_$=ZK&=!Ik%B$m4Xlh3D#b^P-gnn^a0AhAA&H zb><}84;4r2#58ER6pf&1wjs6ng~xZW+t{W3Y#A`uLHJ!!9!eG^nkjB9635kk4I*-` zq$_d`B|g%V+yb+|SKvq6V9re^E8)SY&A7Np3-0PS0_W`-2ym4HtM7*aCAL1CNCvQmkbMwI6r@ zqWk<-&z;KA%^OB74zL4}_eyY0peh46j1oE#&IBA>lV61&pSE{FaPh^UukBqJI=^yl zaB)9){Qtz-`n>K~P&evfnKMJIs;_C@mv{Ez3e!umtR4%2b5UROtSsJ4YIehqwjoM99pKAS3YrX#f?^=K7jQCnFmLb!w^@`rMs+iZk5nu5vMPWBaG?2EqAQp|Wt<@NX z@_Qo>*V(tF*4z4VeNIF)MJT{bukV6UoKbI657I!0XoetRHN!z{hHb2780At34p|Hi zvm4F(Qfao0(~!}Yj>173&okDu)qO5n-HyV@-a<5qPNLPVop)|*tJ`p1O!-&!^JN5| z*hY)dCDE=#w&~*e!^Kdgejv#8jy6Y4lJKuxE!yEWs@Lc@m3UfcoYuf1W=@7k$;N+w zcJH#uw^Q!D)ih1DjS};)h_a#|OXVDBkzP@YC=Sadu=rx<0w!jleK3V{SS_L2)HdXx zm$JSW%sWH&2RFv|2b+T{ZKVphaO5jYCK%C;9ugg5V+vqKUsuM9MB?Hy9=GD~Z<75rX=U6i(XH z`4PhTR=G69vk|{>nGc~n4qxWm2YQF6r^!yzuPMtjKd!$UI{V~`2wkw*A5KDWHLo|8w1a*}>v%5P1 zmo!-d?9ZZ6_S|ge)?0eC6NAbQRx6V^SR#G;Y?th=5=7$ki>u)tnqnR6oj|kDos83x zCnK%VDYXZy%Ux1i!O&e&j#EdC?A(IOM)E^TqxE|=2551*qlZXZ!t!UvgViU2oBRk@ zY<=KyOy>50s7uDDJdBN9nEV=R%uBHPdK83|rK#4}O$UWXQ&UJeNwk|G_6u1XETSswd_iB8hMC#Z)gVr6!X&sg z!K+~C)&#owXSa;sFM_6MneGql5a;L$*rmy7#C>l5hx+*FAaPV$B+}`^+@-M^3k{Ca zFz1{pt0N{4cZoo8s^0x~Ljz`l<}bY1cJyMKuwf1`A5*6wPnQL#F2a{8;=rbR1HKJjb6 zr-@Z=Rd{0VZqbkK&aw3qISp}h`qSxNCAYxj3c9RZ$EUp;Jp;$CaHl9{$C_Gnb{1TA zJ4)Mp9wsbYJ2A4;;Mv$Bmx%~2Ye%mAEW;TwTPbR~dlgGlGsjJ4b2qOHSY*sKXi2Vbd-r-q@yxTmvZG`#foNaY)m9OX z@0H!t;M3R|H9tAc=H$?a8^PYK7UG-Hsf}$$bG>+t^X6q959&DMW!9*VGda-?^Jkus zVvC$b5v*o((ZJ0`qV94{e)*9t)bSN@8{>_94(rWrW!5BC?BAs1E|J!Lyn%vmnK%19`-Yt6ACx8kdb*E~qj$v7>Hg z9{Gl=VCG7O_SXl=EImWPaYjp{1ygzmG*cDK7JSEp93(9mDOg`9!Ftav2f8HFq}e?^ zjie>3v)J0Qz7Zu(~y> zLz*rLxGU!Clhe#oBa(Hmq?v}yOjj~9)}6GGhmbUkz+<;=$x)cY+;~Ih)B@cYso~mv zu&UuzN==Sgw$UXu)skVOL_c*ldZdvJ*)Dsd-;fIb6!z}1Qu)uaG^^iXumuBVv(xWg zq#jO}ltYq0Dn)e-l~mJ^rB5HU^Z5>-xO_G{gv41XOQ>$2Jt>hS>1JPd5|+r|jgo^@ zN$8p+3GcgGl>ZQtfN`|>5+~TPg0t#phaxxuvx*A_v81j&BvM)C&)lgx_7F*Z=O*<| zr!+I@5a(3YrAe9|!n{cg%eR}iaW)=XJQp5@gzU%WaqnK;PDn?0iHMsgQVa!>X-;i} z-(!rl9vi`M^D+LJy8*^!{$iQXgpG!Uj{_gy+CAK}fZ|BBOpC-l*k>#|NrO9%W2@jb z>^2vJ;RGGOOvQPqJ4xb9cP)m~Ad#+_`sj$SYZ_F8)qAmCBop=ppt!t!b$mK`yISS# za(CVyON+!yio}y{64TNmaTJ77W~7;0JWoiA#BUXeDmRIbOH-GHyOP)+7X8*$uy>_F zELi=GO3$b6^bAjn#1N=dSt{qam1{v-B&d}oiCf$xHXWC`RD#u;Y!Wdeg@CDXsVKHN z%}axzS1||7i@25+OYGD`B$j2GT(5~G_R+Dav+9+yEc01+Hh+}{v0!z?E;sXOchL_^ zi$o4SNXXjT=Oz)9Bs}^Y$9FujGB5;W*C7$}o5N`4EWYpu9U`#~ zv?do%?E8+5&t|Hj%_EYghnVT+^RNl%O2jV?Ln4k#l86hviuGR|L`it0I@&mr4QXPR z5X@bxJu+G?d88P^yoO^-q76Ibbb#5#Qc*F2b#__=*LxCt*o)wo?UTy`hc{kYFVj5c zPLB-Vmj=0D^@|?qV_W*tD~0E$Me?tnB>kq37F**R!FR=}GaamcG6BgAUL+q%i{x^f zqGK%`yr zQuFQvij)>|kh=a5NKrt#e&La>pB*BxA3zM5Wi3QA`Ci+m)C$^$EU`rN-d|b1S!V7k zkMvKIEK?|nM{Dek{$4;*bQ~pGnii2MSQl_>nhK?(9R#-?oxHZG7=qPTco1Yo>9kQR znw^8>g0x8TBvO1DN%A7vk&P#LvLu;?u#W&)DeU45AqY7>RqQPC%B*g7yiM|S1YMmV z=(ko|bOfzQ5cEi%){9NR z?x0H(1kFN)#FfH$8PqdtCtJa}CiUf~wkQP5eLJJ@d$eCCL?mEtReC32Zcx$~FfUeO zlx04o=wz8sDmq!_or+GDX(&2b=6ppb%WP)Ran$z%Z9K}a*jiOFUQ2pYrZvVA1rj&1 z7-pr?!Rd^{!zsfm0|%$qj}&?Gs1kd%Xqh|GuVtiIjpk7hpb8zb-)`{cmu`_5+$d5< zW0hOZhVtC&-5Dvfa;d8KJo7zTHWRXxXPTc#*ikOe6k2sH&moDU5G*7d;Wjr|Q60f6 zlLTL3QKyo7z24@UX%153jDUHYno0%CTs7m!H_uS1%s0dBNC;) zg_-M4eO;2^|5BV&EuT($gM^A8H&%$%UxIcR3iu~O=&#x<=IwT4&C3#_P);I}0SewHeS z=4O4^=Gxpms8ZuMm#Hv*(@)*wJZ51 z5lwoc5qVBgG3?kq#5UEh^{SACl;lGitAdn^I` zRO23}(Am;aT!(P3c@oZ5i_c7P=bFETNu1akKTC#8yT>WqOYL+vUTG)XA-t*AU=5q1I%0aMd!g{%e zb1=uHLI0GST!X3})14Iz`s1d1r@i7TssT+&f0mp6XUI~jZ`|%hVDHL^4s320RMQe4 zoU=Q_z2|Od8p#S)e~3O&&iS@ly`w`6TBtN676T59z0WDj<-6GW2`>8%Y|P=cu3CB! zW;jxnVz8Pv;$(7#WvbX#JT5H~wE84T*Qt%bF4L_gJ?x7Banh}5)qAW zZ8c~J)IKrv9|F^4nQsLB&7_akO!}%l_Y?FfOo=Pf(x8dY+S?~;U^6PXY$XKFTo&=j z%eFxBys#AqtKU(z@T#?J5mO*{q(y|rdt_C9LL%|GzEBWJp6g`dD-Xg{VHW7K_1LmC zFkENexz^_9kCyQcj18r}Pg%xju${a}+!ss2{P-ow$I&Ejj16M-DzQg!=l@PD)q=}9 zH-Vns1k78kpjaV{<|#imuz9^To{9(-dl$bHf3i|YN@(!U4C+%qc5H849T6s&_OzjMGvm^G?_y0Gxb!ZvM=YEx8nbWz)O#qB$EEIH=b<4TV|;lxfq zI|;6=tnV5Xl;m$dyyiZ@@&h2*|T>t(9 z1`HH#(D@g@4IVsX$c4gPH1uM)VZ(+GA0gbxQKR9;jJf2JOD%WV*vrR_AAiLa6D)V- zl@qU=G->jrDVDox>a^)sUwzFr*II7IjF~fL&AM*Z?AdeX%!Uh9T>p!?H{5s=;d%3J zzIp!qTW(pfVBx|=i?l_H7gsJ`vgFn!;jkWF3TGJ0s;c2`yRGK-U#4((2zTeN?t=UE zukXJ59^roT+k4^eyYK${fA_lw9{3&HgTMd7Lw|huPmd7(^PeAmbouhf9{bB*9)J9a zCssW1r0^>mszfw8uE@i@B9_?pU{4H|K>Np{S9@W)7=LLP58iraKDEh>pDWyXm`=#JBLK;`e^$5^3fCKx zEg9|tKr-AP6z)-l`%d99F~ODL#sZRYuU5EPh1;lbBe4)5!%YGtu!A{p)&Kr-BNgP!o8qyXW@g9 z3^xFf47Xn4-cq=e@fA>pI}4Bu_bY|_y}}(-xaRouD8o$#B;(FjxIGHz$0uhQ?p8oD z+?@*dmBM|maHH`ZU51+kNXGp{;r^*`*I`$H3^yN;47Xk3b}C#S?8cDcE(9dQ{aN8w zDqI`v7?I(Q10=)Urf~Nw++OTklHqc&+e(JJ2av=)qHsUQyiMYU0FvQmV&k5~%?BiL z9k8QO;!Xx6ahnwGJ%!tgt)4Pm4mQckaFu{0?oNekja|bMcMKpIZl1y!3b#|?zE!xP z*jFv%jt3;;KCf`ED%_9~JKR`6GTaV@`%2-?KgJGs2_PBn8HKA=xO0!S!|@=54EL78 zeW-A~kF&#F07!;=SmB;kI39+P`RE8phPy@KY7}nv@piad0LgIgDV(Wr{ZFvN4F@E{ ztx&iZ6|U`xcDNG($#8#CxMvjZoKAK)9{Q8v-Uie)gL?cuK&J`lv7g!DRs)jZicYd| zCjyeV#R_+a!hNl94GK55%#M3CAQ`t_;r1(Bq_Z7v3m_TpXD8dZ9)Kk74u$)@!W~q& z{8Q|369LKkn5A%UDcpw&*ZWjE+y#Ink3TBhGYZ$Liyf{6kPNp-;cizrTBVSD9|R=B zt?p*yUI8R=&vjQgKoa-Z={D{KKoWO$4;$AHki@;AaL4wv-_lH&E98=4MC#&}cV zb|~B#z3p)Q0m*Q)&$e;50Ft0Sjrq@Wwh?HEe{ z$ru%VZQNo&|A)Od0nehy!bTgi5Fqdch!7AZLX-#rvXO;F!XlgOI|zg&AWPT-A_NQu zG%<^)sEnebqJx7AE`y+m$$)|aih>HRID*m!6<0tRxo@5Ry1qKy{cXT=@BiP&o{_wH zbL!NoQ&p#`tE;*V?)~dc?kJGKCH6GA&Oiotx8xp?Tv9JnE(^$zTO+wgC3kIaQ!Wk2 zklQP{!;)*;$CT>`WXSE2+=r4&>1)dM05atEN$yk0O}fF9n*(IXeJ#0DlDo5?DfbT` zL#{!8lWPuSaI+=1RB}THm~uHlhTMN7_rBzs4K(EvfDE}($vq^wpCng(kSX^dkkQtj zmfRJCO)de*(0BC^lS>9NxJ{DVD!Ca$O}Sfu47r~r7c$J`CIA`v&XU{#$$crgcEe4% zEO}STr47tljnOq!@!7Y;9?ULIz+LWsVGUV!x zF}cft3~rL-7D(;`$$cWZmN%Md+X5MBD<$`~|!$#hTUSKIugxWYNl8YWTcq9%;e?*8Qhx%CU*eH;I3I=a&3VOZl2_pOYX4b zj!Lf0ZD!gIKt|dpB=@Z3LJCc}IzWcp6v@q!T&I<$Tz?=#uIDO~8vtZ*Pf6}M$^B1q zwQe`%{sb~=HS!LV3%}Fk>H!)0N+fr`{eZqBGzjP=Lc@Tn2#o@Inb26ElY}M!{hLq@(D#I< z0c|0a3-kk_xj?TF$^-h5&|;vigz|w-5h?)MMrb9_PlSqqUL{lt^fRH=K)(=L1N1AQ zwLrfSS_kwyq4hwg32gv6Luez=SwhbM{Xu9m(4T}}20BM*E71Q4Z3p^`PzBI=Lc4&p zYN9^&097Nj52!k!13<5l+##S4;tm6a68a1%jL=b_?Id>$D4e(xKs5-R1d1SZ3g~r` z`xU4rac6*P5jqD{n~+wjX*)iUN9rZdTozCap&meu3H1hQLZ~0m<%9+S z{fE*H0}|V#!?jUBR}dNtBvxa>wFyAY2;~695}F3IlhWn_T}9knpyq_~fW)rraBVSA z9HD%ms|ghV?V_|RfvzF02&g5YQlNN3tAVa1v<9dZp|wC_WeBrFpaeqef!Yw-0MwSy zMxZw-k7t0|5w{uWE#h7VN+fP8&~D^5q zLWhC&kiO4=IuLgh=xyST0d*wq1kgLgodoJc+$o?hi2D_&GjV5tt|N2~s0$&jOw+Om zg#vXY6amzYkoaDacnTe^MFI676b*Dep%|c^gqi~NA`}bMn@}83A42g!eF-H1-9RW2 zXfN593e=Cd44{3)bpq;7To%xN;(7oLAg(viyTtVa8c5tAp!bLy1~iDcQ9y$UjRhJ) zXadjylFI=aO58M{VT5vl-lxCL1sYCV9?%Fvi-ATG$_M&@ntpgfQXgyFip$$M^lH5k13B)}EG?CC|ph<*Y2AWK0D^L!h z?LboqRRB#Tv^ra(6niUsipEg_T$^eM@u0xcyj11O(RC!l47vVfKo>H%~s zq255BQQCe$1;h;kDkL;)HF`Y#bret%p|L>i2~7Y>Ba{P_PG}lX2BBP_OhR*kIuObO z>PToYP$xq9K%EH{0M#Y566iWYML;e>r9fQ>tpKA{aj z-3V<2YCz~2pzee=14R>h8K?)Ltw5I%+75I*p$ed$gmwY-BD4nxH?)W<`+#uE3UmOd zFQG#~HxN1u)Q`|-K>Z0F1sXu;7|=jMCx8YKItetG&?z9?%t7<7Ktlu!D0~$*x9%vk)1fcPR z5`h{MN(IU$lmRq>P$!^?gtCB|5b6OmiBNB#$%Og=R9_(Tw6bf`Fp$MQBgd%}3RTSedP#mFXAPnE&Vt}qD z)D-9%La{&yuJ~&lP%@!-AcQAy2|#xdN(4eD0GA2`bAU2{@PD9A_;D|xETA=ndH~%= zs5j94g!%zJKxh!qT0+BsS`r!s^bbN~f#L~G0J@e?4$y;yrUA7glne9_p}9co2;~7i zOlUDsYeM-zj}R&VdX&&gp!I}`fKmvR0zF1(HPGXP)&M<0Xf4nNLhFE@B(xsrDMA~7 z{z+&f&_+Vf06k4;Gtj>Xy$rO8&{m)XLfe6!Ayfg>hR`mcwuJToJxgdGP&+~gfSx0C z2B?_u~cGUYsW5+;hngV=%B6dV8I@O%87qPc1-S2aai z*UGgB7bRs!tK*JpW!XNYDl>jy*IoS767ktF#G9J^;u0&5MwD%jFMtgx72C4FLRaiB zn}l3R=qe#5KK+3YU#=2U{E|N_e{59vSEJ=F2sGW6jz8nejwfoL!FMyoAgmRyS|2X< zYetIhE54q&Fyj2GqsYH1%Q(lGg1y;zk#RToN5sB1KPtILaP-+s1)*&C0AuxoUyH() zlnK>^XK_ZfIZB7WC9HbewekgI`$jA>Ykjuk>HM3@^6DO4^?P1(VV^Lq~BoH>|2y7@G2SRpYYW z=eG)H96VZ5CgeKqSr!&j(Rxo;_$sPe>8d!<8QecsC5qPld}Yd~oi)6auI%+x{4N^k zvKm_jQ5D(wJQ(&x6VbgibgWp&u}?FPEfaJ`;p+(@=!~vaccP+b6RR$oxM*L?8$m!e z^Y6ue*xLI=niXfy!(`VTho<1)EyW^-^KoV3N3XI~bjSzaP|u$#np87F0Uz zo^%kKSy4ytht{QdVYwHv7r3^O4q|1YSs@j=c=3j!udO#hh>qhrLmWk|4)xvTW%$UyX*2<7|au*_ugC-j&$}*k{xX^Y7Jn$~jCN177skj)Zw>Ln-L*Xp<{<}Ji#ceuHLS^U9FpnpQk$*rQGT6+6dFd=BjOyB z>^d>dQu?i=u9iNKGOty&Lh7ZoQ$8$Lu(D1r>aKSJCp0gdBID?E0r zo?zFhci^tgb&$E(d}ADR>H}~}M=9^GxMj6Qc6+|Q8;(4iM%|$mG7#M%oVvpv47^Hq zt9)lCyy`07fci1MS$03~=Dh+*{e?_@fTynMKXm}Z7b|RO1JO$|@cL4vjE{}CyHxZN zUA&A+k-Np4Tn%pbU@vl(HW@@6m5R?6=qq^Dd^gUE+1cEj|9F#I$mJgNCRf7c<~zz+ z3TJ$gQgk?_zu|PJbBAl@s8V0XL-Sdz>R6k;Eo6#*efqFD+j3{_HRGooRqEoqib};7 zI7(Sc99+h298_8q`feZcTh7#nr{ZPeq7T=gJ{*d-HYw(dEdhT0*2}TRyj9q22bHGz z0S=L@0Hs|-zg*AluIZ4;1=Y9y2Hc}KWHS~I{W>I&`qWFg;*l4u7~>%KwLXdW_H&~H zu-UN=?W(WisviqPweQwwe!=<(wZ_AEeYR+gq0|}|;g!{j^HY50W(+91(D97{WeX1h zzhhC@d(Bx|UZBzEF-N6(Oa&XG?>nAP@faSAWKQ|!L;k}7|PD{m8w za(CYojS4-=b7#(aUFn^epz7oB3Q465Z{cB!wZE9|VP7{5w81WPP>AWL-W0D>R`MO- zAa+st{%@GQAR^yHylz{`_ag_fi^_MEgF?&^LTPoeNqHb-`C=k9!l}Q9pbn6!TJ4u z2Zj1(-nQpE$XLo6T&7n!DAZr#nf`CE-;xGb(a!{;P=A7tB{%y|OYP7BW5n@Qm%Gq)Bu zxABFV%l+z!B6|kf%dfxAGu_}IW7dFsgmCr|&s2}%fvNu`Qv2oiti%64z+NJYwZ_dK zMt7P@`d{pM!a=28n@>A$b&#=SiwyN`ytnl6pUQKmD&93ckr%dRu<8H7)4$!{ud^Jh z);=@35-*@u!tUHlruZ+sX;x9($iHIMV zw9rpdWeG0ONo1mfN}AnF!mE-MUqv{`ncdDP@YR?P7`|%6X9oNG`t#L%nKXwdy~j_| z3n*|G2bKD0-l;BkkWmYJ0ojW4N!HoFK89zz!9hmN)>Zy5>8N$wQPce-y#R|F`cdgB z&p^a5YP=PX9iR5L7gjCE1z1z$N2RO0xwIylThrf9(hIQWk6!iy>Ob;qKXQ<{ASdWq zJZvqyWQyx>#c{zY7Q<{ye(&+$o_4=@DYHo31h2hUV$6oXQ;YB>hUr&%l$sR0hErTa zY;YQs6?OYiz2GZWyf?28*g2NyZC5>*tDX^@YVoa~0(>4o@qK*o8n$o^-}DH$c-|IK z*pOXz#h1p?We6=@zV~i7PLi=1pAluI_dZU7*beEcJis zG(XEVM+Kx=oyk?#ug3Qv6o>Bb7D%zViZNWpodK!vJs*^B^%d*lrIV^-KKR;a%+NUB zxrk{_z+;8Jh_}~0U41$sINd|J?%YeMdl7H5QI}HpV6OY+tYCd2294cZ$(##P@&{Ma zDkvr1!WU~{W#d0F!dDoDuXBgR9uH-M#VcLxh1a{G*)yrT9i%QG#(CBuvK$m*F>fP! z0?RnYLC%t~(PMk*&9I8W(tdWGL(yXJVHhU0#YyU4R;kraQlDF;W;jVjVSHja_HdHA z-YRvagOsJ@z5@+^6mTo_>qD%yzpb-_iwdo#-0LLupjB#?gOq8oLtN>l&&T=@b4=^N zHT2S_V1Qt$zwhKwmj0MlF{#~7Qny*99&?g<#VWPbK}s#Lt9&Iol5uOY$l9f@b4aY$ z#Y|YtCl6t%SN!ab-a2?ig9VbDiaelD$f}>Fq2hmdTjDSZBEg6dywLm#MFZ=q<=kA$mI56QaNA{{05h zhtC#aW)Hpkb>!FTdI_El3BOJF$oP3T{j8%mK#(llT}LmZpLO*R_s<3RsZ1g6>|pn9 z86G*cgBnF_va=ZKVGTY+pa^zw5S&?2TmR}qCf2}vlvQOhwB^bBxvsEEveME z@mroYe#D>0Y(v~J9HurJqW7V;P($zcvEXayOX+7#y_5UrO!^t2C%Av!h@aSU9#eV3 zRrr?+Cme84L4Lrh_D<~CUxmpSR!5qyszyJJok?P!IBl}e&k(!qSL6*7rxNDi7h?;5 z2XW@W*sgulwWV)0gt{2lj_TcT@B#+`Kv)q3ns(EZkOy|%V@rfCPD;xUSmBQ@eA>lS zxT6-Gnb<2hD=ImHV-q+LP{-J+hkQkm#3zgFpRqbDtgNhRB3=Z2@Mu-d$`egQOfEsO zYdPumaJ03& z7UXhRe8Q?Ky7FkG@MPuJ(UpHj!|DW-O?<{Gp)9{yHDexudMKS1f&&HEi+?K3(snCp zJH8r?l{vFAaEe=8_08CrmD5D&;CrlZtS0^VT*%66ZBM1-Q*)t9c-6II1w29zq|8rJ zshiyJNvaF2<(i@a{~ub*qPo!VotnIdgAiJ*wU$w;D5IuJ_Lk+>Q0lh`eM8i5RC{av z>X-99h(DwX3FjITm7-L?v8>^P=5jSq)$S+|0{d5t5kfS7d_gwDoT_cXR}HU zqbH)j$LKA{YdzZIv^!~rJPmJZ@P&3mpbON_9pAPRW;CrNBG)aqnQ zxydelHJYa~g3fS|^5Ph0+vVOZVf%u1SQ`)r{FNLceB@wheSHW!K8D~Nq+(mHb2>c+Vuf#s+YwjUqlk;N4^Y2Fu*puaDWT^@-d&oUH#8d`;60I*X@Ol#M zXYohN*)G!!K`cRfZqFaP)CvdrSE#top;wDfW|)B^KNF!Nm?LsVmtKw-CfZ(2Jr77} zxG%N!>%QQ2(oFKNFu2Xt^?WGw(azPKfvN*trN4>@e<4m3C#4kEEpFr2b&eYf%#Awk zZ91No*V4a2-wlNy?sy+l`U@)O;B%~;s}nA;oZhxMbs>cpxo^nrJ+W=-$JTxg^zAp^ zJ`SPy7v#6be=@&~@^6-N`|#$s8l>jp)f^OJ0Z!zt49=fkZ7-W8TP%h;=IpI~7Wr3+ z8-qOF*oOK~Bo<}AeSjk zRJuEVFTD+)pnlxk?hv!2!VFh=OB};7p3yYs2XfZ=NoreBDl|tWuO;Z?L#4X}zWvT7 z1Es&9pXu$n)!$s@yTBJ<^}WHV?4`fNCxJtQORsEZ^6E(O;;#V5chS0f=?~zEkP;>; zVtuD~l{Z0zFq%aqj}@!@B=zoKA5*PFA4&si7<{&JA57Mp@*?kV=C8;P%Oc;!i+qot zq)L$kpD%Rwq10Vu3?=*dP!i!IkAhr4WGzq$Lh2F$|~iA!(R{ z6c0gRm@XJLpXN3<_LEexS&X3ReA@Bp6#M;E^Zh3Zasek2XMXvIb z+Eue`J&00?>34`;-TI)u zi;uiy>lZCL(6;!)<=)FJ73#HV^flvPiV*-A9?k+nA zlX|h$?(Bd{@>n{K4f}5#b=b#X=<9Uqc%;1I&a%S|9^%_h= zd9$(IbIABvW2=Oxejav^vt;ahuEIAUjm1iwUTn=I!$&4YJU@p849<(7r*#e{eTaUewfFt6QNX1aJ>eef zmYvuAq<57kVJdC7z6B5~e1YG@vt;6IYvS&H5-auQEzYvGRhEphi8vdoKS&#Wl$V}; z+|aw1Soi6r_rM4SPkDO4LxHC~OncdswAudCidJ>2v60D>XUo9S?fBMW>yMZDEvN6^ z%6E+(g?{1DFugbJdQ(ca%12I?US~|bPf-k3G;|ME!*ZNrWHnPQI1R$n&8Yt?R=ghV z-D3{r5ITlfTh}dt>+sf+ncqu`#Ol#xzTqm`ArmpnM7L7zXnts5FAk*oaj8AdQj@sU zCfWhkygtrF7g~X=%wF6^A06_qu|nSrY*@z`j6`ckiVW!;UrX# zpl}qb-|POFLcH=S%c4NkiEb}?P%r&o#!f?zJ9-C~{wvxw8>T1Vj!NuYoJO5EO#j9G z^IqOlzKgOKR;+%F;WuPEy@)N~V(Yw!z0Oxz7kUx4rs`sbR9jfo3pON}6G>M4R zCy{&|{cHNYjy{B2Gs!WVEcD0&NTAr0=~eJb%Au~lf^w*ZRHxYd7yRzkDB8WcqmHtB^#%O$f9dYk z1kdi(gbUogn(+Vr?$s#l*-XIW*C@VwwP%R2yD=F%XxSiP-@WQ8f9z9pHhwRV()NC> zEmAx0e3VmMGbaDNH`VvX>TP(7WYV^IV%rvygf(Ga!{#1_#rDDed*!? zb~VBZo~^z(jFo36is#L3j@{AQgFXE^Zt;vurnoUzTrY6N>V2lV?N_bp(#yncW&@tb zvv5)nUJ>`h4S1NF8Jq^Cnb@oBO$?2NZ&jyF!!r&U-Kx6YBh<2K_zVbdMzgW6moDyc zk&owIWV`>g0rmPO!cr6wo)K*}`vXyl$|}xjWb4fZmL&-15GWs<3SVnbFP6P( z=$}**#R<_@9AGi2$RRu1b|DNfOL?-vj>+_HkP=VcPP>1$cwhV;rhiMnhv^OQyAtke zJ7^KNw;%D$j=^-RON7|hq%~Y$giT?%m8zP;s_Qw2RJeZ$r$kDxx!qB&Doq^0Yf74H zRMjrr9ihAEmk3XP6JM6J+GUQime%U6LC8(2P4CK23v#1=H?a%6Doj*w&EK&?fiJ?W z#fFW-KfC0)Uh4w18$%aN)T*L4R@;W3nrlsES-+a+Ln@6yEldcBh`>h|F!8^CTD0!k zwRo0+d43G+itkl;J{$*4;$5XZ?mvIt^-7PpM94L*JQ`KJsseJw^!2CWGV%4N>|*-v z)A(Zg3e>oiiW>`e#qC`6>B1**!xvw)E?y|EdXhe(Q@pAGv;AuH$))V^;|lkjC*d-@ zBV>{ZQiwTNrp{Ayg+w7mN2cwE=EijQxNE1^y6)@^aMOKjUV30HDT zQc|k>YTrIBEj>LWvjeV^zT1lz`#L$`V7W3WazNL!-tO;F>=)4!K25Fc3(G+9XCFE!bDt?a81UQlQU(? zR9rVrn>uwmt{F3@PtV0Q3)k#9bLWYK^B2r_UwI1`-MsjgCAgO2%Ez^A+4AML;wo5i z>#eupDqMNnZL4tIj_Z!1;yXpc68BYFT2@wGe%I=|aovOK-h0=q5r4YRecgZm0}rfS z`;P}7!nF?9!w*05i1^c^xYj@R=%bJ0dSb)lk3Wg)seeBC7|!n{`Zzwwr+d%we7F(c%$O)=Kr?`{!jIQ_n1_>7NSukB2isL zp{V-x8`O`EzAU<7!$u8bVj9QDSkxj8F$m!Ymxw+Td)g%?CF4p-Nkzm_V@{{eBAy`5 zbnQl0cNu4l5Q8v+t6x76NyIg95XF)qLx&EdYxszfxJHc{J$j7$qKJ|`fntggS0+zF zOvw>3MO-&cLr9rv#1o1sv**m7J9pk(Got)|^>abq0{3NvG!e~=SXOZBiWRr5D70KF zaUrVRQG~0w_|B5jvQqaY0@^)@WcS_Yj$dmZeDI+MMf_5)hjBgf2*MaH5yiTpLDs~7 z;q;YWECd4Ghkvmm1oR*Ldj`{be05o(Q<#K`+nR9gFNwzBX6iQl7OqVPT0v+#(C;L- z6X-WW)o|-+$khch93JbVF_=kik8I zA{yM&KnB+kg*CXVfDEosa;qh`2s2tkZWWLr*Anw$gG&W6xVm_1VQ@`=46a0S_ew4l z&sYq(NFYP5m*j>?u0nEqC07>@q>Qvz02yhQO0H0Hha~rz|#>Tp~7M7;>F}jITPwK@l8eQ*AVV$z z$ZfOao{(G=HclCGF+hgg3dxm8t~PF)47tWYhTJ&GO_$uOlG`J>NbI_E=K*A-oi4d~ zlKVn(-$<@KHZ~e*#TG{+ZHeUWm)tgN0X5`y0vU4kvGLX5ngSWz=aTzQa{t4|U_-7Z zc0?O;KL8orACj9AYjX2|47o;EnOqAXgL_hPFGwz>xhdBL$dLP&|uEzPtofQ+=?OYRTJ zWyhOxGlAUpNp82~8eMD3wE!~Y7D(<^$qjF1%H;qVaz9D#tmH-{m~xYW3_0<>g)Y@a zY=1_gmnFI@#Z2)CkdfjC$(@(nJ?%}oCxF}*q?z1bKn6D;-Q;crGPqh9Cf5ka;PNC_ zD7nH+Q|=xhLr$068OinRfbX4CiTVR25n2sow1~ApM%u3=r%NubqbZjJWXSE6+{co; zqLV2X4`j&Al-v@@)#_}@)dw=<`b%z%oy<+*gu|%QDlZ02yi5NbV8I9g*BOk{i&~OgkFLNV`sQn<3N-96UgAE4KlerAcOl@a>pc> zInWXyO*^WIC^bW(`4ZhZ-qi9CkfEjR z1e5CmWN-&2n%rR^gG-uZa+yE|w?uMxNbU#8ot50w$!6NQKt|fvCHJ=E8s?aC&4CQL znUY%~xyz=QaxH)ixwjOp8R(Dj7!fqD`u0P00(B~Wid zML>NBl>+r8v>NCJLTiBf5n2n>pU^s>0fg2A4J5PyXb_=|K;i)i#y6lLgf;^WCG;}T zFhW~_h7;NjG=fkC&`3hNfJPD812me@KA&5g9gw6p?C8W*Nw3`Tp0!q!JJ3Et6+j&c?E>0QXb;f4g!TcwN9X|10YZm>-Y0Yz=mSEZ0UacC6zCA4V?ZAg zIsx<%p_4!#6FLQSn9#34M+lt(`h?Iqpic>Dvo!59LZLvP6N&)(f>0#TmxQ8#juMIn z`if8t(0>Uv1^Sv$EYLARaX`lj#RGjqC;{kOLWw{p2&Dq)gff7>Bh(3~icl8NNkTn< zz9-Zh=m$dmfPN%22S2HHX>ALtcA1wi7#Zn(A*Xd9s-pjQc%0=-6PHBc#`H9*@5tpzG0v<~QX zLhFIb32gw{L1-h;U4)(idV|nrAo23TaP4KF3PM|f?k2PysFF|x&^?590sV*29-w;( z?E~6L=m5|zLWh9fBy(h4v>NCkLTiA&C$tvm2SV$Bek8OWNUUFnYa4)mBD4``9ieA{ekQaT z=odmS1N};9E6{I*wgdf6r~>F=Lc4%Y6WRlGhR{BsvxE)+{Xysu(4T}31DzxE8PNX- z9R(7r>fzckp!0-I06jwJB#=hE`xMZl#Qh3Xjkq&F>xnxDRGm0&9(K|b3Iz%!6af@Q zC=w`~P!v!NLeW4GgkpdmBYjPQY7!R<^f+;GK(&aA2YQ0I1fUIs5`k*dUsHiL6PE!L zNn9tOI)t)->JsV!<%EiWo+i0cpr*vF2D*aK8lWo) ztp$34)SS>WKrIMu28tu}GSJn8wgO#4Xgg3#LKQ&qgmwX4 zOK1o6#D4~pJ$cgHSrZqCB|A6MHgC$}Jd#9D5^S{-Ym8C8 zsM8SGEvyz-yzv7vvFNOE{RSkZf_bCZNEI%a&X}_ zX=;sCCJl?BT0NCX$1PR6u{(Nh?c2BVuZCLKnyW3btdFk}5d` z_KastDrEjzsmi3n9-T31DEm{4Nr%j2#$>?e(}jwjltlRFWyT~y<_gA$ihun!HB~BP z#xbTn%5`dmDwB?~-@_PDsYeSGnbai6)VWntMyWaX)kcX2yuTHZZ0=>{-Z|G}J{;&Y*2{V2to{TgC`KH)l*HY;LGBX^F787Gp#w z{Oe|=Txp^c?q`gsi*<|Ly8Q8p-F`^UZGDdX5&WsWDRhKcM6INH5bkPTY zU!>TaF8bhij1hhC3&w~(_yJ=?AAE~5u=!QSh(7onV?-akl`*0Z4q{9OZ0^CBOxT>E zG8u`mIfOAu$ZP9DrCb@J{mf#FXg?W@X%Bne%~MmQLnenY87TWG#)!7jPh~PizsO=t zGW?Uum=u&No-v}{n{oy|jABfBDy(Bn24uvT7>f8xkv}sNWk0DhNr|Y`qnt_3&<=4X zC0%=xGwqYLC7eNp4dhHlvKGgg%yjMSe8rxmBy{+9IFp>DJ<6GsG%b%a=*)dMla{7k z$(i)_+K2O4UYUv7ZH!4qM{UO$RK^!`)l|u-jDK(@HC4NYGwn0ABe?65eojh8Wr+Jz zg+XO>WlRb>SSDvs7bj+`sZvlEPjDtRMH|lILp zI>wt=yYQq+MaRhF3_3;>XV5W9u;QkqLdOW_41(r1tO|Q%+GB9a9=Vt6@uN1j7dvO(&lg`DNSq683eKqZ&LN7rKV{`oJmX4(m8`5 z^(&rlcuJaviNXtvNk^NX%^9@$t2l!;{{?1s9zE%3^AB+bZGIGI;AioS#*-=|F+jLAsUT3MJ(tvP29vX6{XQza*+YwvRg zt#<=wlG|$;oPp=x9m(_{l1$|cqI!GIpoRZ1f~87N)V{GWnc95LAljT8&Qc-r7cnLU zyT^_?3M5GwbAR_e}sHSR{jk=qV|jf#=0X8dG06 zJDHq8Z;Dizltj$6LOFw*qE9eGmAT`NHAQ=tGnfO6=L~vWYtCSD{CNh`gZbFqoI&i( z;S6qy&R|ZjrFgL*%j%2J`;=W_-TvJGbtAy1^RREUuIoI#ytG6siwwBM7} zR4JH0@8t~U&&8ZUef8oD<{M$0!N|BXiD^cEAI_Lm%r{zb2J?;ciE64;^yNdG!F=Os z&S3uBku#V-zt@iGK|h_$nD(fPKiaA??NJx2Ig^~O#c>98@oF2E3Ux7vGpGwafytnM zt>6smB7-q$sEemttEtj3S~cMe`p$E$m<%FqH_l+R`si9FgMKlCG3n?RS91paLVQ(1 zw$=1hlxx^(g9#C81$W^*DwZgbrEMUqD3+$ z10&kwSF5Qq5HmA4gAwhwI3|O|xEDEt5v>DfFrpo3!BS#?uF7O0*4@LI zz1~31pdB8GW-{>4JkDT!qb6r?pYm7(HC20zxtW|ne14`rlR

    !tSL!ht#OHyWL44j3#bn?^amK?_gK3z-zUg8N`ujM}puhiCm&u^NmvILDy*g*m z-*2v?rbj}!m6FZ==50{3s?2hFjuNRzI8gWsfPMD;W+uEb!>sGg<`D>oUDcBS~oeO1@o zPtAG?0%qg66&i_rS`|v1`fLluhm2UYd<f>^lU3bW$4*fB4fn5 zdOTyqx_T^Q#JYM6W6*W9pKnsio`evty~Y@^uKp5Z#JYN4#)x(GV^dW<;@MWQ%Fwf| zUW`Haq7^E|^RQ>t6h%+6c(&DtGq5LxG2+?Q;T$!Uc;<3HW6%Y)WR;<3TSq1mX;)Huf?`_<1K|gr8qy z42E3oC6%FPTbmdoo^3tB81ZaNtcJ<9ktXV5C}Tt?yn!*I6L#keZ0^Vy(Fs!+BRXL% z#)$g*YK)q@=!8d9hMsM`&lu4M-)4;HgO!XCeQ+CNL?3*CGqCw-#)v-n7-K{qT*4U9 z2Zu5SAzZtGF_=nd-BpI3Z8c>KZb7u)Mk{5fXIt+wMzo)QG6qw1t$;BY2DQ; zGe)$HJ}N`cwz@J#Jlo1-jCi(nc9ddarl|LAoXLb&8G|XC_B3NK?bRM*jCi&+LuKgM zRx8e6JpFE@l6z7j=5@O`gL&N}oI!;x<_w-~4dD#dZ4wwGo^9Q z&Y&|7=M2{Q+i?bSzdgg5X3YIoGDbYx%Hj+v2CJIIv#ph!LC5IH z83fjvoI%IfFo@|v$7szNbc`1VG8qKTC5#czwz_c!gHtGH5D?!Qpz3Ll!Rb!U;MrDn z&R}p_ixprQSCiT!*o|Y1c(&D?Gq{&I)=y29hCucdXYg!m8fUPc*@`m=Qa|3n^kAZ} zh%w^XR!7dD&A-rBO_h!|zlbwv^E>)58MOIA&cM&7daE*G9zKpU7z?b?RGGM^9?KcrQ(wawOvq04V5u-ypT-&7Q~%VR$so{o zR2h1VNX}a;GQ~)Gg!MAp2cLacJUxq$YuLUPDI?O!pgRX5zn?>!m72x zU>#|1C&r+yuI|Vf49tT&C`@`1CVx3|42JF$(lX$~GxHQCS={6IMjTi2f<4g|25|$C z-6Mm-Yaeq4Hb2T4#JY|a2G8iznI5bayu=xl>vGPZzn{d2<;gt-v1K@CQ135c_F%~1 z20(jO{Nuiirxhs}K~^Q1GPDN|y=fU|Fyt@f3|hi0#)!x^g)>RX+BnXj#|`HU?tJ@O z7_8)Q2HVaWat6`wTa3+~vZta~?%)hYq6avG)v&ubgGJ*z7$YL&t(-v(-pm=);2aB+ zsolgG)L=GeP=g~mgDE~12b5B@M+B(J8AO1i?U+nPinfh2naSD1aQrIfIdLFlR6_ z_Tdah#;Z7kwsE$tTGDj%l=nG<-u*OZFlAi9m<-hWXwIPC2Xh9qls=rnl(DOY$<#7A zgE~#(45IqAoWYbagfW?zrM%TfEmtP$YdvQ$OIgAh%uKy&l1KYp$|^s3}z|Uat5=M&8^hDlEf^9 zGw5H9IfGfsAv_(By&xqCvy{6SlZ?J2K5XrgNyaSY<9NnkmLfhPt;nEXG~*2V#kQ7A z2CIdOID@#F!Wg(-J93ShDh0RVw{iwC^J>muMB95cON9}39A_}XUd|cB!y|Dl6`l?( zXG|(?p<8eUD~eyWP*dRrdD^3#!OVOjXVB)GaRzPvt>&tp_85g{aRxE!_p6u;ZfmD; z2D8CWVwnuauSYq9JD_;Rq@g{(faeaL8caiMS;QHPI~_TLC7}vDiBM8usbUppFsAfn z3?46OF3zAmKZBNm4#V`i5!JeGKlF<8&m<;0cSk53m zA8)A0;K@;vHjXox4IaCU$zUmG7H1F>ev4)@hzZL$gC__LIfG@IZ4J~^*dD5lQnVuD#U~W&LAf2smEjx6Z$g-lWZ-@!enZXN2#fj;pbkQfuB#hm<(dVy_`Wz z=)f7ogxl(}REP;X>!?f$VnSceASS#Y$z(A9d73kL+O>i+n3<2}4BGS0wV58Y=XV&B ziuU|CXAqw|a0c=DTrE{kD&q4F&Y&&^at3wraZQ#Ab&<^(%v;7VMm%jF!WqnaujLHp zy&;@I4F5br&8t1?>nYA4{^WB8<7orVVBY(D4WvD|&q526sSV@|>b)gr5XXK9V|k$uzQGyHd&QF@B*cHX2T4uCc(E{)F_`!6 z4pA7~$E9i$W*CflAD5!#%rY4$({_n}+*ft_`JwqMe)4BPaFOL1P&hpU`UZUVthtM( z&YzW?Hz_xJ@?`nz+=+R4Q|8ak76+oV?70)?FPPFTcV_?O5d-?n&YM3myXVj$eX@t< zP0X8)G@wWH>z+M-;q2Tgi>Bme&lbm~vS%ePnw~Q`Z|Z{i)3X;$o|roYSx7c}!IXK) z_^XzkJvBFP;eshSESKy6a+xj+k(uXAUNC*hlx&YRZsHcLR=cG3$;q*vD=8(Tef!k3 z%(M&-Cr}ce*rlb##%5r(B$fU&p;o_YHMGOK?i-TctQx%*QTSLrxF&u_-DwHc1X8YA zQRZW~p(a}a(9R;4rA2j953mVY-1pPrRe{YbOH0gBAK3}MVvTW}uj+n7Y8iCLMh%*v zKK>JbLG;x2KZ(P>_)lEIgsdp!s~m3={Ax70Zy|GYlwst}KJ;Ayf3(4W;xhHYWoX#i zPx$Wz{I@`>hS-i1Z5_sroHKuBcK0ED#*Q4CJ!#?e+??!*xw&I==4MZxKYiBCV~u}v zrYstZ|FUzZPg*c`!JMf%QznmHFdzR-&6zxB{*Y5%_zm6!`JOMxO!uP0@w?~$29VUJm7S|L+d{ubaLn8g1#p2(UMf8=CmF@1NSG%W{ z+zUKsOaVLZl2xOJ)uhbhA?urac zfgOeC8$lpS2rO?S~$oaT3Qq?am zHLL7y@ff}1e_VGQ$KPB#qFh@_>s8bOd>-$RFN^F`c{U6xAhSGdoA`11NXZdsj+t8A zbTEFVqO7rsmPZ5C5^_YCouxM(Z+Jt|abuu5d|Gl@pju2z+So05zvxo-a%2Kj1CYzI!m8)qs^Liq{(kbQk-MAX4HjQGv97a-AiE2JF70hH=-G@ z7;f{;}Dh zTR^^14088yVT_D8d88%ih|>m-Yb|xv>XO)VY=yf82NwaKx7+g|X$q!~D}9Pp*dWuU zfP2*!c5`Z9oH-$$epOlEyOX=hTUJBuV7PM6mE2u@n7s`xB2^dcBgLo$zeZi98s#>r z(%$92zBSlptyG&5QXe8c)?QX@ok_A$J=t!~uuEi4WZ>qweeQBril%{t8Er{R80dLY)x zPqpnv)w*OxRpk5g)4i%uZa*y^Yzx^plcEdslhW7PIT;kaU&Gb<{gQWNpL3N@Z|3AJ zaoo}}ntZnOBAU8l+8WYhY3PooWviySeb&QnSoe!Dtgs^7)3(ko@mG!G;+?#85;xHn zZ#_q85V9Wab&7f;^;os^#`QF(p&Usks1qVSbF=1xq=brq(NzfGJB&0XpPVm zIVMYg#2!KpFLdxpP}bbdYc==oa zs|DtwmswZBo-Wth>}f^XyvJ5r9Ii>XBm#>2Qn4sUZHO=5igyEF(Gi}qGjthOAt+p@w*Q&6^aanj(=FQVD}-qlu1 zzsz$eS5Vfx;G`iCYnF7gSu=%nU5ZA0d0uayGRoHz_nu4@uu#*n|)->&6v!(`Vx-`}G8n!D0I7qnr zS0B4Ui%7{u7^JL#wF=xIv#;ru_V)92Zct6Sup&fXk4LwbiQL1%Y4I@_4<$|3ZlT_N zy@xGCqF3bYawM6Jm?6wRKUdwOxw&Wr$mL6uGL5Qhm;qK~% z=VQh82C*z478hKlkD-I<;b}$@S(Df@#kZ@>Ih(&NAhStNAO?E2fP`f_73)6;a+R0YfC09Lj@6yKbbj)sGV9-@ z$$Q1Q%8OL9+`gLS=)xo4r!I_k09b!HA-9KkL zwE>%t#JtPx>Jq1ZvWe7quYEs0V!TBJj^J4yJ0>siV67BAUO z5xv`5+J270wpJ?p@$Sy15+wrH@MF8#`y7X3#qu}CIyuZ{j2L0$Qo}7WJ}Cw*B1PVv z8K^;R12@Rshrdg7@Xxo{IeKZPD-V+gkqN4 zSAVv0FzU52zS{tHfra8FJjQN$*(}AYla02mw1T;$%6lvD6FQZKd5s^V%=V-XFGt%t znDqH*$CjWsMwx8(Z*~@z+fFR@iwN6JxS9I6;)iL$>xmG{OjbRyq{mm|>t$ArteCOx zc%e8`ydvJ-8;WJIOlSIw7I%{#@8+0#)M#--8>3u`IejmYIn@I<$KC#SB-o63edI;> zh7Ds2NRxN(xXM2kZO#@crna;h6@ST$`eKB?&V5id%I&9v*Vs(D&ry-B4Ji}QgB@&2 z29XkLeDEl-^e-PHeYm4JP6L)^`YBEE4Lm9H)iW#x`IvkzBu(CH-_tkD$!C(? zoJ41H^re5EKQDrVVtJSs(Y1EbPlh?Q0gu<+rpXA>B-5xkw$JlEQev$-yTkp(kp7Ow zc=Wi+#fJ&)y(BBn!6@w#8MSq&lZRBJ#5V|~QSM&yYzqgIX8Bds&J5W~UpbA^!QHy} zSfw!vD31f0kV>2D_3cn35{WM$8i|x;_TxjGTDGT1W_$EkUk{U>K-#ruhPbA=gF(YC zkwKAx8|1F1Feh`~9PF>k?|@savz~#day&*5-uB#gE+JL6`jNwH;6WtOk5Oi&sk5Gz zS2;NQ+d+=CuNR|CHv3;CVeeJ!DnDzwLdJ-mZl5X3E5^Fd^G3&E|4z9Qevr0*ycW)_Xx!d2WW;UaGIVtfxjIsJki4^*4g+aoq@G2;@DEhje zy_is>KkUwvOGvR>SWDkR z=C7#w`UZRX%kY#>d=%RlE+akFxW!Re87_xe^L+ktQH7EEwNhOjkGh-usWVTX%f>Z< z)YZ{HLGdgV*~CHF%(v?(KDpPyCoU+oD0;uI-6LGl-KHXG*PbS(x9WO|SLC3`@o>FV zvjS=gE9we^JZicIrba61ByCX+Kb-4hFO+JFtK6x@+)W)YT(2c-Pualrw4+K-BV2xq zwJ~&acR$tvCONCoUvpP6+jHOEQCMk!wifd)8a-50^)(u^vM*il?b{{pAxarlZX;b0 zym}rFOpUCb&axNQ^whC<39EgBji+3$a=iM&)}b$>>Zz%JVebu*jtbvadV@H$Xsw`K zZrhZJ!OmVzmZ^%aHWkStE|W#9r-!TXybFIwSYA)OEEDhWC^<-P@kprs zj%!DB8GI|=ED|d)MglaF$TIxU3jZi@t*noH3;$S=H)PcZu9ac-PZ`?hY5KQe0a`R3mk& zs&@oSsuWZr-t7_Hvnr(WIFdHWA5!>Zle{L|!eOktQ18|Lu=2YmqBIA;uBuV_eUsu` zQLwsB+B{rIm8sb!{M7`O!RlDbB|3jZ;g8XI4Yx&Fa*0L`VI{~e+Fg9%k1L&hQ2F0z z>4wTbqV@Z6!zlbf$??a+-I0~YBgJ3xjlZZ13>$igI`Mv2W6pDF8eh0O!n4_8sBlDn z`;y$aXw%6`Z7GgbT;XE$MW*PcV|m3I5<{CUq_ z_}jZu?U}E7DH~S5n(KM*m1f+G$SPZpDtE`Bi|Ho*qS612-6TKVKX{kQ;S1K=eKw5 z2p16ldhw3NNZH3#^`2q_kCjatvC{sv_*W$SiJk2UgjG@9rSJ^-^FGBBQH!t#%nDLcF0pCi3LMtI*+|CHKqYd(Dhb5e7eNlXevC3;-c&9@B}7wNejMSHBNrpE!cqw#fn|rthT+{yCwv2? zpu02H2@A}S;wmpdzSNc6#s1d)Y)A~p(@EoR;4M}b^W z$kJ=MvuEjt2bNw$3HLh|-Q$H)-g>0N?%e*uU<@rHLpeh@);^F%F1nwXA&4~rK0~O7 z^teaV-@@XBXeg{ScaU>x@wqEOnp2Qu~OQHJl5lcNea=dg7DRKt18$hte|` z0rXI)F!Y9aJbYU~dQTq~ex)tR-K2GjmQDd_kvjf5Ym_j{W5*vUPUS1m7uaL+d(NVs z@otbAUu1@5?hM6l2-&#qaMWWTv80w)WYHBZT?5i0bu5rN!aSDzFWIT^(h^ts&1Q*| zin!KE(@Xv|34hXDKw9*by)tGwX^DIjOB`D3JtdX;5iyaW`x@!Y4!)CkD(5+KG9nF_ z00VIBOeplYu2--Xk;o*ZJl#FRXkCUZv7g6bQtBUo-3?~(BF|MB0MQxa89A$BFyDO?d>G$ zHvk%w&uX|G6(c4BT54H|xP{B=h!wDIQbz+{ugg7sM5OmT6lQh(7osy2vebP~?Cmwr zLI>&?bFG?mmlZiCKP{LQO59T8p7`4z#cg9v{Y(6`cqET3xj2s`N*x#Ok&|tGd&E`# z6YAcW1UcMQJWI)gErzTUs@Um%OptR0Po;?Q7foc0tL!FNC&u0UA8anJ7np6v971h$ zSw^c9jc$J%;T};waMYel{%bj(p8=*YoVR!i@bZa zl*xlJf!D&<3H}oPTcmRRSoUQO!Jl>BH4o$&WvJy>UEGErj1!~?& zn}fnHiFFmN{kdogLZ8uBZnOu%6_h++7s;g%?xK!V?o|otYs%$R$ z8v9FqP5GH#Wub;!_b_R}oZCx)b(Q;c(fB}(5Y0#SCEk#mIGRwbe`0U6KVBP9nJp0l z*(uY>O{BwGV$Y*fSGnjdMx&T+Hz7AL6O2(!Y~O4lCQ-cm#|Nw9C%cYg@d3HQv?EM^ z$bGA#M8fsK>X>e~V{D*0e6)ZV(qX9*&+a6>j@|U*EdwmRk8B?!9p1CuXwP=GOycts z0EX9%`ACQy`f^X7KOgeF_@BP~TU(=O;HN~c^3}ha?ecaYOPe}$jcFbX2 ztUM=UgD4NCefkrp9K7;Wuv+H)0p3QAB{r(rJBi>im}1zSmdN5CKw$d`upEI`18;e0eeIAibvhc53DS!{pfI& zr~JulfW7}y!J;Z1hePp**bQA}t z;|V7n*9W6RG_G^*J6!R&O}=XL{N+KEMrhgNUP@qEwviU^PIc(SVX_my0=p`Yhw1x1 zHS1fkFFP>%3}1ilUQ}eZT@j3iOc|mS8$N9kkdK57!b5Amb126H!ReUfR98buhj%Z# z${&{Z)%V)(tD_xFP;bk7n=RkHVyu_imk{4=?BonpOHZqoV|Fb?ezo-AT7+Xe>V{*L z`|B*fdb-*5gt;q7(Q_t7l*;PbV!Z=WTc+CkNz^*~RUI(L%+hF;z1+c6$*$P1j#*sC zV|E?a`_(a1)gc`Chy9-Td?SC=Io+z|trIq%Y$Gi;_sQM2uJRD9L>hN5XT`H-3hT;I zqs80|J;`mUcxEVL)liGjm2N|rP+M+_Ug0EElWVel+tOA3&NrsL6+kw7_h8Xm83gok z?xx91d4hzbSM=AUkaEm;xkXdD%uW#+Z4ru-?ootNE!n;0B;?|n97=xRxLNYIfQ*tW zxx9NBFZpEYUq$F?67rP1(%xil=Xwl7Jf}+aba&=TuNmqmNkg~mlq9j-5F;05-RocW zB;QA~0$L4I+VoS$Oi!%?vV@7Je5=t@?0sZji1zKzR^Gauh}sap?_P1cFAm&V~wjVLS<5uA~e$?w8UNo zy}1ZA6&ys=uXpQHy1*4)L=&Wa%DKc-^>|6Y|H>?>BDB{c^ocBla;oqti%@qNOcbFN z7NPA@NNEgXxscH;bnw8J=ROiC_qf(J4L9EMd+VyA*I@{;UaFYy{&)a&QuZo6AQuCu3r}Uwmw>B zt(?_+mkaCVvJi^U(-xr`Qj;>RUde@Iz4nkA72%Oyg#Rss9nZ>ra^IROW|b~H84 z%8iY~S*ND#tQ>Y#B^3UN^K#Xpzwpl$d3{%X>RS0*UGuzLsyN{Goj7LY_mG>hzoAYw zaaK+b#}D`UloTVqP~`6r7pW+DU!Id2%+AS)0=-xJ^UA6wusZJGf6a4p;s94qkx4^w zz{>G-n5kGjCg*&9OJ)*{48lr~8y%AiKt0ZHeJ;*#Rf+Rkm0w3!{uwR2i#mwIvQ2_= zj;nMNyyH2fl3#~4KgW|muJRTkv^^+>CXr%dEmnZ^wfk+OQyWreouBuS<2Jt+#Y0oM zp=Ibr9l67uX+oKO|Jop3zy;PI-O zCFU=5cyhe$@T})RE!IinsQX#ZH>R5B8)K@8vyCTlgXD4av|8vPk@ZX7M_dl#c%yL$ zOZJW>@7Q{W3yOW!le>3_)m>u|fVQ3SM@4&Ux;rd8^B{Lj%I$&Gux(X8f52u#38nYj zLw(xNDGt#sMF-@Fa#Pp>0e@fo#DLA|s zfX+7dtX(P2HU0-%bfbF;m;8ud*X0|ly{6%Et=U;N_VV*nLk>?Z9=-gv zE}%M!j|Hr{9@&-jh>I^;7u7ow-wo)7-^JdHs+UA@*bU!e{3(F8X0A)_bRPy`I#L7E z!P|b8eq|`EMB#)kx%Kx1NSYG+>4Tm+H}+p5K$J$jhdPfITCJtLhqQXHb$7LiD$CNp zl5?aiRTG^l+tOYdY%op=eueV5QxeigRsQQy=XiH&>YA?4J;TTmLPhx9w&cF?dg zAPv+f`?}LBo6LGTrY_Kzx{XytFLxI8Y>OXd7L_vle2;0Ya?;>qM0+2_#RpxnPeKi4 zHN@CUPE)kp?N7@MrWUefr*xZgUZKA~9fjB$qgt}eNlOiXS}IK~WJ#vI0^Yj5SvAMjT{E2&hZg9xOUT-{Bb|k- zI*Wq<^C*uRRkg(){~Y=yLS*L&4f{pN6ANWNLxV6}#7Xn!LIj3_UFXjSeTcls*tQY> z`=>?g>WMIlh?)w`@m&kginpD_yGoy3NS=-^-Z%<>FJ3)X{JV7+{>?7lJOMw(k4vez zv2a)HPLYdty;BfMMl<%tXtPrH!7-LRQ>u5>PJUk7TvI6qlPgtjboZz z-t>wqo5fz$yhYsA*R+hkwiT|{trOa`#nrA|Vp1}$l$6x=X}HqUGcr5i>e#VU=j(8F z>5|p88(rOdT#u_~&tAQH)77W%4Y>OC>)(F>T>}RV#x-Qf(4oWV8a`qqu2G{#j~?T` zZX7#qe0KJP2@~Ddq)C$}<>XAsnd-i7nl^pL%$d2lv)tG0*>h&kojY&t{P_zO%*U0t zaM8_+Z&|Wb;Qah$%a$*{_11!d6)SGLt?;&$D_5<&{q{R65@mqq7a2p#Ay^2Aqu4&xkSr^93ATD==c77)?Rx*pS9NBd!}>F z@B91zzZT7Y?a%%^pXYvA&-1KjEnRv)Uk^OE4A(;sJ^b(^k1SvQ2(CvTdwj(cPp(`= z{M1uVKmE)zt5-k!>~qhpS+jP{^UuHV{EIKHd-0{0UViBnTZN9c{+m7pYK|5^(C?`@N)75bmMW|q$MUfxD= zj;}?Wix%cAYySM(7c9h8Rdoki$7=7jh+4>dmMpm!?H{*(OCNaP!3U`AQ?G|` zp(R}YD6YrQ4)#R}!wi@fp)J7Q3XF$iG-{}B14U>bfo^5GJy+AdWWBq6^nj199H?oZ z^RMGU`DIOuDpNYFP-QJ{lN(V%acVnE+9#exno z#esCDc+mGu37|TrM9>RN-9U$#l0YvqrGb86$^xxp>J9plDF^ftQ!eNyraaKgOoKp2 zn1+I0VHyegnQ07YJySmD?@Z%B8<+|~zc5V(9c3y8{e!6l^ea;-=r^V^&@rZR&~c`D zpnoz|f_`UO2s*)34f+?;V$dHum%zVc8~7B-0j9Q>Ja8jjXo=MCZmvXgfj8nRbKd&MZRP1A3kH z_Je3aEkZj0I*sWYkelfc=nd9842ovi5zy&OM?o!_j)DHldM7}wSf*8@%rk|9S~Eq0 z&R~iHoyimp+Qe>SK(Q=~1+`&{1GQy}2eo5L0L3vSf@;}qH_%xuO9GwElm=?glm&`s z>J2)FDF^f>yUhi4U|AlhBhw&I0@F|s9kLpsjRbXO8UxzQZu3EOmTQDI4wT4L2%;00 zBecn&E=ZkJ(%W!wy+?dZ31m)*%nYQ zmTd!l!Ll8o-YnY*x`1gn=t8DFpo^IHgL0S-fch|f1M16k2-J`1FesPl2y#z00x~&>)t@f_AVh4m6l$@u2ru zmH-;UvP97PEb9ikjAconp-gF@VN6+|4_L1^XgJGqKqHuPK|A@^JkUs%4FZi~8VVZC zG!pb7>x}_j&a!;a7^ZQcE0_vFS29foUBy%kqFyILD*@%RtQ0hssSI>AQ#t4W>&*id zu&fd^j%guiJX1Aj0@Gs9M5ZO6LZ+plBBo`aNleQ@*D$RBO=emJn!>aibS=|b&~;4f zK*db!K~tGFf_8EEHi4$GYzt^N%eH~0vup?GW0vg%m9T6#=o6Oh0bS3s{h&`-b^tVk zW#52iG93byG93o(VZ9@uSu8sWn$2_!w3mN90lI-@+9FM(W1}OqaL|oRk)Y35FA8)M z%c4PZm|{TXOtGMwnc_gVFvWxRvD*aDT$Uw*<}r0!j2h3sCV`Te(m-iUS)g>L-k=Po z98e}xE+~sB50uR`2-K5lD5w|HNKkL4F`yPq`JfA!#(_>_Dg<4~G#P|lA4r2@5G`Av z{DGpGNz z`ZFyDUBa{il*hCRMDuMC+G^0HOlv^{nbv^@F|7v;X4(iE!n6r=8PgWfP^N95VN5$f z!Yi}Xf)F|pv##KfzDt$3>w391at+{QP7o4$3SN?od8|M zq}_#j&J+$B%M=NUWr_k_%@hqPV2S~aV~Pc}VTuEdXNm_+U`hZ@WJ(0JW$FehWJ&@R zF{ObfF=c_SVd@Q<%#;Ia$CL}2!juQPmT3^^I;NqZVy2OxsZ3))aZLH3X-wll)0qlE zB}|h+*E1D^W-yh2&SEMB&15PAl`@rsW--kJ&1R|u-N3XEbT(5psElbb=tia`pqrSM zg61$S1C=u^2i?rH0(1-0D$rb})u4GyYeDUq)`4ziS`Uh6+6cOhX%pxirY)cfrfr}~ zrX8U9OgllhGwlW~VA=y($h03+#dHAFf$1C29ZZKn9hnY;FtkHWIRZ*xItuEll=5@;z?8t7c6EKnj-Z_xcrIiT~HazPI;<$)e#8U$L#G!)c@X(Z?&rZJ$0 znesu8FpUGHFcpH9Gff6P%2W(`jHv|lI8!NT1ydR538r$;lT7nKE14=mtC$voo?@y7 zJ#$I&rL*fi%UZGvJ`kq`MO&og82G1~LuIDB00d2J*< zXxSSJEOA?N6R1dOHI(?YRGe@J6>_bzf_D~F_8JGN=RhOeUsZZ`z+sK?;ijPw0dl=UUwu0`)b#aP=P5{3o+{>|T{W&K)S z)~{=Xll?tpwcX7l*XqGosI^ zIC%#7i&q_FkdGgDcJiwZ68TjJG{!~TR~d1qzK&jU;EQ{<5%(m|A;caV8F&)|Z?+5_ zbF#@X{{S715%bbHug1fNt{?XLC!fPV+8gt>zEH(CM_k~+0V6(j%{=e;qD*1nBcUnz zIh~!;{S2hZJD#_89jdC}r1DTmkQdl5F@Mvn@YIj$;%f3vdicjzDgL{@>h>SJ>{Za>~Uy}J>5aCv&Sa_+<| z`jHQeYCEqPg%EYhv$yu^aO0(B;YN@sslCB6c6rbq26Oc^YD9TYb!sy_kRR_~F4DC5g%lL?pc2;Bu%;_wP? z_U!e?mR4}>-vtUwiiKGY7W8oG%P7@4ip__z z*sOMN&XsnvY@I3t>A9r6{6KpBq+VJ8JzsfsFB*Xm7*%tC49hXxzgx49!mPNR>vKCx zy4@Jct&v{O_}o7#-IqJM_xbFrWkJeLwxbFCLYc3v9JLzc(aw?fbkgsW-mG@eQBu+u zAKt%7k>b7cqSct5U9^)h2+KXsRb+j@DgUyZGPN<8vT+0cd3(8=NU*wiOP=+^X27%D4aT31g~l<#ov zob%HijOdxtqk#@ON|*zb5ASg}C?9+2j4Uo6;d*bd5{Dzh>XRHnO2-;U1Nu5y467Wq ze5ELKGoI&QKtD}pZGwZ2l1%PJb9{#lTrUS~-w*vaQ{gEG1HRZ9&0#;E=h@QpsSa+H zUG}5o5uRCcYyOZ-B zT>H{qNj>BC(QJE_I&gT1J<1ql=w&!wM^SsrL9IdlR5}sbAe1D@y(wh^tT0%mvcSnWtvPAC6B3+M}b_;t(+< ztS>m|G$_Td4`#r^Ip{5|>ddhB)MpHP zztW9iulMBVzWAyH?AQLGV`WWc#rZ1^&Z#r+Cw*D$pk^&cL3|nJ;GBG!C4K4Qpw<9i z>ac8N9SCqgJ{#vVDRJKHpcm2`eUMx9Z?~L^5r5lrk%My#1wN3KsEvbG$dLLy`7GBd zL3{?h%{06;+K$Q6^JNaMeQuTZ)qDgO`Ja@dU*19_)8(gRBug4;c`8Qy$*`-RJsI>j zWaF^LK__Hn{a%y=bM9Vr502zB(zptw6veDy?gFK;-`nGT?J@I(+P$dK=j~0>+uC66 zLVJ5#Fy}_8n&tEQI_Y))U~U6>tzR!|aM-CB@h97xeeB6b9sdHHK&E8QgAQs+>NYb+ z(B6p={SeL$Rh;JscOGdv*Z;8G{|9sDO(Da}aQz~gE_#kVV!jYtoEA%`&joXe8CYLv z2guun*}>h>Gp0t#zf!upFqk_LRF{5*%okS!oZc>-Zo4Q*0vRRuMqh}h%Me#PxK-D7 zl)`JdN7o~97@1Ns`kuO_Z*drzV(Hk0_W0B@Ot0c-DaF!r^|NHeEJy!UHlHO8aZSVI z+i_%;;(Jm<-9IPYAGsiSIs_PGc~9xZAnWD>=GhG3vd#R=TH_Y{$(sg(U*G4ry)3?mk z0wivzHutheT+hW(nL_I!C#?lmts9)Qwpq1?IcZ&prb+nN)k*6wR;|WPTCZBQzUb)? z$Iq==8=SNnp<@u?y2nZDVyo6v2Q6RU<6iVDnj51dI1Cc@Q-izggsN`1YzGo9k7ql? z@*``=b~$J%A=~D&|Ay86{lQ(fpyO4s5XPaCb$`<5mY@y^ZmM};Q@K`CuHdGc!jzF- zC#~@@UhEuT%EY~>t z_cIO0KGTuHzI_(wh4v*5jiC{{mLL(vx=ec*aZeSF=3MA)cGkOJVJS83Io>7b|g zM&mDh9qgnv+^Ti1lh$O`QZ_IdFLsvssK@<{d{ngdW!Te0zuM5!KSP5qw4Zg-F5@&- zY%XxpT4dE4@1(WD$S=LEwSJ~LX!Cvh=)DxiaDBV?Q|HeX`Y5guE%cZ8^ECZp@8=Wv zR65Fi>Gt?z)&WJLXpc~QA)w-JsaWNpNT&$5mTD6MsND{=icL}az59*NfAD7`JaxKeiTsgcd7W4lcKrZ&-1RH zB-L*Uq5cqu+od<>8spN7`Ll_B(PtF@Ci?3fzovQ*{@zr7mcK{p?fHA8{t&(^r=KR? z(uy}~_Rwext+Ii(2JMT+jnEr0^8C}035nQB>#qE3D($JgwR8~9BCLD?UyMDqr|^bX zdPET?pwcst-a{VK8}gc1&xZ(SO#iwj6cav=v2FQCI_fdbd(C8v?lW6!81Ah|h;SX&;rH!)v zaqi=LbS|pS=c0ZYQ+u3tl_yq|CnRd+W1tdGN2B_i`2H!jLYv5YW-YzRC>J*AI`yr3 zpWP@GNSK=3XvOZ2$#%Q?FO9@x)H`;aIG?x5Fy1?xZ@vlmzk6_M;;ygFqiz#JXK$Tn zFV62o0a7zK(VM{oD1*=NX0T_MQIzON&#!UT?Z*H zc@w7zjG#P*IQXb}E#9^lZYSwK z??h|7m3B)u@POckHf7!>hMKbaG%-$1nOV|lbW*nG@0I}EM7Kcl-9M}oN;R3 zLvJOYzr8%S*PHGIx1H}z@nznkyw|-ZKOwI6_wZYPr{@oh^nQ&H*%cd>PscgO4MU+! z(kpO$BH6gm*~V}C0$KTOpRm&lc9h!nQ#WsrD!oC0u_ryG%p6*qg zt#@>$(-Z27*4++THq-ti;fx)9;ltcDbn*bbpt-iIu-7-3y;nG>b!!#>TRQ01gyTeB zYwV(>KcC?%F9<1#0(bgnU8wV>jb%5_u00s8cYvN4t3T@CP+x-@D75A{Xj#JKPZVRv zJrbq*vjhrN1dST#X&&`S9)7ZhpQ`Z_KgXocMUbs!sirWYVb8Jjgpq*Hu{=vZTApL^ zwIBgo4<(n1>t%qN_yBv(y9P5L+AxQH!aJ0!-vcz<%jxTpq4eO)TG>&pIPc#~h>7(w z5F{Zw1T#Ph;a>DlgxR{<#@;_(y|11IC_5cCgaZGJeITVIZ$J*3oABkxbTtAd#bP?G$+!MkB|CG{OG<-;Hm z!HoLCMFH}L%}f`6xHfkRnJm|xG|SU?kdiD5g1NPL@1mr!d!HN3M1W-RKd;pq$x(YS zQvV%C=_=v+i8~cJBV=#AjbsTBuGPUz7^Nj(vXlgKTc4uZ!@&S1GQN?8vZ;fXHI_kZ z^R|xmtha5Aq@lLan9Pyh-{Iie>b>{g5wlij${ZS856AYfi|Ns3!AuxA^wlvl?0Y~; z0eQcJJ?4SJ-dMj%I=-tOj-A4;JnT6nm%(*Gk*5X!hvmxq z(++CZG_priN#rRG2Gr$PBcAjqhf%)Lr2kzUocsJIx1xcekW_5-?-TnS&nkHLi2V(( zk5+>9QM^6+KD+KkiEwCy=WO}7!vn$H(epZnyPu@H3BldX^~HadCH}$PeeQF&OS=1e z`ylaC%7@xbDarFj=?YsfcPa36u zDo9KXj0@)4TeN=Lo1^~~+qH$mbL-`h5)iNUKr1gCf8W*~HD8#0z8a;ik$$z+`7;f2 z{)*LkaRZ#Y^yAnfEdqajgPd>1URB}z$2Otk9<=X%*1-U(^Bik9=R4?G6FI0yxef;4 zQ9Eml;vDpR9t9W;_#c-10sGf!Zfh5>u`6d8ycHWdp>p)js0|{07uCa=Q7ji&osJ0R z)V-+Ky#F-|=37<+ErS{GmTS{-JenjC@Q=?79bdz-OE0u0*3t$zPC|+cpRcNi;~))H zoP%?elka)+gp#30&j=mCAl|&>;2hpmTa%*3K~EG%oNHm`q<$?(>@K)0m}}8A<>+s5 zO;9!+v}}Omcyt!R=Z{;5P9F27t&vV|rWeldYmoD9oH0V=DCQ=OkzaohZBhD%cgx$a zyu~tHU(K7G!u6iW1NwatH%rP^w+kHt>IDVI68rGauH0->nQ3ZT|ZX3UTPYL7~_a|5VF%dlwy z)GkKXp@eNOp4qZCllJ+TGz7s&=PsPC&GpH=ak9BSMMm`wM{`yB!CZ3LbX0>Wy>OyN~sn=zBPwo9L7Id!)XN zzenn0_nY{8m2T800wLtlyTS9pBPn(e%y@O-X~&GhMPznOlLKV5n$%UybV z6rcahhO;3Ef^WlFAAI?9!s!Yxq9DAe+q=M4Aa} zCVjm(o9TI&1Jvs z(;tI7rT=`)bgmpA;~O=4?=Bstxb)YsZ=2SpKWZ$tdyP0nb9cj>5~?WEjIx`{vfavf z&o=Fo^1Y=RyU_0BU^Uiz$zW~7SL-Oj8cW~A07cinlz*dXLJ5*yv{wXsl&KRWG3~oD z>DH!oxJbsRdKj|J^XTWw&}@axP?5G9iIhfeGmR+GHgm$g=teZfyoXPpE*s^6rZcCM za4)(W+Qu+^p>)?OxVu`PyH`NQ3&7nq59~2kL-mW%uOl`6+dsBI5Go1GnSjP*QFXka z9*&)=#(+kaP+Vvla!A8l8hf{E`nL~y-@lF0T>B|ivIu>u)#70YLdDCt>82e=B394W z!>PSg(3@CVcg!M!Dz&!X%siz{ketSNK#adPfH{u1)$KQtMyvoujLG z2Ca2$GhFZS3E2+U2lHoRy}kGI0(>fdz2abnwuruohYS?8#R1e>u+<1%$F3ZDcXN?Q z4|)-hLlAR0h)Rj17f0Fk>N4mVnLF9C_l?cB@s~({Sw5!OU79t~TZ;T;2;1S~Cslyb!WRmD6EtHb!E0KOMH$8GkUq@etH{h0!PrU1S3(75dH zV#eE;aYf;3f$KC}Zd}p0PRG@;4tOndhYp=^bw0OKr$k)mbxBO@ zimTiCUAyu-nv=SBPsWv!nw*^Gz0&cvX8*gI@wVpP7hFI;(L0;z!h4%@`t<4BFBg~j z-e!^;?`{tKcL1(S2M!uQZ*{(G=zszIPUjILhm9IFdi3REh7G&o$}7AVzs;H7bm!EbV=_ojN^=6uslH_gFSj>~wX zGv4WZ>)g4w;i{;-?Y8;2ZpXD?VbvYv%HzGNt84InXS});7roy39=ySne!ACtdEaIF zz=OExJ*M>bQu>MB-MswKM;>_$*W)W5d+Z5ZPp*98iB-6sdV19=<(wo%P%>7XyF&BsTirs?06&SCO_B9ZfU=qB^?MgGg@Z0)iUj2_MS=P-MT7b> z#en)T#e#B~;y@QO#e@1YC4eqrN(ALGbpz3TVuY3ix|AsmG>|C^G>EA;XfRU_Xb4j- z=rX1}&`_p9pkYiyLBp9wf<`cn0gYtJ2aRGH2O7;(2)dkUGH47_G3W}W63~@QrJ$>r z%0T%{<)E=l^FUWKRe}nb7J|kxRfEPeEe1_sS^}ELv=mgxvY^vX$9ySrd6QH zOshdtnAU>mW;8-u2fB`FJ*b#zBZ%&vBeYGRX-r!{)0wt`N|<(lu4mc_n!&Uil*F_L zG?QsRsFdjdXcp5qpxI1^KsPWQ29+@#0o}-S6m%2QG0+^Q6QE=!Z35n4$P^B`nJE%< z3sV$mE>kpU9#ahHR;E}`3R4{DHl}z`1ycg3k|`0C%G3=spD77+J5w5H0aF%eAyaQq z6;lrA4yIg?hba$~#xw|2%`_B52Q%P3&Y(q1V?cK@<%1S8jRW;$Dg@odG#PX^Q!(fs zrV`K+rc%(oOl6?^n94zaVVVb8%2WwTXIcolpQ#%30Mla7gG@_6%b1pe9%5PsdYEZB z=nPRZKgq>txQ8f+n7dzwlj?ZWijQ0-eDRCdY7pXw1a6f z=sl)l(ECg!pbwZzK|7hsKp!%dgFa%K2inC{3EIuH5cDxqHRuzj#h_1_mVov!Ed}jm zS_b-zX*p;g(+bdjrd6QNnO1}T#(ncQB=a=>3EdS{BH|)Eo2~Qx2$_DHpVnDGx*k(nM&3K(8|m1ubG433`KR z4Cqd#e9&K+#(`+6F+wW@ZDN`Xs%0t$y~$Jp+RRi6+QL)@dW)$X^fuEx&{n2O&^D%p zpzTc6pm&%SgWhFY0@}f}6!ad`GSK@>%RwJ7tpM$0S_Qg`X*K9WrnR7tnAU-IF|7yP z&9o7;n`sm1W2P;jPnfoW?qS*i`jlxWXb;nF&|aoJpe0QEL7y=l0PSP?2DG2)5a?c} z!=TTZj)4BgbQJUj(=pI}Oea7GnCQjHUowS*zG8|5ea#dF`i3bQ^cSWW&_SkH(6>x+ zpzoOCL5G+UKsr+*Xem=S(DzJ9pgN{B&|#)5&<{+#K|eC(fbM6?1^vX72Rgzu2=p`4 zP|)9*MuL7}8UuQODIau{X&mSuOogCdnI?mNV=4w6V=4h1XDS8#lc@~!J5xF61k*gw zgG`kmnz6@w#6ioLszHA+Ee1Wrv;=gLX(>qK_Fx$(jA=Qj5z`8gi)j@ooM|Hi4G2Yzyd7rfr}|{&ffFS(fbtHD%duP&1}Ipyo{bK~YQx zKrNWQ0iDKl2;^ou42ott0y>@PD5xdVF;FX}6QIY~UwU1449mhnkFzWiw1O!L)S7>d z20g*D7|vWyPSUm`Xs2 z{A(%bX_l3N&SP0Qs0-6PP*2$H1W#4PO_Rgy~nd?6&+ zkbJ62(y}0VR+Xe@LNZU4WZ<@3o1;oH(;=CuO0v=*IZu^jr$X}ULM4RBNeJ`{LXwO? z7Yj)W0-Y!&2=rGAR6D5%^l~9dL!f5~Njd_ZE+iQU^e?xob}|v@7lkAXeoav&DM`>d zS4ff(u@C1fc2ZIhp7}zO2Aw`qg79ptR9$5t?lXiW6FR9vl7%pTS)sT}O+xyN6_RA= ze0rOzLmBT8k~HWv6_Rws>xElYR~d+Vl8{iQuAZmpq$NS8-&|Fa2EW3EBopykbhDz9 zPHA}O992STI6+8KP&U$qBo%g|g@pX7yGgZ^hVX0>l62(7y+V?KvQZ)=l+FW%gwnaQ zkYppwVX7n}31QxUqvCr8Rl-+ zbkd~+agP=fDjRjBisfvo7f%aGGNq4@q#|D9goN_Fmyl4tpCKffi2KhoRll;JvsOs5 z5qFO&NlrqhPLh(846Topq^4_)q$E8_+c-n(@nHd{)vlC%^l$xhdPyk2#cj0(S5 zN|Lj+IZ~3Erlm>=D)SE|!cIn-wo*zmQ?*G_l9i=(5Rw#B)W1zv?W7 zLqbalGUL^0!VWT{R7#K;NkWo}3U+v^>I%!P+A~suytr0M(vr3Fqy&}cV6m`+hV@Y? z$;!~i3P~C&MjI(X#rX6()lM2J#=TO4iqT6-P%+-YD2v7~Ji16uL&dm4O3-Mw5|VUu zPVY@oU8SRQS|BB85c^08I;Ve47Opaqv<((Xwsw=0pt0*ECE3{;jmQ0A&PYzvUX>Cw zWMxv4mZoJ$NqV+Mcb$qIG*T5(f`LM=kYu9FHJ! zN|4U)6smTzk}|X+DM826SxQizzndsrWu$5}1LY4-7RvKrDM5MuWP+-bjq+R|CCQmu zJ1I#`(LTj!*l#%-oxwd)l98faCMB7f+KzF;6&m`nsw5>TDO1~1py;F|VW7}cN>Vem zm#!8%=_%ToQi4IilCeSu?Z)Xsl8i?D>3mfuIVDXyO-fK!FS$zSpkq$IQb;nhv`8tT zCR<9-WPfsn>MA8EU3*_jPa zBZVt;)rCSrL)Zigbwm+fRtd^w0Vfo$AeQvkKhQvj8qnSyW+1jSN6-i14YWM8}6jv#ki2JTfgaqk) zW`9$H&PVG-f4mpp`KDx|HWlQWI&|loiQ3dwNU~6y=v`vI7AYkQwdoEif$tYd32M`^ zzQPr1(;6v3ZCYuOWNZ0Sg4{V%N>H12_7Rp*o8FZY)TT-y$wqCuTuP9G(Ncoi6e%UB zO|R#uer2OJm02X&TC$Yj#_9Wuge&Coqf&w!r~9P@ebaC$L5;gqmEevwRdY!RZk#^3 zQ1J_crew_{B^W1+wn(xymy}=tz2^d92V=H7r3CHs0x7|bQ*S9j&HWh@IKI-7nuMBr zrI29HoK}m%=-0tUI;~VnP;=>RE{YCnZl08&A3T{YbWk=vk`mOEi-aTvx!fV`Mw(+jo4pr|G7?CmeH(tiQZdH?~`6^lH zV2pjglwgcKOiEBsn+i!f@?w9IY9}3eF+fUE(zQQ&2p#0b6e&SoeAHd&ATRn!3F_Ai z=L;R=#Z)25Kwi)e8-Lt0(4)?>kdbE{Nf_ib9l%QVR+(mVjiF)z< zc|wAE@wk+rUPMa?>cyNy;RdntDjV(C5-CZ^)XtI;jKiPoAY7r18Yd+fhqsjy zl=+9wQCy`Zq0DPif-?VVywE|J?v6FMl*jfEry_l&dJsyZon?aaY8LXw`Wjg}Im;kHjpGLg<}o2ojQ zsPE@U3GS)yiWE9%SHq+P?P^IARfq1W4@L+H>hhIRg1Y=(W1)jIyg*9OW_kbC*l#V4T@VN>EQ{HxfEXA6j$vS;llrnl?^K(C>VrDLNRLr)VecFeK*4 zJWK1g$dnXJEt)#Bs1$DKqSYnu`d5GYj;LX63&n<4%SaN=GIiYwNdz5Qle+<7Y4ZG0 z+$RC}8s`0sV9VyZ)mH^HtK^+o;&rRfR0&O)Yaa^<21D9=ssyDOYmKUercSkas>E2g zQYFT^l`27QVXvkt;dQG{s)X0A&Jq$#>1nNngyzg!NC^VnSV&MUv@fn!;*ME0>|+rU znlpc1NNCRdDIuXb^AaJUb*uAK39noII9Bm11yx5|CM2|OH9|;e-RcY}L3qN1gx0OL z=c|@!J>@PTLG{wER3*G_)mlhs-D>Amik(!-_ys~j>sIkXLhDvLuT)*px>c2sP^R`& zCA@C6e2n5M4Z|_*#AsDQ>sE6|DH2|{>Wk9sE34_0hCPJ@-Jq5tBp8NkU4(@E>L4Wu z^FN2HmTBGUBO$?%gl8E1zEe8CDRd~EUlkH`r`ijugx9T}77`3ww8w;mD&b8+LU}P< zN)YBtg@h_$Um>AN*i%TT5~c_VRl=r1Liu%In35V9R0;Q}5?;63DI`<}w+RW=!A(+v zFs~O9s)K8VgzDfbA)z|BTu7)6-Y6tg2Zsv@nrH1&A<0fb`lu3Kw{i&yty}FMs>D5u z%FjzeLgiue4-gsHHU$I#f3PiCH6`4zFANT}Wu%>U$x;3{m36>sITe z1nX9_qy+OV8A3wqR?$*|IsEqqtCo{7uDe4@Fy0s-C78pHloE{V-Weq9U|d%tB(!cd zR7#K;t)&E+@!3GtP71~(6;guC$dwXgMq?>KW^B7uwL{|skCdQ-4VDt*#kT{5D~wy_ zN(m}YUnxPu+E_|(PrWTqwL|Mx3#0@UV~~`fVzibLRE#$;f9NaE$!Vw?ZF zDZ#qciGHf946Iw#N(t7jZkG}?Qs+ns1_~Sds&;7Is!~c&<_Ad$%6yEJpv>>@BkZ8e zkCzgp^Y=Nb4vn#2kP>t}H%SS~b6+XJ7`vI2pgg~Dk+6*NoFXK&ZuQQEs!lfUmj_A- z?w3!K5_ASMe;A?BKN_!QV;nwQN^rlttGCcWLtm^)c-`uUUWyK{TaA(u+%JF9Q|Mq` z;zB9GAfOiQxGy{@NoY433kj`TRij1r>(IK@uV`%*3Cb$9zlsDMa}Tt?K1pU0$`9@5 zCJEmuWMpE-WAS7~l9G&0r2u`8&lQ%|votiMsw5k0*+PQk&>C4JSUo{+^bbf0 z?!PXT63hc6ND1Qg1NtY$4(dDgJ$^|l+Lk-fJ1P?7d&?fC1ku$B>5um^RvA*!<$u`C z)S*>|RMe*JQi3kOR!UG3HV6r|Y|l$ca+3CxMUt&ODkT`2-!CO7Eq6&tT81`3O3?bH zN(pLZGbuq&^kr8yUTK)=+AAf?G}Y7hxGK?ax9&vl+USpq2PiO3>@=l@g3V zK9mx)#w(=+Gaipf30jgHr35X>2q{7NIbTRJQGPl}33|qp=c)0^M9;WaO3*XDC?zNx zHBy3_a*aijtz9G~7&4wIBw1)}eo9n*&qBUGFC`eIJS8OR^?WV3aaZN-#>fKuS=*&Xf|=uRRH> z@5#7@en3hvO39ZJ)E$}+k3cKQJ!5JLMk#wb3JFFji=_nhB2P+CFAjGQt}qk0T1wEa z7E1|c0=o+d?JM}^9Mw)L+RO)}1k)Kqr35`}jFg~<-5W3Lpgnw8O3)8Z5|T9BLU)%E zv~|CB(q*hQ0C`J3CesQDM6XvceZLL9V40hqy%kLJ1N0!?TWL6EA-~)O9}d~ zcjAN&I_~*Gl7aG^BPD2CHn&qM9%4MqQ)?{X3oa?yq0jm=d~0N-+A$loGVh>su+Vuuhb% z4U-a#1`o9qI#>;yDfrn*YOD%D+5f^<%l5~TCzErcty2}`5|ZNfk)L7T86 zO1MIskR&9jXcM+KS9Ma+CXAC3jDO;#1S?tJG!w2cGG8SnD9`k&ZeQ8J2BjozjF6P9e!apF7zi z$=3Qv3C2IMQi6Q{DO~j{1NlzpIr?Lffp+W>DM1~aDJ2;9=1K|ri<2&42jkvrR0;0m zvb1C43?1`6E<-yp(UfSo=FlJS)rdc<&9C^BYe2{j%NkGwuK_&-dBN0@*^_2WEhwE( zTrhE>?`z5U($b^0~W+^F?PPESvX_g~4WS?MS^*_oMs84(6m z85tSz@foQpsm3qknhgr;u6?=X-r=24z3=cQi~8UgiIC!2E~SimHH$VE&qkQyjetum zdO2EjUv&YEbg5vtP|2F&A6;Si7au)zoVplCaELq8G^C z#n2h0=moM@0G+9dULbonKxcuX=VT8_%Zs!RDSCnIt%S}iie4alwa|G_(F?AwnJyHq8G^C*U^^`Uq9$vrsxH-cLj8&D0+eH&4kWeMK6%OD(Kv==moO(ICR!1 zdV%b1fX;SBFOa=m(D_2q3uI4+&T&Q0$sW}=7Y0VB;~!nY+P`+t>8j{C*`xZF4xK)V zUZC&|gw9opULbo#(79gG3uJE&bUcb)Aba;h=TSv3kiBQ1^O~X;$lhDf`B2ddWN#mI z>J+^|_Wl8#FiJ>V!SbUyblNF;WDk8Q1}@sq`1dUSP1nM3pMYHpJ@YT0KI6KAe!~ak zUp}H>!mKI9g$3h_i}MRh3MS5&GWCXh<8NWn?0ozyD4sH5X8z3SlM0I_=Fgmgf0GI) zPM=YfKQ(1`{?zMACgu+>DlQs7v#6jfD}#gu<4dM=pFZJQt*6%ebPW>*O*GsyXidw) ze4m4-Oq?+tCQIWJho2XJSxM=XsZ(y6GVPl9et3L*N^#K)3g@HrXEQ~b$}M%y=3hqs zgBx&|XU+MWN*kR#kh+OokcWl~D%9%L5nr5K;1<*3!Wfeo&wUFQ>;vVU;e$8Tc{oBo zosWNZebSQpq)S%{{t10=9B7y!<3MRa7Zwqu3l0%wuJpmw@9n6M+hdD94XEhqgMT7K zY@b?vX`f0LUH$RTu8)ZZi@s@pprbzJl(cW=z)(khOh8!lP5Yx9^)WeO(Kqd1>8MYm z4jCTYVDMFdzxMdzX4Rr^hNsX`9}@%t^ru+$y(I#Z16~(qsWxLU&FX@4jK;h&2B!W@ zM}17i1kf*Y)F<20zF8t}cGSnTiACQ`q1znwF*#$=H%s&a*8lIFHbJ)x_KRX?#?VMf zDuYte)h40ZCv^tdB>6T8l>zCB@<2*zY?4Q8l9z0fEjGz+n?$!sez!?ZLuSbEbg)TM zY?3^i|0*pvwOOYAE|6t9_lmCOHp|rONz2V`mZ{wglp1t)6w%`)}1fh_;sYx#7WWoo~r<_H1Zlao%`%Oh0$HZhkmx$oW|?{$Y57c>WolmoS*DYU z=xSrLOd}6zxsA;-jRpc)?&-DM&Sp8zX1SfsG8TLSTE4_<`7E1d8p+BqpJlU*MXG?7 zM|mx`w^@$2S#EE$d`=L{*LW?TW3$}BX89bOWi*-yvvVs-d+X`yXtSIEsZ5QIHp`t@ zhgz60{F80nLa*gcHp`uDmOI%jpBu#TU%ZyjwOLNISw7ch`Me;OS9&dX;Uzh z?e(Pplxb6DPWF9;F_?!vcA*;k6(eyn)j0=^^RuR2UzdegYj%U)hJxn^^Ro7=qN*R1z7L+*rLbl9m;`uWFrs%?($Y( z(`JsAlhfUQt{#hNuuMnm(y_U8k?9;QX;b$JGwD9kcTrPpz2=dga=;$_-V6V}gRKrU zcE?4-VV)d}Xj9u3r2d3At%IqA_r^I7P<>eZ!qIO)-FnBIE!zC{mt z)g$-f{(VLb8aZe{-<}<2&6-l!9kXK{0*NW%ekM=x@86nz8(&z)Q*W4iAuNRLNp?h-oq~!R%G+o$p$n@FqDVgzj zBtA7hIlE_4cF*MOW?G+;lA>vaJ>v(D=$DM$irof}q@*-1W430L=kQi@7DcPLIZ~Sy z7lVeQI&`)$@5`jS=4FrkK!Cx9~ zL}=8x8I%q(^bmlG3-C=lSsLTHIC7|my%~0rJ*n6dY4~GIAJTB$a8H(f?#FJ15xC{B zj@?Y9*U*RfQG7vIDdP>f`S(C_l1K@quN9sY?@pK{NTsBMFB>rAZ!rRkQ+ zr{?;@F$@yAjE5MBCeR;Tc01(S6-KQG#qh$vHLLL3nE?r1-rH-X#i1~{!pIt3qYrhx z#_#GjLx^z4Q`{9-#tkSPN!+b_b$n8qfHxgZn_fC)QUR~>Yc%bTYRw(; z1a!2lR4^N3ozfWvB{bIYD)fVW^LO&SuxQfwS;eIVrVlLD9x@1uw8h~%Y`LYK9Nr2H=AUz9%qdProi zxTuGO*Hl>lBWZHw~%gJFVp11^G%#ItQ|sg_O;s)WsFZ-VOL|xL1c2@h6bI z?ab z{?jX$0qWuS|3EeT!+V);@Txc*h4*qsd-CEvLlf`@cTi&0$b?AG(AW|98VL@ELKNN? z8;Li8hI>XP#JHzx?gK9O+%VUhuFuRbeImuTXz?vpe2W*~62-S9@h!`J!&MbqqBc_| zJ&Au*M#Ho?$_I^x^G&ph!;u_34! zVE-3{*Z&2<^?yNV{a+AR{}+T612hgQ)h8-bVH{xWSdc+YK;n9G;zwWZ4QveFrW)xf zMIzH@IVEs}du|ig5%=`d+;cCBBsjx8_ws0hv)ywGVhK9C=Ux*}(A_;CCO z_uO6XeP6iued3<^QJ8!Go9_Lal~NK)(O-f>YWhl7NKIeK3#sWVl_52KB{rm{uQZ3$ zG)wxqNNj3tA~c$zqT!p-mQfR^mVTNa4qEzc8K>5T>3OINAu^3hc1S(54uw|q*00ct z-ntiB(OWM=D|+i}Xhm;*4z1{|>oh5DWL77US=7I%^*^37>%TYrq49;h?DtwU7NBd- zkF#i&*L#_rG!-rSM=$g<;$%qFkq7Cz!l)UhOTX{a&y5iPeM_J}xWct~#9ZBx%J)C@ zIv$2vO}aXVtsLyPe32pa-dU-Zjr%By7xxGFG&UWpVW!-1g;DcI*Ys!U$Z1oXwpGwY zcTF-pe=^3BCbFts@EVfGvg*SqS?4hpp);_qmMxMBbE4ZiB}Jeh2#C# zst$Nf19bXR?~iK?{spr4au>V~4FBi~WN%$O4nTrV;oYVYU}wAz;$dV%a!CSax! zI(K{L(Zxh-ptJsY!`~}RdzKXdYQ0llGIY$pInlHNz^~uw zZ_22p?g_n1y}E(?{U!@9Nrg_CnxmR7-W+fLq?^E zdUyIpTTbLf{VWZI%iX;yAY*>v@Ruv~CxGOhc5yJEN{9jAm z2txFRcm#l>`#D7~_SWMkA#g9a2U_lztH9dHgc|zb*xpZeE~(g@)9ZJ4MG@(|(H>J0 zRbyh@FGn?ZugObrZLd8Zj?@VsP_aGCGdb?Jy_2d2jdgI{v3{;A-i|=Zu#NJJ`Xvv= z)0;$k%abQh!c{`;!3YxTjp#e&n~2GS=um>kL_rP7)SpI9HazwH%G zW+oC)-{RPUd`>-ZfPTnbnG1*17wNqmvtW4;$G%R?5)Xgld3AkUQ%wBLPmPPh!Cg`l z?vkb-b1E8Ord`qz$)z(k9-W1FJ3C^ZojV&tsr2l~$_|Nl@k z*I&0HEXEyM7+cq5Mr6xr^+*I+Gpi?|i_{B$bq>xAAr1bv_Y(bD(aZWHlU)zj!7B7W za61z`Pk-C14;0O#-}8<2a13pIXMn($TiiQlGo@v?zw5Xaw>^4nfUNCmG3c1J0jf(K zZU953#MxrF;7^GcLOQ-gUn%+tzuVbC+`20-LIvS&CPUN|zw^u>&dt`Ukv=#;z>i}> zT8*`17N{9ev+Nh6rqvz{=V})DcUi8@_W2QuWqV#wxt?e#TBhsq^>TfKB}q-!9WAaM zV?_n4v9Dm&Y@v8?-_V%jmGrZ7ytZO$Kus|;AAdGf z-w0cJmSbQCTMT+rUZ3meeft2~cR6a)IUZ_4cmu0H4(*Dq;r?5D@BI~>BjTX1jIhye zjy)oaP`KA|rPZS`AIcwW)Gd^BJ^k^UK2GyFQjP! z+vLO_SU+=Azu&Z8wHSj%*FKtVs;z6|iMrqY^4_Z0ir;feJA3xl>XGi3x7XHTN+`T) zOw@*RFqhNyU7CK{RafzKSk;)wx?%7%p;mA1er0>D-pI4p{RZ?St75n2MBxTS`?YrN ztk&e9wyv@J<$bR0&ELf@^a#`Z?Ke07ZSU5cNSfoSYXZQh29G>>QLdj+XB#@B)d=%h zku~M+Fn=;2ajBlusP-sk`aEO8=kIe@>Ol7!J!tM}GR-}m=i299^DZT%lC>3Ok($1e z9QhKpVrzsqw@5CMRe#Y^lTFQ=ZJN&=RWr)p#*eUS8uwWGSc_$I?xkY@{oxk-O}t_L z1@kU4%qPWgv|_8Nx!tDuPwEepbcpoYe8i^tjK!v@Im@Q`q{U`aug!rr&B0=%TCvsC zJjbRvOT^u*Gskf!Dq?P=tZTden;5T|`m|fkS-*|2U$M2BH_U&ry3p?zmi?MjZJM=~ zbTIpnepXFydFW@cZ0ffPpkD<0u6;B?OLY|U#j&WTG;NH^T@~qmgXWs?Ppz+9SE-uE zxb}spub$YN^7dg+ji;LXAWiXl)8sA8bs!C31JJ15 z`mhdx$7n$FR4t)9UreZ@5u@lK234`t`k)m*RG}0`kRb#>%T9T-*LNN?jkQO2=R4C@*GjvylB^;_fdr@?JX*ud!qvCA6 zH6GK%)W>@AVtVC8vtD_ExyVzsfmXE&s-CCitgEY@qQ$MTRd-e6!;=%k`!XpX>eka= zb>U;?lWG&G4v>u-l3ZA_GhFT6?bK( znGW3n6>m2}Q{=8mg&~^0(WhGO3e9m1O+=_^tJ?GxtuekeF-o2<-~@|wdfNadkKr~g zpvf00aq6D+C#(N9Y*R3Iyh!OSr^XB|1!W`$rHOuLfIGvf!A#nMVwSf|XIFZOV*zXG ztX;QMjiY&=vLBNM0n^4CNBsmfAHD_v_e$pY&&jb~Ytc6EajtjLHg6U0r)K4671g4}X{Wi}(b1=$-m+z@Rx#eIb?Y-)pLu5N znQhv%ZPTt@T)VT*I{U2l?c>{@gR4V_jtQM`b?$s_;(55bbm`jdd|chT_ee_SDeajV1^?!Cq4&Bdr%&I0{c>|J_Fnz_U(!D>Z$RFq-fQ5X!9y;) zZ0OKo-fQ^q5yMB095wPH^zPRpT_d#qpeam4N0lg3_3(LFr73K^aU-K$%QS zLD;;7kS+sdGc5;UBN=2XK=fQ@gtiKVRY1^cP;aKSAewK8(AI%2U|J7q&9o78A=4%h z#zWBC0-}A#5!yBoHWGk#fO432g0M9MvfZFQOnX3WnD&GEG93W*WBLY^%XA1t$G=2q zhd~!J9Rc-cItsdk=@^K%_(y0bKzU5sIXLr`DI9buQzVFHOd_->&_JeW&>$vyjlp21 zSkMrrIM8KG@u0Jq5C4ojTrGZ8=Wr1k-dxX{-G>Rz)G@2Tyrrb19W(`3-qOvNDl54R=wC}1iDbzmw3 zjbkbYjc1w%n!r>En#i;eRLE2fDq>m;n#8mO)RAc^=o+SFpaiDnpvg=tK%JQIN2A@G zE_^o9XdPbDFkY_TjxpT9M0@^)EmSQw#KTS3_dUPw`lK67U_{&ob8mIw6<^YR zv4r{iN;`znoZELBD8akF`{Bu3e*?_(e6j0ybbtx9Kecy#amsUMd5K|doc4eDH-3fQ z@^uh(CDfL$rlb>KsogiQ3%F5g9cpNB*I1aO>3;u~uLj;UDBHdC2*)!KncIQdK!hIK{q}_9Ea(5*2ibtYN&r|GOK>>)ja_<^C%>I3)VzmFUIBOKSCm){+(lBitA&{Au#6bTkHC{H%F1!)#$DnOCj;zrQR#<7tAF3 z1Z~TyB#{}ax%F|chRH~xEslX1P#CN)Op{I9A+CeSlKqgI~CF$gY&AhL1hww z8-xHW!9~ul^)DPN&=8BZcjd_Hm%3Y_`bTsR`b~7F;Ja}$)8Zt0i$K}xt~`c&1-@bb zNvwRDj^7OG_-1&>j!PYVo*%@q(FWVMclg_Zr24qF?29;taOjzifjM@1;AAiY1Fs#z zW9%S)Jfv$l71e(#1!c8kqE4-kF-uYM&lAMf$2FykQnFnr)Ovfzz#PCNWuW3=rc2Xlu^1Y5z9Rx!vIDVlOOaU}ibH z4X`)qYKyjGeOGIH%_v&;LR)U^P14`CEYg^hTa7J-?enIHLclh3ZODy4>{=B1G6YP2 z#j=8C24{9igS3C+M$!KIn}e)+xDHl>zibgIKQSM4ndq+lp1)QP$I#Yy2MGKei+jf` zraEigmvmi#tnFek=$N$us>-J!_xB(r&KHfSKP8?I>G%@;Wzo?1-OdW)wjTSEGJ-fa zTdGF-umAx+hBZ62K09WCngKOG(fTWon8Njm0oF|)vsks~1C{A(EXB$kF%{O!^;}DG znyx!rTsy{y3YC8|OiepqoEqzQ2H0oyzGXj<8Yg!pO|Mg*e~EsVrLddfS`^fMH=p~J zqTTg(a6>Ha9pk0Os+#sl={X{c%%+&moKmyh8yS6!T~>A zP)(cO^?O9xn}Ho^F=z(Xc|TI;0NT#`k&Z>msCfgc2ilLc%~@X=g`$;MFSb?rr|Lac z$NJ6C47eXD-=;o97&g-<&8kO>S%LQ>(Sv$w-gA^m{iwN(>VM0Aq~Ec9$Gact2r%>_ zFYQO7GmreY6aM{3&#?vn3Sb-kHA_u4_ajx>G~cr9X)(tJS6VfVWlFusV%gO15kJ*)V5%thp~%-C$$ zyO(=SS%T|i?aA=@CriUGtN0-7w=b0GkMglvc@aWb|E)#b`WW?4Gng7*&ge6SLWeYo}8oyUhIw!;hro|LWJCk^b9+8j!J;7NG^ne zw<4V@g5$qCzC4Ickvztl6Yc+511GciwxF1$wV$)A09%n-J8Rc1b$Z_75atO221wm*Wz1bta_7K4 zZSpI^r<&a62Bmw0ne@gH_du4=L*gBzjtb)5T{+!*tw`4htqJIDrhIJss9+igs$?nz&1aenx}B*Q zw1BAuw2-M3RK-*Vx`U}4tRn(?-zsOq)OtFl_qihnV(*W-%QAJOW@Q3%Px$tT39-0p3^QK0O8jUl8<30W3 zE}uLP!fUmmhwwoUhII2hM4R(HuhUL_PYrF`_spk#`Zzn8HWkrMA+@$}m7@sQ$2cu4UbNaG;&KBU;+d`PiB<}cB_4GH%QiEaO(ObI;u?Os4dUnWlhG$5; z`;E4qY2j5@M^|0VM`6_zpC8802n`VrB;LZ0NbU7Z^PVMz+ZJrhqWs3*Ff+gFn#;4e zZbG@UY|O%QG9C|k-nXJQr`Lz>iWiac6ow)3-T=7Q452w(WnvkgnyZpF=Y8AM&pAz3 zo>Wfb@}?RNE6bz9%8*)lbXXZuE00pGGg7SzaRgGT>2xbYw`#^|T+zBl-)({U4&^FD zTrf~JlhEfJDbbgbVs>mu=WwjV#9ckv2v-AR)0b{JeBPTmabD=qJLN>hn~l6#`7-ZN z3!RlTx$4aecQrk6Nw?`nDXwpR%%j^1TMVv2Z4Z(D!DDcg_nL)@fe61R{8YkE4|mwZ zzmnIqLwRqj3l(p=yg86oukd3HaBHML2acRl4F16Vg*^rb(KMe@4wx~R!CTovC4mTk z(kX@iLdWoTI<@edRcIX=bBE|xSsODE{t|S?4X**W&?>O41{Cp{c&OyFl^`?x#y&Zl z^D5(HE}L(^@rtue-PU%~OoFe%k3)9pgB)9+mG!b`Y-6wmCX2Vp)h95%p1@t5h*Z@7 z>e!gH4Hg)8Wjb8)bW%6RjM&fX%%MVKiHg4|y$(I3LqT##S$|Vn^9wDGaVJIRb4BY{ z(ejfmo%)6j8N%V%OHn8FVZHim(L_=wrH`h-*#h$tuUR)ZnatKAw_bsf?On|dW49Fg za_-{wG+I%!g{)oZkfGfTm`qRCt1}ht04Gxq$2?nvkzeTIU@1*zrEc#Wl;DlhK2%Ws zF~^h%`*#9!w{sU=W$cBs<-)y9>JxFbeX03@mIP7!jm>ae5r)%gPCncIT9#Qa>j7KK zx9izmi^^~ndVYNXh0!5EPvXufL_Ytvx369xMi2h@Toc-Pi1AP8?hm^>`ib_^@BJYR ziXLO!oM=K0S-THEb;XxJ8<);AEUKshXfr}FN*;x&bOgEQ>4aeVj$s9jnB}} z1x$_q!`_>~S5;l@!{_FPBtYaw2pBYK(5N63!whO|1d7-qBC{0hz)kfDP%{7l&5!Plx34esu|?fo{fNPwkQfv-902Af zmy8Fc{Vw!tLK8rT-^|PEE}Z@s3&x|r3X(T**^iN}Uc0ZR(d#uEK_6OPi+Di&roAo7 zH?sywGrCUPya0SHliCdgpl|XO%jo(2^wkY}cMEzGUC^rw)%jttTRcCkAUTh#mI4xI ze0{=Wi+K2ebX;Br2=d>qe*Zk|OBGx>!Y3dAJeMP#jQ8WVw3JBe-8!O(}6E5G1b506iHoKQ7{8#aqE+c=H&)Ba=gTATCJJ}<7BaDX0 z)oQDg<`D6+BYD6)e3NBDRY8H6|Sjv`BUl#hq&r!hXV z#2w+|@h&Zx6xG9Vj zD|Y|b(zRdWw6e7RD`SN+T*hZ9_x;~%e%U{*84c^N;_)^a0(muV?d^uhPB=(l%7^^?&v5yX8 z|7D#RHFLvt3{`(sr?c$6Y{r)z>iG2R;d|&p1cWS}Tvtb$=i%`%4=*9jtQC4VDomdk z*1|tA%pW+%QA(&%`ou7vkK_-a$3EMo2=*X4bALeB2$Ok5!N5LOs+yIYX=vF&^OGsHOMzyre&(m_}! z^jf59Q*(3(;)gL#m^qP?pE76~c!pT@@Pp;Zw3L>i1N%DAmb?!(QH9Z8YR535op%rY zY9NdUe9JH%5E{nCtTYT`GlVg9g`7JP>F)GT$9NBZk}JY<9;r*3f)E9%b-WQEUb zC0jDgsApV|lM@*JQ_)lhv{7cKM>^dhUxPcvTGkr}csF7Yll{!J-RZ|-5I(tli{YjG zRcPKDPQI~Ft~#mt!zd$Gy$V6*a=A}A!kl7F`iRt!{ERK?3ePm%$qoRizQ07n-f(J$ zq~%hv(jjRXTl8 zSg*NbI;$aMFP(=%FxTB(86x)?j825--+c`1p5N{pv;;H1}f!?Yc@Ft(DSUT?&{kOb2JGk(K!RpvWED4AY zE{s3M6&&$! zpzc7g3+fH@hM*IHIKY$Rlmq=sP=BDe1PugwThJgNuAItoh5#i64F`Hh&}g7Ng2n*7 zD`*_hdx9nby)S4g&7StQ4 zji3{O4iZ!j^mmchAE-!Z1A$%=+905|LK_0~ve1SD9W1obK!*q#15_+%9MGYHCIKBL zXe!X*f@T1f2$}`-ipZ-3YA3Y0K>rZhJfI_lwgBj#LWAS*cGoEW&2n0BwVPb4DObx6 z8^JGYcWvQyG(#g3kH`|k^`jC`&^WE#EjL`wD=m)qFD<+@=G}7nLGw){BsSyhvXaEy zPIA*_exJnWYd?^a%eXNHpV?TUHazi!d(-9V?eNu%Ei)xiyjAyIKC^@R@ogOk`P3&7 zc4x=i_+7a8^9u{A^M4|gj-QhfeWvt(Tf>*b;Dt(RCe z$XhQD=dG7nJKn&Zm%Q&1K`VHvKbFu9EXL}|l9vx)s_Yt5TDS{w+SS&(2(#)5bqVGZ zTrd|~bnuU0tTBX$^V<$b*QQu4yTgs2AQnnr2f=Lq6ooTN#-*6Ac7lKVQp{?~Jf#YY z@Njha3cg<*i5$3xa!qKw;f!BuSv0Fo&sD2oJp|D_A_DxJ0HOBIHz8YA3 zijGI|O$pKBDmksOlz0lDY*+D3>d-P=v6)t0FuC3QNIu|plGeVFLvr$V{`k;_${&<08ek@6BDDZ@)vRQ`0-_Yjr-;Yxy|5|Eu<9FUR8 z_9?CQTj+3k_M8{2prcXpElj#PY|K}AQ*7xYC_Bl=QX0tf48>`5Bp5P@oNvpF0+3L} z%XY5+%e8OhN=NJk*N1eB|KV)t;njFK)OYt*54Ucr*awG+ni zl2cP6!b7URZ8jM;)6S+nB^e1%Kbyp6R^N=_U)YNh+7abgd zfSfR@O7hke^L31&AwBaIprWqPO2n#nxeLsqFY!Mq!}oF(m!uqLiPYEd@LndUc4A8} zz^GyJNG{QW|7%ne*$uiv+ z=XN1w=~v5c)9*McBQjGGkWpS7XdY*>6J94rK9g;yDjMmPhVV@Bba`KBJbWuw{W~sO zlycET%Eg5|T&+$hE-*sT$Zc}V%tSXFyW|o2+r=*p56BMEv`a%kvliOvKO-~I4U~a% zxvscQ>VM2BBDd8~uM7kzQD?1rML@n|b1*5Ayq#+VMWHui#JM?7U7gGh{s;)qllq#0 zw&7|ro0#(Alip(w4a&!nQX4;LPkO5vqSN1!)1nOGUFu5!pA!!wD1I)frmcu)iy$mWH* z@9SlAbJ;+fSvEJI$lob@Tf@`@#Uzca`1$KzR&dv!GQlTgtf+z5y!)E3 zMAqyfHZNd;-D|DVYaG*v&HMmG=Vh#@f!G|Tm3Rf9Sv@LnZq9yJ^!r}*(#_L!dwzJT zg=%UbK7*-6>Jtx9igJ4c7AmxL&r&MlSxU#qSxRg76vRj8qtAi02wQMtx;j#6V7}UL zH9B;|Rgrm@JiQwmuFB10mCC&xA?4W5j)fJtL4IKVey!`sVb2I_JM!d4ZDp6S;R-~q zt@s7Dc2v#H#`=vRKtZJtC$UFgirxPd&$JGxS#mvnj#^`(W=oiW{)~y&(!ne+Ajw^? zcp1rc%Bq(Aty!>Yb&Pg^(t6f-c>0pP*eO)e)rw|htf+wkv(xBldINO1^(xu#8gNd4 zs$1k3h_H4rSXBct$}!aBy7|+iUN!rfKR4)J8`p=cg77p7dr%n+F9;39rnjL)Hou|B zpOdkYG@9Ej|ME+lr|28Z;x}q+rW;CRLmpytQ^rcth|L{FvU!TiGFH?;-t^N-ye9px zn6?d1FkS<&pJnYiop7G23Hzn0ff!w&)$kSpRir=1ZlCZt?Pq+l0u(LFSWyG9sd>{c z(%z6n$9k3Qcm8w@P_-tzzJv=_)j*84zkwLRI(dej2Oe@|hOvh;&)>sYt`9#v)V9>L zWAp}Fj*)*JgxJboXSk`3<>nh&Z`=IR^!^jW$L?Ov=K+HXNhY>ex-DFN7i@do-b1W< z_KQda=@Q6T$*C`>G+CQ$z3{bt2nYK-h#7hVIC7HbTGrh_Sj6an2^&7+1M|L{Zpr#A zuUoPb=-Vbu{l!AMC4K+qB||GD1HNM1WI%To$-u)r|1Xl^aV+^&y|agazK3Ku;d!ry ze6|)b-&ffZMFHPHNCP>(G|A&jU&}+0=L;kgUdZvKNgiLi1;>|`o5z=e%Cdy91@Ou7 zrOCEcuN}^`{r;14&IL@$N}NNH+F{D1qNP!qK6y^nu}zD;b0`u63r`p*Tb;O!c@P$i z%aOHlIjlA=tI8|J#$}OtqP&n>o$}V3;{tOY_JUn!P$M%7Qr~FS&#@*1hphABhS4~) z)mo8-1=g~k&sz`mn7^pn>u^IfZt>hzyb?pQ*dCkKT261R^FQ=j=e*=|DeIh9fbyNk z{xne%9D6qQsY}dvWv}G&W-tE9FH-{kHP#Ne0iSDp*!MBJvn7V$68F1i9zUQ~qLh?K zGM7M2i6k$FyP>ZH3-L>k(y{96pmXgTO#)UaEcA7!vuHlRdV~%aA0eWHlPZmZl6(&S z&9WV<;!TtpLGmX7+S_HUJunSyomb6U zmRx5j^SYf6V+^pdqUyyE6^f0OEXR*k4}w-K@JkLiMjJitJu}uG7*%)8yO-UF>Wf;L z_gV537BYlK)a&%7+h%xCRR=^{qs$ZbLs3AiJPo^wuS!0s+dqH&^h-IFLF{dsHAQ`$ zhO~gbx|PW<(IfK4cf8@+r5UR;@?h07<>>TF<> z8~Yo{3%Fu|TRDGtzKaz2FW)83J-AokFUOe;_i{lO!~Kn*S9>{5KS6H-^%t}o=%<3- z1sWjeL!eUxeF8L4&|aWZ1$_ndGeJ&o$N9OSY@k7c@_LF+n&{#oJfqDv>0aPJq7SK3Bl|bVK z%?0WuXdci6K?{I*CS#7X2xyX^B|yCeEd`n^Xc^EHLB9n$N6?KxeFWVCG*!^;K+^=> z2{c{Ma-ees-3v5B&;vln3wjvnJVCWU=L>oqXr`bwK(hpG0J=cXW}p)UJq^TChMnj@ za|AsPbfTc0K$U`C2D(ttt3VeCdK2iEf_4MV74$9;%W97EANpaP)F1Qh};5L5)TP*5?@uLYF=RS7BuDi_oqXpx{! zKqm_-16nMoJ5XOisxe#h6aL%#c<$%s-{G>S`#5mazo*;X(T$zf#fkM887ss-<^xxj zKt{)HiA_6pH(y_8M|T^1AP4Q}?usi+_=R5>nO9n}{quz%LBs-nX{^N3dfYpME#8GY zI1Gtl$HSxCyxoZVwZrymCuEa02mJ82A6v8^=PuxSwrF3&_vx?d44;CiZ-AmhV<|x= zPxi9QCxEv_JHsIhV|#Y;PTlkM`tiR$_IpT=wwWop)&B;qXKQwQb;3{j2L~kYO8Gus zl-Um9dP{?~7S~=7-?p*Tc;z8^GiHVCp6kl?jhB)2L}hShY67y-ivyQm?ZPaL9gTly zwnMjp95FUQ**S7~W2y0Cle{M-M~-PM9UM{H6dIMskIpFL8_1D&QgUQmX7cOJ5o4sz z&X3QI3XOy}mJl$oiO;Fjvomy#v`vZ1b>UhXZ*;m-xRT(gG>{{sF}-Nlk!{8nUSqU& ze@_~zyTc0`M*f7toV-r&Rq>3)2t#oiqx+eRetvpnXaUG9YjpN+#u$j5Zr5j~Ba`6w z%1m?vS>7ro=r4Vj8+R|sOn7(=_tM_$uBdIvr>TJt?03yg9;r8Bcx5V*neu>4v8x_v#+Kyd z0=+ZB%c8NFDbFlsU*lsVgO~+oQOb5?$)dldMC7{6bOl7jFkp5D^$Zss-0C-6i;|;L zdh5KWHiN{o$-pPC!H|4Grm4(fTtc zWGnIsdM}Azu0L=4oi%MYXC^v4O1cmn!Y)mn65Ts9Et#~gBvp{ zKMPkA6qSJ7@v0@8fVnAKkl!~p@1_=jOk?8dO77L`)x7jtY$!@A>och+rQyPZQYpMt z=?Dze-9|408;o7NjUIuC;lhI=&_Fg{ow5Zv*N~rXHaDQ;5Tj4;Ej7D6bRh|Nh_iC21a>QP}VHp_V8 zV_V8*=UcvmEy(9ni!=!TEnARBVyltb|sTnJ3paQ(ByB_{`XS7}=`(2@b6`<Q%F! z`E!rnf$DET-kkC7;09td$WY?#44#;=k~B)&E5@c!Ptg~Ry=nJSLy5OD__~ahq!F8k zjAZi^b;?*#19>w{EAfoS7EI9wH9>02&bQct{JKs!Pu1A{Qq@3=7HT#A7Uch6#y&hw z`&oBd1}IvZv7!cI^XGtl!N=6AB)GvzqrCMEQ1y7@Z$Wdm{Ixzpk_G9m2wgyX=y%iXn z+ke=8EZ5)tu>F|#`jsS}@b@oxd+5=-^tMy~u>DxBLfpUoy2&55AG3&AM{$_N&Dh}CFotCYXp4=^q8Pe zfUXs^7l=n}*&e-YFj=q5qEfi?;{5onX3a-hwE`UBl8XduuQL4$y{ z3K|0Rl%U~2PYW6i^jAS+fc{6&IG}BUCILMoXe!XNf@T117c>j#IYE^`w+NaGv_sH5 zpyvfG0J>GsBA~wsS_1Tfprt@B3R(uVQ_ydLb_u!>=EoE1Z@C%UC?HrHv~Nm^roO^fqpOOd7ys@ z+6i=rpqGK(67(uijUcvW+*Pgi9Um(Dj+fz$yYF~pq7qw+2NaK*>VP=i8M2!maKm(a z_lD^wE5jX-&wwPmffRi%u@(0%SACuvyZm+#_mx(|B?~6pa55WD z`CI!=n>|xN!Q?3@Jn(MqJB53OgJK;2_70DKdp!?|TjGUr{M$P`{_Qy&|2Dup{teUu zP>kc>-f3I)`r(PKbq{|#tm^ehd~kMrWL~mL^mFcWd(u63`7oZle59PajMJ8R^zztz zaIb6!){cYocf3R2BlGtBoU!DYjyTUTu`9M3taNTvF1n@p zR#4ru8=HT&Ytw){CfuG}0Q~Dfcw%sV^z*8HCG)y5(W^edfoMBkkF6M(6(3%TTeOEn zmw=3aBREo|U2H`jejWjMWYwDNJ=xd+UYxj&S6D~e#8x+p4=#ugE=-KoODPg#v#ZA( z5|Kld2L~Rid}*Fj8FZ*JIwJbOvBX#`KI5UvyrsJU<>PRU`FQ2SyLP*nJIw>H-M*DK zUI*;y?#n5+?Xjvke9zFEL66-(xD=D>bz9W!*tY>caCGX?@5d2mbZx<(T)B8odlsQv2qJP&Z z^MP#dPG5^Pmoipey)B90B@9YSZ0Qkde|Lsya< zY)0m(ut+a`^HSj_8HTR@+*)UB+_Ou?j$<-Qg>XGyyOSXJpxMwqwXb#v=zPgt5lq?H#mE#&>_Rnh36JhA=HvQDLcdiTZ(vQ z_R33y&@jc613S0>HKeq#wdIudJSuXtdZWf&zd>5>oW{V-kxDl$}(Nd)%EmhJQ-&_Jet zsdvM8fxja|1p$G#47Hv9FH;cSkLMu+Oo%c_Gi3_)O4g~sm@*){&HYEspv6l*A1^{14m49ZYhKvY88w0C81cVI;J*Q5zx(K@`?Ay5(?HIA7?3mV z8Z|1oq|Y>_=ym=QYZ#Nw^^PFFNGz94ATJ^rP@E+3o$^L}77; zvKz?ypXr{bAAEIh_O}YYRTb?Hjk+&8ed%fB!Lb2(F#e!M=#?2GU3Mh)waH9+1Gz9W zAQx``_9}R`yIJjEEpJlSa$~@h*K!vp&-1V4UMG8>@pX1|hML23s6OlRxa=Zt)N*iy z?weQX$eh_|YU+!O+OVE}WEvZ?0{mc8WZ=Sa8~FHXs} zdSAR3m7(EE8Zj!nWy5#+QE8w6jMm>VUNjQn3Nnm_PODE-CI*hqP)R0LWTWi(PCtdx z$m~vfPrR2(lf#t+rcx#mXc8{_)S!{;2D11<-2?Ulzg+f^2c}S9;2ThIsPUO1+tgv; ze;TeLFb-*CLN~p&8&`L@pWOeD&E0`92~^WSOkU7?x~ta77InnrR~f2EBPP=V)D&i@ zrh%B`YZYFm|59{NLR8Z+kBR)6j+qgYt1NKu{1F`B^?}gm5FvP!* zd#t{Y+gKd3r|OMJd~E22+~)F-*66C37jmb&MC3U5OJhFWU0<+=7jhTlLhcsT!<$9) ziC*jLbkmlPd>nUq)d8$ zX~g6%-6gA9=c!qep_&F_a;l+1cA_IDM`frYjhMXbZ$Vz?sacJQ`%Dt7ftXxosE}Rg zh{;(Qsz@UyPZ$a2srdv`sErttaax7fWM3PuV9S2mh5zW}@|1MWP)P&%akExXwN7r> zMt(dc8^Qx?dtjF!jr{mgfSO4es%ao5&-(k#^@ms_T*dyjTN4A++?*X+vI5mK5R)9L zKzFyETeVyGw`%*VF;j2V=2F)}e`Th5t9G3gnq1V#RhqU9rTu&YW5Di~_J;sdYEWhd zG@uvn88>|7dW%G3)z@hkI?(+{$h)EdIZUJ2yC}ZWWiVe^+sz#*Nof74-gfYyGr& zeYUlJT3?@St)G_bv#s^hq1R_0_MMlXIa8Q^mE*pvwENKxRfUXA>w^nV7_9Eh#u{WS z+_mn^mgVvlaak#!7*IIYyfa%_AKsbW7-pfqfu^5f{YGqc%lJqxl1^+@mu7oQr0ZUW zd~Lw3*_dM7gj=((#_*Zkn$1P!QMKNj3zpr5%3NRWEjK@sYt6CFJo&O-sGOI4Hf37> zVNkw@_=}d1__H}T_S6-s{pGu|ueKVD&r^c_Ii~p;bkroSKHr`gjJW4Fv%W=&4Z+3k z#`WR6x8`b;lwwI}E`csa=IO!7V%(dJ;pwYm)z?BN@6Em`WkJDwS9iLr-UBQ|=y3F* zB0D6p(kLv+Z7IRshK0zPp#Jzr#p1UJ3BWsL20(ucYMPCsw2^Y{H;kr*kNS~o|p zh%N2RQiShtRG%!r`grU8Bd9ajrcuD<{(#)3k-QaylsqzRU&;K9a>@2mJ!VE zqZUQ(Ni_zwa$^K@z8k%o780iYj|(Q(uB}db$h_+HZPvi zWJ~U=kfS@jPoHiXs|kxyvV#`xkAyximr*xPBk9FLvdgtbv88t+0?BE{Iu36T_RNe` zhsKN>C*3hHJplU!rrtyI$Ni+sIDgt1N$8FAUY)U`(0Dw90aZKuyDQ;|?VcGkj98%> zfZdJ_YqD!U$ z&(h4s6Eh61a$%`7gPpxvY_rj--tZkz};79Cj#vgS~*ZZq4fvi zMtO`5;~98@w`-pFSUApm;LdfDgg_1^N>SzcV0_eiPKStGr+nhf^JaCPHmT{{Dret5 zR769A`Ap?Juw0=yQ(+g%27Y zNG=^T7!4Z^c)QHx^)HRM3d6J43riYg`&4(bAXoIgOcwu zDLpB9u1V=d$>k=cHzmJ^W%yc7Z%Tf|r1YWW2^Ix4#yQQTbSc9z4h0saD@5L(YXL4n9vG$XQZkQ4qu%VDB_f*DeUp zR;;2lD2VFK7NskqI^CjlLwL$9N_Qk;8;jBdlHWpM^CkCyWM2E@Q+h)3Qj5|Hk|$V{ z-jLkeqV$2}7B&Tv-z+pFcPoSBRTiZSBwt}sxF0(0+oMTaXAXQ&&Y3k~M zRDIB*Fn4}!QF`@2-LNRkuVEI2`PIRuK=Qi>8oIi(M6I?cEK$oW3QN=ki^39hphaPc zdZWOU%rHMx%mi9r1sUbDsX24Q+h-42$RyQ43f8Ej$iZi>H^7KElO9U^Z#OM+vi~p z#w-eR@HtEx`#j9SQ!EN|a4#5q9_HXulhT_x_%s@M&C{DTrG-W53dw_EG<+U5zRO@@ zd`b_b#znHso|+sk_ahu+$xCQCRBwv^9OPWqalzlfstm^)?m-LHww-K@m&T-lia` zdkak-TB6Msg_h_xi^7^)X;Em2`r8ypF0?2ttM9Zjbef3~E-)B*1iDp?8TB3t33ajqRum!#xTB2Jm3d_cLi$Y7Z8`eSl z5=(T0MWH1cWl?B}{tkQL`(k;%#iGy>9bi#tiB`aZ_`Ya~23ZtZq9?(idBhTRw~A6@Y#mFK zmtu*KLEu?bioO`o%WHqv*SAEsfWoJlWr>!yBgM2tBTR}|qShuwEYSfbMJ&(Q&1AlZENs|C0bf!Q4rO$ zED9~ru@;4v=m3ktn)~5FrW{(LwKfHkudygBs~1`nTB6Ywg{{pA7KN7RFq;C&5tAa8 z=*>1pc)HON{n?_hh5WTep(UDZQy}?Bi$Y8EWuYmVmS}@TVeVXQQP?KTwJ6N5lPn7J z>mZu~$*;6BbcrQ;$fB@B&9NvfQ9UdQ+p&MOH07{Ft*|Hz^W_$WVeVy7*p7XApdm*r z(F&V_FrR5rn9c`V6k4L23QRe)L?>AkR^5HDjJiDcpe4H0qOffI*rL!9t%GIMzQhvE zvM97f$5|9wq6c6HeP1lk7g!WpqE}({d>&e&MHYpYsK}zw5+z{uv@fwl-{7ZDp(UDR zQD})?M8oUzFb98ZQJ91K&|LdG%)!|fg*kYHMPUv;3>&9?i6!DnS)an1(%qua63vGF z@_E?!J_Kv!Q)r1kgl+OEtleEL3N6tTSS!ubrL1R})9DCBQI@C=Q}sxL(wp`DuV{a@ zuimUFkJ%LD*WES+a&9mwV)gR1u8Q*}pEqZ6B{=w$V7$`&{z8`3v3ku?tR6BNJRGJy z6R2ie&wG5Uw+a+K`H<|71pWl+NMHW<*KO?!ZxY`d8U2I zNZ>=D`V^LM6b6IB57KQE4 zh7!{k^Xn{&!u?4AEkN3>aA&OQ4r?iEeg|lPLat&tGE0hlR~T4$)d38p4Z0Y zq1F3iYm>sV@m`@xq1EeTQpD;#*vjDPNvp>%aUBa82|UE2usjbx(Bz@jix-#_T0I_7 z?8~9mI~`Wor_kzM2@9(!V)gz4d+JkY_1?x$pF*p5m_=a@mZK^5d6|e*-(HeTmh340h0`(CR%3tLIZ__3nn%^C@h6{{XA!Q)u;WfQ|Dhtliha z#`zRlz4;M?(xt4dyTfCz$>Wa%GSw8toDoB!!O9@;^33_-micOKjX$4PM48`%N<8nn z6#ipdG-O8|i7gwAQ}Fq7AVq2!Qh%QdaYbMVn_*#GwF$sv`U)- z$;~YaE!y%D(-$pTUyH)r*$KPjOJ>_L$D%O5npqU)*B@Y;d|$L^Cz=$oXfMJxX`b#Z zQ3qQTmZ&pft$ZGqs1ISAdgQrIs!u;Mr zCWYyIv_+vsJFAV!LyPuCYm>sNTWV2g(Z&~=JS-b`wlXQSXm7MMC}Pp3S`=Ee-yLZ3 z@H_6g0+Yh>+}xtjqLm|Ybo%t9Mcaht(WlU&HM1yen@>ekta-$uEkJYaQ)todg0=D~ zv}muuTKN>_pxiBuHb&aaUd+LPuvR_~b1;qu-={DK3oHtA@Ko3@%_A1=QrIt_A{Gty z%cszyy$k#0Q`q<(Wl?C+egTW-^RRZ0fqC&Mv}l817&HYIt(&tHe5Cjzif=-nqL|-S z$c{ReD3)T0kgee1vX%)zS%nYaAI}mMy5K;|5{*QP(3fwC-iCHf5lh5tG&Dsl(cvaV zED^6)(LC~P^;44~mS{KfL-U9wT4++l5*3;hu|(G+r?oF;pwq#mh$XrQsjqqD+v;YM zB9`bIlxfW)mgqE#!gk}fE+!94-4ParrS2T$y)TEQ?%d-{3R|}KV4Hj%wrn4DvM4AC z|ADpAJYtDnhqW>&i0Wk)g_fwuqRQ{mzS!EFWl?B}K7mE^dH8L0wMh|6bgV^T{n`W@r+vxX);NnoOY}7?n$N>;tLrTa zEzwD^Xg&`u(cfULd#^ne)$xZsAU#~C29-om(Rm6e*^pFQyAu}EDEc^v#?*9M=TLn`xq32ISz~FQ)r3! z{pC|=i9RkeDYQfvTNGB^+Jj6UTB48Jm=u#G3UlyF*e{>L99(2kn1fHierX=DME{1h@+qt-@4{O76k4K}VXb@$ z8{ZdTt$YeC(MH%NpTgR`4z|gs&=M`rGALcjkn~(`Odfwkap3U=MUN=@a#&LygAap( z{JPtwAUrpi6zJ;haH+J?W!gAobR8RaV2X`H@c<8^ESBxQKWsqD;hHw*I2W{X>W)mJ znAMToN+h2I9~I}#x@i1_Ns}j5Ou6v0#^5nk#f7-8t5p|j!*QHmNo+bX%rCaYF zJ-YYo)1#M9BSKH7XHPJ8Ekmm)uf{bS6zT2!b;ET-Z~QS9;vswZn9F7P8>QBH9+kp+ zniY71&ci(V;{Y$#;VX9v`kF%mI+3Tr+k1w+P}g_ZBn z#yA7OH`3*0`71AgUSm-$`Hq3Wap1WejR_yL=8njlFlUYsJO_Wc7|Afi=sx1bNU?BN~$s3ONwgJy{W*8pW z?ofHx!;IgBKR#jdZiBoBTpq<4E^lxNj3NH`gvlF#hJI>^uxKYNzW1T~v>JbW!sNYx zcbma;8yZzU?eG^SZ#TMid-2C7Ox_N>%R;B|Z}{U=Uw(AxfMsI%;}a(D6};;Qo|0pQ z&0$i8g|9C<*hBHhCrsWpyc+|aW6?e5qwA$wl0QIERXOjAPW@2)@d=anDe`v=`N|aE z0{jyezM(zvnT9_;Ve)9^W`O4cgD*_pufUTq_=4IYrr&konT;+1A4WS&-mx&z$K#Jr zSor>gcm2Whk;~T_zr*CMN2g;4{`iE+W3XNUPb+jh_@J*7D(`ggRJeR$@~Cbaczbp3Xl8z{4&@Sbkgzo-18GFTUv7FiIcck5yx)6A{BZ>-aIF zX3jphqTkR{$BY_QG2y~#GbUAxpD|<1q*)acXHPrtmt&MWY4Sy5@K-To+Jre{=FFUe zKIxb_v+*}&(!`mwCyznLY|MG*&YC!8=;Rrb$IqEuF}HV55-Tp6F|qT^3DdC=>%;@u z$mYrbQq#E+{qJehCeEG-k(DLwhju7AeOBeP^QK)g?fi2}`e75(v>B6UBe+haW#qs} zK_r$FEy#*xwa7XkD?h7w*5Q%EB8NtbBZows_RcZR(aup$sdFUMv~x-#Eg}a*@*~Y7 z%_2=P-EufA zO#Z=5Qf`22SlbIIG&h8HHWjuVp7bTDa{1c$*S0t6Gz_a7#X7G$o$*GyJIf zqRsr5RgBy5R2`g!6R`h6yz7ay1%9|$*p;nt>*8GCeV z?9uI2YYL$C^@8SG4Tiy>R(;cK{)4NVnlhW#BQrj*AU?1#KCmc0uz2CtJSD$sO$k(_ z$~T#ztEB3iy!kiP$u>XpYnl10@Kx=nPcA~@C1(zF>Ez5oa?%1<{|_9WKSx5Y(z6Np z8%)n^q$kTLQW_b!ec{$7BH_8%qhBoCl1&LOGF4xU7sQ8TBU>bzRcrG6ltjGps=mpZ z|HR5x;#{=Jh^!D^$Y&e>^&a*n(`s1i7C(O1)U=_)r1jrQVf(TZmH$?A%&g)Zm-&! z3lU#Y44IUsW}>MswW(4kyif@*Typ*R1(l@l*Z3l05}P>x;y8rWS}R3nh&P5-Z}$Rw8d8(@`kM7v!FoNGn@v z6?}{2bJNOW@bZiqtg&hW*t1nlfI=*%3b6@Lh?QI+nmL8o0aA!2OQ8uGouknVjV{n= zu151U+K8@H5B$oJTjUkOPlqEJ=0j`y|9n+kCRMR&3o4>pNL9WU%zta7Uk4>Kr5bwm zOse8Czbc|)-e~@6_JH@xtC!7cNpY2Ub@BHN)kVL`n^jY_7DK+`+h!69FI*B*5G62m zh)pF-Li9_d7rdrs@QlKjr>p452CHcGq*BLi^a85soop_Zjjq~)ifW~I_WZZR055Yb zaMf1SQB?_4TL+V@lXT&hCMvWlYz@@W)_xsb)mo~bTX!Yl1|kuW8mzA?3nkTzy1TNK z=wwKPtLw^EI@yH5NVo!3YgzkLtyPG%Rw33}g;;A9Vy#t(u0pJ}3bEEI#9FHmYpp`8 zwF+*gc#YTrQnX7nx=f=*8pSobQlo1%x>2KB zH3D$%pkq9JfpeXelHMw1SLL+PX}7Wo;^g1Gg@biBpQz4zt_L>s%)hSCXJgW-e zjM|f1tt9E}`@*fNAbs*7zWXImza?=@UFF-r19*zA9~bC~J_H zc=5Ac{s&=vNM3wMzLF2Y!cyOtc9Z${tjvZAzhWC70!$E=ZeN+VHcu-?L zc0GI6L-3b_(I^icqEU%PM`?7dM*M(Pep%BM;;6DhCu!7ABbHzA zjkap^tVVBY#Pgn%51x~x5YO6Dh-YXi#IYuYc(#*5JgG?`p0=bA&rVW^XO$^*sz!q~ zLLeQ^dYR8){K$2>sc{K+IDv&(f4Vfq6%zb(S=IC<0@VX*ic>d1Bih#7LER$KZmgNDK^t&?eOpD+KXOHF6CB7I$#LaK10e>cl_{SjP^+Cjk zOd?{(U|uOS{Lo`YEAyrW1${&i5go+TP@)E;65lX&d%1&CxKlZw3L^XL;r9 zs`((CD7Pa=)#lzoKVFj(&x-fWu3DE@n|n+F&=7~_3Q;(bfw zecQ+Tc8d2ci}&pw@7p`x_r$7o<+a%b-$H=<9f3LoQFY6>nUnQ~!0KXz6s|Aeu@Y(Ge0)#UI}0ij>&8m^!qpb);Rh%deB%#2)|Pl`_&bf+rP?F# z)Rd4J)zcW?twE-yeCR~+)Rgl@e>&`0$mdOMH#~u}Mg8#9j3eJ9I#cQJ)1!7c9{=;E z_98qhFUPZ~$y~gijAx2`?%)IbQV`bTE6f>(zZ~|5U4%?_QEQFxh3L`_*N8D2hrb-B zgGL;MP&Cw87yVeHz8amP(IAb`l)64fYBWxx$r?@9Xr@N!3b=k5t#SCvajG<0qR}-P z-JsDe8vS0Qdo+4Lqcs|B)o8m$0L}|^jHdz^B_|6{4aw=094TfcWKN^xNHHrXvt4om z3yqYfab&JjX!_$Z3e6Nes=SQAqsq(1CQR2~ZftTH{#hc$W(trhHVU!WD8yo;5Q~jM zEH(-;S_-k)D8yo;5Q~jMEH(Tc6paN)Ar>Ho?$U?_NYPekv__+i8vRux0A~js<6-D?ovHjJn%5sr|56k!3V)1y-zG*||q+tdX%q2E*|>T*mkpFVu*0`FHXn}(V-_*t`o&SpAK z(|MN8^K^F7c^Qs0D>bk3=bLnP(|MOK*wobUpo5xE`15W&EBRDy7`Um)UXX6YGo|J$ zAhbZ=;2#-xVbhf(8#U2U$M{QIxQccdkfQNhP0^0iG>$VWTDhhT(lizf<(DnE;$w|e zG<11g+W8vI(TJ_3@_`PGi+-)q zql&=BCM*Ge+}MO;0js1WFbC?E1Vyt;f}+_aLD9+~LFF*I;Etm4%U01wYuecwP0;8Z zjhF|@?*$rNq|vW5TCC9(8eOH)Z#BA2qZ*AK)aWsd)@rm_BLHU`9pjk|jBoWdlvdZQ z)Rvd$1g?33AT&Jd-KW$S}o5L4F z_+mI6rm$Ml63N1gar{}w-e6f!;23PJ6Ggypr;j`7ET?lX9U9>p)|Z-EI*-Gt&BoHA znl=2nfezEF=4m?5(s`cFPC75csg08PRsMXF4(mqEyL3LJ^9h~3biRU9>tr=?HZ@rQ zctE5n&>|owhiC~vzR;EeH5arDD4NB$zXgg!iEadPnh?=8V9}IQ!zx*mO(%~|KAi$O z+_6_vM5mZe37t|p?df!)!;_|KIKW!do6d=FYO}C8qNbcb`_manhuaQohR_*KXEdEL zbjHz{L}x0U8FXgRsiZTP&OA7^kw~^vvw%Mr(OE)gDV=3>eoN;@I=9fdoz9(fmeaYH z&I5EFrc+DjaXM@0Y@oB5&eL?BrSm+UopfHN^D3P;>FlQSE}akQd_re0ov+}mM`Pj8 zT<36*)I|qq)Ka5jjoN8+v_>5@>Y>r`8uizRt%%Y#Ory~nvF%WA*>)(z7DFMn7z(k) zP-uZhY%vs#ErvoYLJHla5$m|3E!XHz8a<@Z;~K5ih#d{(_bHA3rqSOu`lm*$AIe8k zqxUuXSR+;!#mD&rg>p5@*XTfvIJ=QerP-~42)`+(vsJFb? zKq1~!pb&2zP>44ND8w596yjO_3h`uqg-+3EkVYdlI!mK*8co({x<)fKs?_LWjV{%w zN~0wjRcmyOMmK15i$=fK=q`=!(dYq<9?@u(Mo((AL8C1iZPRFnMmsfnMWfd>dRwD+ zHTp;+R6K_}5X@&Tei(Ne@ModCZ(?!*^Xn!TcF80E{|~Ka(&XbW2mg6X6ZxA7k|TSW zItyw8m)0T&tC+ntO(j6BgjNcdmLbRCmj`)sWXT{uOLLs=a1RpH8}5mMPJ&w`s4v`p zf(F7pP|zT_v?V#tP`J$njf6Wy&=|OF1&xDyx}Yg=TL_vCmz|ItXBJ$3UgtQKaK{O{ z1TO7gj$|%< zg?osg2jG?nS^+m#&?>m?1g(KvAZP>JBLr=Q+f2|lxJL?lUR+Av38dNzfRyi?D$p>t zpZIX<0-%NO^8NtJ3UZz)rS1U#A0TRKaFvO}zz><%j&&3k$nXDlFwFAqZY-a0;s4 zFHfPm!O4gBA^6LYny+dm>#`?Ww1CXkto%LG)rw<)@RMPwwSOq6gYjA=YNz)Jh zRnjmNYTcKgG^YxUNu%18`jh4+@a3vnvK!Dz(qRVDTOovFN53FOo29Q1f2x@f;5xVA zUssHlz!It?3=~AxW^|0F1{edNq=@>&v)a3A&lrFa_$!o*{)Heo5;y+qJ<9>ic-WDt zz*`lR$$}V}a|N*q%@zd5jU17B*o)3}nmhn&C<1*)g2}+e@mDC#HA`8c)JbM=p)|ux zUX@}j80Pa3exwB0m+zxQ|I+NmYbu+F#`Vk^Cbo(VlTRrhEQqmLE{N5Ip)ZuGe5oK- zoGL+VS{MKoG&V1MveZA$qxkp#=31j{Hv}pqEZsJR;kGF!r%;BbP^P3%ewjj9l0vyL zg>q*K<&hN1mK4h0Qz&~xYlJn5wg}SDz*pZ946E z%ENot*1&WKkGw6X9CRKP#oWuEhZpwMS*aJ6G!-7Me`hUs2Aux9AHp--5H>~JnIABa zpe(So|B^gt7E-mdQMR==b(m&m%Cp6cM!1fb+Mg~uq`$A7-%@;0<|-pZ0%u3sCcVo7L7e)o3FjUtDQ%v*jF0RX4sO|5h`YBq4kMI zym|724!s-60_n_vOCi8Ls4mL^57Gmw~cI zr5lR$tdcuC7D0u8pLipsG?=|6$y0&us07q-dwkXaw0Wt>5XpkG#Uy{-Ue> zP_2EBOGz#BEXB62LsN9I7ZQzdd}0C6qZd_n@O5$CkI&&+S0S5xG>@seO7Ozgb$E)d zcEZE9EP_A#kf8RIjHjLGGV_bMZA)&KBKb(+VSb@0a(=Ps&FB1B{MeOzq>jbuq~I?# z7NsJGZ3RQf=g1UYM}ZoR{0T1W)mbBNd(G!Q%hh$1)-~IuIH1^v*d8r%OkGE%=sHGt zdctMrc5b(tOMG2buH<7xmziSiQzRdgA{p6?SoCov_aFDra9{EbuH+6Wl8;T1+#yAB zN8$0pocrD(fA%Hc>q_pJBANMS=W@ps$v+Yvu?Rq)T)lRkFL|vi`9~>|JEutgQHtc_ zga-x@d4!Lx-5*7K$mlVleQzUmu zk=#vq*#1+@FF*SLjTV9}&wpIW-BKiX$9p@SyQN6(Av|nvDQ0)ef5Uuvl5<&o@$^WM z%pA8R_ehc4OL&+j>|?EI66x^t!$!4>{@Yg#iWUIrd{F@3~Ajp?Yxe1tF!7ZP|0Q8y~WFrlu935JhZ zDOy!beVKk(%O+?=264PgtTYl%C$B~Hyj#Q|@1Am#(Mu?khWx?lXCnvU?6Wx|XG|P6 z?UJ9)o~^^k^UzL18lF09nwQ&^h^^$CufZkwIqP{FlHzTaPB&MMnK_=fzA4`PH)Y;;eT_ehM3o||Sn=otGg%dociE^5pqIoH=X#JVY zXKLYfOB_WBOFzw0r|@?b(YBbBN@y@?L8;Y<%5YNO&dZbiKZ;LcYfc7?#k39~g$J2ov83p`a27)A*9eG}(*V17E%Bd*P6O=Or%W9NSi;i)kCxK_ zAB6=Nk5-sZ&}o3#?4FoU$Z3GNb@<8yP6K3*Xg&CLxV*GMIIqXbR-Y4MWK2Sbk z@nvtSh07z1aKhqy0{DL3fV|J)e?*${24nbSEQe6=goW=6yqN0pD9-Tktwh&t3%hT4 z!sK0pcRO4jVT2PF-^uujzYu?X!sM~fc$v#1jBvu_-3Pwa4age+|C`g4*8;;dyk3M) zSoqjGZSV33Bb>1CjRxP;2IS3v|JmUAhs(#Fa+th-gC`4L`h3E|cL)UJgXb7lJUr|l zhspaXct*HEf_+UAhlpo>m zKK#x4zD`fO@VtqYjd6S$!d&-ZPUXnQ4L{-4!ZbG5IkFIeLn1f^?a4N=6@|@4CFW)? zIVkqz^$S2HAu%_9$w5`UvoDNRB?~}jJ}P>l;?uv2&SNfN>BQPcDtE7!rxCaH@xA zMG_|$ZU16Pf%svx_=sfu%LseI+s9TM2o)8e8#Pq9S`qE2c$k#hK-b z@w1JPhD1}$|FZzUED!ngAc+!NaTDJf-b%DLiLI%pP`s@HKfLiD!&`y&wt$IbdMg%h zlm>77$MBY?y|I2+-b(3Bk~Ov>UQTcQ^CH{#O5Cz54^9kcLR_%`-jJ}-%}DAFOx-ir zBf(=U)-cJ>l%!?{0{`R5ktVGJP_9$;E{b0f3SXB|iFu{PiGz@!ZI%=smKc?t=t7(r zoz0(@LCfeCi3_r?7~U%q{bzNjZm|_-J4?ot7USPYe0XUgn0w)OtHkI$dbl7vF*gsP z1076DhMyFPJvpRB^o;Dpth^<~UA-UWc~=Z7ZB>C1F(@l?R@H_)3F|co8)Ag;#yFxQ zOP5en7VboSO~hY@J2FvOnl~!;Wgu79_S+uf84CWjDPf&?fx61)9f#=(BNT+OTZ?o1f?>i631TKc%odeoArTl)~uR z_$j5pof22BK?$hZke%2hA}Yp8!gG9_=~F1*Htc#y+ROSYl^M;VAUb{V$AVKZY{bY> ziM>$W3Ave{_$c<|z!s>og(wXL$ocj|65CV|uauOiC_;mhSS@*Y{Zz>2L4#{Q+ZkPh zpsam68%M>RuybCk#BZ1ZYhTUoxVE~#^XdsZFU{Ncn+Mt;raKdx$bG`@dCfY$Slz$n zt0(N%?{+VKXyuiDkQ#jCwBsLnn^Ik*&PyFlb_3faA6|_)X6~cb_%^~qZ z=QOyibcO6fs9KkwxNVjMU^T;$*tqF8yYVj{C0@w$TaRSyvpt%YcTSQT>~x42WB;u4jvYJSvJl zs~QB>|0}zL7~KqVas2fB#Pz-TldV8vlr#jfC$BsSr0VPgz1Bb?H6*d#O}qlPIp~By zF<%Oug>V@a$ts5(e6u+ij^B3R*{cc+`~!IL|5o77v;&{Go+&;`6}M5)j+Rc zIpd-_l_@DXLbIdt<`y7Ya+Np#3#9Us`@b&iP(<^s9u-T2f@1MBOOZ_D zZA%WjOvyzlVP+kPMo`qGotk~d zi)Z_ip+ug8A=#etR0~i{$p@!MW*vz}*t1}p@}I-jqiy$M_>~fj1tcYP%JZS(%amN4 zB3UgQ83#_bP5=7MSxbD$F;~T5D$GVZ#&MHqgr=S?^2ApboZ$N^b$xLui5=4t@nwc5 zY~hG!hdbTs z^^3CJ6{nv+dFbRRUDUJ@J!{%PHK%9MMh4Kj`+h0ywDIRoK26QyN?7_%t4rY|=CE_8 z%`&19W5+X{zCyC7XNfhjH zc*&3Jo`&mo9&W>C$V$uZeg_?!1V zj>%TcI&VV7wDTuPN;SgxZ23f7bXqqRnFK9ji?eH4BKc^0#tX(j=KNP`_mt)ZA zcX1njHbkLwn&27X^0841T9ZI}h06mdPnf)M;G5NeypE7?Nt*Kh0KP{WkjL;nnWnro z;CnU=d4Eq+-b>)y(}27I2;YCwly^cd);QpgPgs7G;oS(AM;PIR<;P<1UDtrT3i$sW zc)l_C!sO-Qo4W{qe8R%l6EBVc&uD&WyL@5tCV*$Q!538i_$fCJJj)EeFnKqF=Z^+o zki1hN?_uzK?ef)EKMq7?YUi%k2#fF0c+n9&XSnMoSf9hfHxoSGdW|r7{Ai7Xuhx}U zU-+H|&&w`fee&J{PwRXL##5iX4&dqI@`cIk4;lTybGge`Uwr=no<|yxHwE&Z1kX_% z<-k*)ynf&r=JI*rg8^kb&3@?jZqv@|dQoH8wB3w%k`5!q@}@R(vV^M9H@6Jpw|ZCy zbDj14K`-VL!w*c`aYp{?0*q)>FQmJ0EyqaX2PTGO$1xo^g!8-cGxFjm=Zlbzt^`jQ zwbqgEz2bmFomZ}B*|PLqPV^lqs%7r*TTb+~7fG1Y!F*a`Mrmnc7uF0^;o77(BGtwB zR2Tmu@$B}!(M^f>WA|^wd=Tb4KZwpKExH43< z7PUrlC$8oc9;W+Na{3N4b(pXFbp463MR9l^5qt7(8N&Wg?EcT956bBFzdv1%l?aK2 zc^IUMV-_opIn4NsQc5oVbbUc(QR1e2zACC7n-|Bt+L+R*@u@hjI{(x4d3;%*UKYP! z=Vf+f+r&+Ucv)TfeqOvt{LRW%UeEq?eYA2=?8ygDL>M^%_YG$4zW8)~7W`aYM1ci~ zt6BD_dq30vmn$i&)FiN{zFI34TG z-0sFSWdUYytL)iZ&d^rL?CowOW|2FCyLo;N1QqRRfqC5Fn8)3EX*0}l7P*{*Fn!4> zWE7Ryle1c!kw~ye4P{HwzqDj}!SsTWXADjJRgw~v-eAgy@DsOlzVk1fhusZwclcvw z^EW0;SwqUF=S|NWc}Aky_OG|^J!AX6#9tALAxh5h($VlVFp*#(AoJ)Um|ayKhTzQ% zS7FtL;hg6@bNzCp)sOI3=zOSATV%hYf#lE}XCVFz;W7uO=B64!_-VFqnVmF4 zK0Q)>Jv9!sG|I%{^oX|%plU;j86CFsOp!u4xxudrH0pf3hz$j1<5Y?)?!?6FG%DfE z$D%lpbra^P`LCp6A2lo6d06#r45zz@W4beJB-)-LVUe>=4CZ;SomDZmYD4LICb6m~ ztQjhF971W2KUHI<05!#5mLqonIirBT%Ne#ckZ(WcIDHhaqP#vxx>EK=E%rqCM4b|O zYaUDCQ8-4e9#YIrbM$S`nM6~@#rXvoRizK8*|q1PKPP1ozdGTMPZQB@N@hc8OKy@P znf?E0#On$C`kYJN^Ce>#U7p+&$$8?-96QJH7@(Oc#=Hv)^I(z7{H>cBOkq3BVVlss z_}i&5-j&Qv=yp2O4A_#xHkc1^W!UpPvs|j$U~ZHP5rqrK;`Z zrew;r!yLAGoE;6O$fRApU-fhFx1jJj5UIfu>^S#}s~kIh)V!P-i?FTYG`-X{e!y|l zeO*tulGRpm{&?1<@E=Wbi^uu8UIB#zr*@)Yc!#0nz-Qj1^ z|3}`Nz*kjW?ZfBhUXlw5+@MzsCCXK!qCpJ=1Ps;yAq)a$fCP&qAOsU+42fckN_rV` zJO;7OeOrgu+S2F` zRx5RG&VC2O`6;5z#ScbDI-Ii+9~}>ddu3KDb#BgnhrVsjPqnr}bj=VKIxEgR^zG%W zR_ffG{f>C^D?@GE((8vOI-G}T&R=9*j$a6J-V~d7k;8es=6qa=%*T^H;Fejf%T?hG zy*eZ3!{8ZSHLk3p#O0fgbACM4WYd*4ENfU*pYSpat6>$35=%t26PGPKZ&7LE{G~W< zrIvnpSZmVC#L`pBS`=b%mZBCdZ(Lf-B?>IMEo-V>(O9>zVF3?i&sfpBZe0!0tl?ab=-PMOZz-4RT7ma0$B#DO==ztmdR3CJ3L#^`#SLsdb}vxhlU)WJi|i{As1uk3bqtU7)f^9TRF zIdLk?>)1zOeiqs*QkZ`^=?e0zr@$9&K3xR7j9g3XqT;5fn`L2tur@2P*`vGWv z?4t9V8@wMhoi4hb_~n7$Z$R^&rsD^|k6$lDeiQ|OV>7beGqU(v@ zAmjztD89{JAsos5_&orc$26Uvd&l2c$Jf&<9 zrG}Q&oZC_HE~~ig3HMCMnI>(m4`bwz*|HV=O<3j2w#*W|QLbh_rgYeM zR2*5E=@?GOJz{z?!P=m?9ci-(bqR`e>e@n%B9r+9gcbW^9J}Yp)aKBxiCMTQth=gk zXV=7RLgsYCoE|c#hubD*VJaqOPLJ{!%24a3H^H!NVm6W1#y#+GzR22GMrdORXX{Gx z3fdkV0;tNoMkbiT_276V=8^KO@*GS%V6*(O*8A~SKaFflk8GI{$p33;WJ^_`wByBa zW(N@hZ4d4a?iQ4U26tOe?s_q@tzT)!OX18X)C*n+Tii>zCx88J%pA_l8~RWTsmyO>Fd3F{`#nN5k@`|Q-x_$Pz#%24yB-(fn% zyoQr(T^l(OM|G{aAij4{)3Fb+q~t$oJtI-h%p1}1#vt>iRuCcPz9<4CI$j@SUPA=s zw?$x*nb7T$P(Y=b9pYz%rF#cL^bt5X@%o^6XRnSIdnpEdx$P$II>^|jg-4=u~CI0lWvveVq^Ev z^2GsqH(r3`R#kUDV_m}>i9c3Qbj^zZ)?{=|jIxYdH?ef)WA@U-fsltM(4PUFEV%3NQ9VhZEPQTG6bKK4-!}F? zFOy^!1a$HQNef1)byYGiFrjDvSmZSuUb?NB66su4E%DPK-fws zJQ!s4Vp8=w0pmgI(x+?f1BihEoebm$jZP@>eU;gprcrn)Y_{Bv7XW3MEmUTe z^*=25w|sP<+?1nTrmQkp=FK4E%7s3}RSZsa{N&QH1+`C$#NV7IM@6djET=S0*5z4v z88TjJZF04M){V?LYr{N5iYy*mj<#Z2+l`zhtU!UAshYa#GOSfh!<1qf496xrnaWAU9`mSR|$SmS)x*3r3>K?mo(oOqv62VU1685Gj4*T=>}WbFARnvvucBnx^!0!=2*|BG zqj^~TSEA(RA(e}}ZNA9&W-f|ll~qc%fbCf5yJ%WoR@2qspNqJ7m@Ch$Vj|2LQCWA& z?HmpMQ}Bx#oVJ`S5cX1QW&9A3Qq@*KiVlGB5By|u)##l@Kf5ab>vaLEGuB@enJt zn)+ZD(CciB(0HbB84|?(F{-KY+RbAjrc-uS2_4Uexa7$qa_~;P_#GMPIj&)vZ@NLw zbmwS{AsF{$n&{j!$>Vp3goT;h()*nLnbVj`TLdf*k*K(8JaN%;nFr&J9o_h(l=>Ys zVeF_!M%lnsY-5!j4R)t@oVBjBk zveY#$+IXrX&;QYHaq6Bqjuu1}K0vmFwx#9N9AvBG)w7!3=WXXarm$*B?b7BYO%1T6 zwTLsNWmT2aoQd1%v!>0Q;&>6{n#NUuE(C%nG-5}%n!i=Sn87V;T)v=g)vD!<)90_k zkq1Pff?TwCv!rfSQ{(c>T;Xnv5G<(Vz!+x>glNKfGbT(NH?4M39W8QAS+;1oQCm5+ zwsOT1*hi~xUZ$cdnK+@gqHYyThbe1Y3IFsIbqmTcP2Jq65;d`+f|K48mM>KP+6nb_3ob6HThg#p-k7Z9U$Fd=y2eT+tx{$Z zA6q$woGWo?CDjgsRRu7-K%(+Q)GMDMHF3y+d{gPi6uUl&rr_5!J1Ia*q z0>8n}ARMcf-(1%+&|IPESSfp&+gk#BD`;rfi;hzG@tc8Gr-ls>oF6}a5$ZwHtmzIW zp9z{<4ujvFpt>kiOt?3S?zn4Mte-6R#67c&JG>u$$hdUU*4WPME)A`BAKFRHxMi}DZ zm)@U(?%_l5I~(u+8Z>ES40ka327u-yP3I@yH1H_UG{O)MKl#>x?&?GE`zGGM5j5GH zT!dqf*^l37&`j2Je)6rv`xTmo{OJ7nabw%AL-2bO@4o<=ove6poNn~vcQ5ua{0cuh zKlwHyY$s^S*p-4~^nUyv2hH=E&X3oQzx-O5G8eJ_xhsZXP#xyr z*vNmp${GF4pf^WYwo}93VQ@ema)A45PAe z_n2eoy`pwjRpDFJg&*EQpEY*K`tGK)tPS*>{SCP0bmb}2a|#=%WDNZif%NM@peMxN zS{vVyRV2LE{FD=jo$SXd$yg9ri#Qgwubny#5PPQTzBi^jDpO}F1yd8D=YR>6=Sx?|MDIEdoasXA*biD>nxm^4^=&L7ypyyYQmshd< zuPu~U)-AcmS+6*D>+vgc3Vtd(7^J={tgdQW74wgntmH&a)|l1drWuvyYBdFG38TrF zpWBJDFcS8!M)IBbj&OW`Y*mg}!rAqY_3t#%BvE)Akd1ry1}2#O#>L-W%X0BN^k3Ua zl?=g8UHW|nAa&uM$_jW5dzg+XR8ivT!0DBhu2SAJs%93uHmn7BBYrinz~#q@88vi`;8Nb_wN#^P#3Ju zIZ_-ZfiP+e$Fo!*JjCt}|EK9~xDx?Go~t;HZ`n_suL)t6uv0eXwvEHuM}|2f+v+I% z5D;v#+;=@ z+pic~*>)R~Z*^M}K5d&3D0=+zBWNscY8H1%=Twz(mN&}^7QK6Un)R+FcB3Z7_pU8^ zW6jfZK#_%jBP|%k!OBc=nKdq}s-pWDyiqe()VNZMf*9l@SS_O5L2U7ze8%?$BJ2MM zKxqTMO*`SMT%23aV8IGuy>VY}W9yZ`#a~>z*eDaE1j~i-J%+>|i*>P4Md~#xiMepM zyo}V(tEw*S-o}<$0@|i!WG%LrlcY&OOKpaZ#?r%yWnHD8a?wtrG}9+wMI!!=s|nwR ziQLZmwDe&2Vx1P5W|uaV?U-s)6-3rU@Kc+>S>4j*4!nheE5I`>I9A6602&0yI}}co=W;;c^!MMzK4Ms6g{#Q5>@SidCX(=+w0YExAO(YU^zN zi+6Re9&Ys|SY>_G@oI(@>W4Q5s7j*(kON&Ie&3AqaO>mx?#p-ANF23sVPRa}M`b=K zJ z^5Jre0qX^R>f>mU8Vd*g>jNl0cDoQRZ13zU4zq6|g=h%gQupt%1y*mcp@OjY-IzA;F!6YjVRYNQ0>iDHYQjg$u*kO8E4aGZpEM18G}4*htxOaDnL2- z!5}2aalZ$C+*mMKiUvO4O?mUs*}{i@wz(|FT$XDti(;v3p*1O7^y|nvPQ*#SDzffG zfR$MB34nv>(VD@wXr6gq$h>zgkQH6h;_0+EyOZh z_9C;2OVt;Qsm_Y5=S(N`k*!y9&=O!pZaSL0>_y$Bv7$Xq$61+HIXPH+L|F^-A1}B5 zDBPh5==7MyA%xlpw!ck3$H|1k_PMyWwX++>0dJx_cR)1iufC|ml=c-O)UOF);k~}_ ztuagT>aSR$3Vh-2_?pacY}Gl|q>weBZF->GT!V8I#UV7gioz^;bEp-~Y%6(lNLfAE zs#SiwzCeeWp}pB%C2!_2unRsmY0{n}o;A1Q^A@$zQ8;qI8W!iUSf#}eiTHV1pxnJd z80_PB0<5g5VSFVfqB<6l$?H&2J=)eYwa{-dIf}mIl+gNi94d;QQsxyb%-%3w4m9t! zv!(l4sAM6svL0&1AsUeb%lR|1>;_tNg~e0p^9^p>C!ZJMiRJKWh9DPkwl!#y&h%n~;l)Q*8oo zZ&T2DfLM~#jah)$21JcHiO?H$Xw-N%fqNU!rM?yo*ENj)XgbncSm^ZKFHQzo7ZDiVtlC-UD(zvph(&g?n@?TI=1!7C8uH#(B8QGjOE#bt-*hO z`ei4svoz-~Vl0pC3bpySmmaKhI9F=U%2*zyztEEkVj5F08&WVg08^4Et91t*~#WxG%LaOMiPWG!!Arp{q; zX}M&{MP>7~tv*GxaLGlrD}btPnt$OEEITK7B?6W;WA!eNbp@)w`e{#AM_M)V;ye!a|^>0Tf%!nMJ0}kHPxwOVJZpD z%RIr;>gHeKewS<6%}Xz=YdmjJVlx8NRNJt0MJ@LaR9?2KsctE^5EQFh>iqUDB$5D) z)FK(OSgweZSNxS=YLCNo?yzuaP%ApI6C$zGA;Evb@)eg=FK@hg!kz;LNwn(_5(#!bH%Kmh09gyu2%7Ua8Gj(r*N)?akNg_QP6Lb!PcS^3?n>rGr zExc^m{G|;GY7-jMFDuRt*^-M?me=C8He_@nKzZ>Jm5{=HLE|d@LPDALh7=u7k~g7h z%`xFmyq^*WwOZGR4HvH51}?E}Lq~+;i&K_evixEcJdK&zc-i>6iyD^MXhcz)P{02^ zi_xR72xhxO+Qu6;Op|`)HV=P^2IP*bi1(%6EOB~+(;_Ghs;QZTcSw6T|~Mg5h>fF~bg-um3->d8qUC|L#0(_v9x%cAk#>e0i!(9{zv)ye{(e|L*)uoer|| zbJXW*d;fEF^Z}H?OTN0c_e*Pf|9$OlJFBI~={y}atib-59#*^iAFHGHLHfq8Hc!8B zHU0PHr*9n{R`_}Lp^g|edZfyJ_K*6?KGd0*{2HQ*O7cEb4!?2}V{c8=!#-3@yBUL% z=wu&iqw5d}XgF5=V+vhCv3uTzv2aBBS`wY#zN!77>#fI$9Dnw-59yHW5<2b1b=f|%eapr3pMTv23cG*1l2$guI_c~0i-KnS7{PrNQi}2 z3)gv7#jJvkH-f?E_-8H24q3U`!R^?CvLtUTu0zD$7^^-c-l%wUY;Uf3W41R>yhCj7 zQ1KSP3l<}+p=nl08W%msn&nyemu;5wzP6}YF1t|7@*Mbb&2n{!wVcNI^33u){2OAH z^Y*c!=4GK;vwWz44Ws9p=ZDSm0{Z5d!_4v#=D4v~!!79aq$*9)l$*_DAqm64!@@S3 zHR1zOEFN-EZL4AIX*^q1LmrY$m8qyvn%r!O+=55)HXF{~>4YZL5&*#5IRs)FZ`^nq=ysv@l0lotc|M}N!0f$KHa^yMM zmQag_lzy&+{R^*YUG$GUxKc$X%3Nekf%2igu#&5GuKX{Uv&bwvpo&i!F7{lV!HRK7 ztmCyD>(3o~!y(>gTFT!u|PdBdS zhhCt~fVlXUZd?xtbJKusPSAZXL3ewC4kQLU3S1Hh7$LqaA8>58!OmoBJhnp&!A+W0 zV@|d8&Df*tp6G3y$TVC@tgeY|#r4ax1CcG|0qw7X2W{Jy@-!O(&uo;W@}P}?XEv?} zE)UrVcxFRW<-KeKJhNdNqdeV4z%v^+1((Bc0vC6SXRIU(dMyiUeKFf}3y@<4s+8?O&X%L-c}3BM&JjfyIwxipI*%y2&^e;$Lg$Er zLRZF^60)(-IigSymbwBKF(n;QEOiQ{ikJwDa_7|yOPog>UE&;Zbcu7s(Iw8&3`?9N zPEaC3q4R1+7dJ;Uy0|%-VR7?_qKlg&3W^)6qazB6n^!Y~gFE6KvG_YEY+X{=)TQ1W zcF+Y3bqi$-Fj_lR)~s@A?N*|-yDXOfOxv`yv`0C7+APJc{6KIQF7WQ=b2hV{7pSxC zLxRfEdJ1DZcs_nAbfCP*ERYwgkVy_f|pP!GKw>+DGE`!3Kb5n&0{&O`Z0W(P z@KX;xj;y4Qc@zwAgza@bU*PGbp^pPOI>v%kUYAuch6DrlP-y&zea~fjl;dZXPVLZg zk8AOTOj>#M+kM54DF?}UM`V82;d~m|!g2Rinvpkc#z^{>LYQ>H0>f>v#%Ktfzziz@ z=35ZX!3+atKYk8oID99#F(XLBZUSk%E8K^_L(6WEf42PET}~<{f+L->^WfGGQ|w)t z_S=tTSHBtKdi~wu%$>h<+>hnmOTl9Pp!u_luBTZn?r8cuXg<|+Y#D^#g{xKpOt`fuImvD{#f`&6IbO+PR3ec=|(fRSa z3N+t$(fP^uBhWnPqU(uY3^H|q<|R#+&~p#^`zL66v3Y^>(;w3t0nPC)IzRb%>VK?@ zt|$3+gI_6Vj$gkH1}w_gQd3vG|wJ_-*Mo#8#JFD2ES}{ zDPnq7)=$14f#0d1c~;XMEWJEYe+-*oIGZ1u3f7qS@Vf`Uugp^Kmvqz5>yTN}!eq&q zKw1`JZAZmq81-w7m~42*18LvGP@Grjq`uVfm^GeLy^0Il6Sw1pvCEDngL{sS8wS-8 z6swg+Cvl)5BvO($wt4HS0RezUl(XCGQ{eR#g1ro{5W1$vLw$w$PgzA2HkQh)Y%`LzbL?MCmK7n0<gQALqQ9R(u0;3B1 z5J2PbQ<=he>Fm5L2JFOfG~-Y#5u;O3Tp9S4Yx(b1LSmtYrJcO$%VER;tH z+wQ-BS-CLJuu4NPMp^Y~nI*YfUQw;`b`q>L;@o$h2-gD-fC($>~&J%I7WoK9Uj;+sJNOP9(5rhU{XTTJmK>1YJxEWxeZ)2S2?O70?) z*4st)yA6e{8@WAlPd*f57lGq|q3e~1>vV;{Q{r-Uwb-l%18ad#b*wdXLgP8sz^~yIcz1B(BA2es@u*mBgqvE26 zLuTceQabN(A7TdC1t1~wsR@kICr)W5Fv%LD9=xgWJ9Kg;C@I4m-#@XzNyTipG7az;iqb}#9V8g{kcqt>Z@T;rov>|X z?u?%jD0JewRdeQ{6BSpgnY`_u*ug@~4fDT~gRgpM+!781l~+P_c!ft0#nRmHs@f^5 zusyw*7S}u;4CLuo8=Mmm_Z<(vq!t!uT>FXgAW$@u0) zl?~raP>gSAs!+E16ot*8wsuwBf@W^r$4P zI?k4yBeNyvqeR(_O7d(8=hoij7sl;;W=oFg<0di;nJr1$8+1EJ{**#jTb%gVam-r(!jS%ADmyRgt z@(#g|lO(4fCci?^@jhNUKl!F0Y&vLe)O1Y0pM1}O=H)~1A z>kgCOdeGf)82oNKOn$e6?!H6tI|K6lFKAxZbO+0i&p^|cy-GO0{9rqNG-xKf==}1d z0yG!8=z1zI%#S6YFoncL z+WU6UJaY(sW#IQ`(45MI!yQb2lR-0E)A`A_4m>Ud&8wP@#n3Okn=wYXo#O;JKYkp# z{RA}YIRgR5PrDz#&p^|cy?Qu5e$0lWL6fiP4wk>?fabg;ewZEq*KADQgNVPfxpWLc zzKpHGeQ+2thE>Zm$|kHHeP*nxuJQEYrw=PAh>dSkkgJtWtYixhB9CobN} z|7-A*_1#yzfSWB`R-&4IqoyZ6goU?IWLtY}{Kf2=jy<6{VpNk&dQ>i~fQW!5;;C>I zfCdQ;54HAy|7k{sDBx>=6BDXU+4aG0w+*$<`n7zANoU_Wv0ed*v+Fawq;^uW>w9|x zFk{T5u~QM1{eD9P%ER+y{L&?aJ~f-ILMi_Vf}4e>!bvfJ&oJi6(|H^ZFhgCPlbp?` zOAzOsJ4w%`kj^G61k7a__|>iQi8MY$Tw%KyPihSmk2{<1tof&q*5io2p7%v|DobZ1 z?+gP!2ETN%I?2iUsBC~#xKZ#cTrnVyCer1y78MGw+%CfZwi^uq#y)4_AFMhJvHH#i zG`V9>u%#o6R;9R&pGu=EfVhp84wlXMo!D#Nd$wRBc%X;o`!b?c0|t)(@srM0c4 z^IB(I*g9iD>x_kSI@uPetOa0vpAT`8Gsby#YbY^|RU z*e(FsAmW;j*~eNNCCqiIfV{@0gpMkqqdgy=%v#_dR4+kR--H_0@4RC0l#bVfuwf1I@4cDubPDw_6GiQi3BGkUPu@&x0b_6;PuiN%GU2{ zVNhkgD>1JBuxYR?{8AH+9oUu~QoBYHStFN)js_H!6=Bsj-}EBYi_>X1^>VW-wn9!T85gN zw+hUr1I-WmUFPOTh;O|QPi2D++Gnt&|9n?&hAAR`>7x3p1UdmvQ=s8^whA;3&y502 z$8&=~EVb(eBDGS-4S?8&sEm|$5kA|oi|Blj_q9#H^?iLi_N0}?yRMAC2AihUBB1rY zy6|mraXsIZNAM#Fia(ZPj+_Q$%Z_=d2Ikqb0oR%%sp=Z@n3?!Dr<2+L9sHukP(0Cy zB6%!R#R4%`uf;Da3#JOkL@9_I6f`FR0WjwC0T(cOAztk6#7}>+MX=Y2WbS_#zbGQa zM43QrlWrCW57|_}|F*jcK!(w_VIML_^(^epMp!;$wLj*bz&$|W6$MZ)5QJp^&2oG5h z=6~CW^Id?Y706=k&k}Rh>${te5lvNWC23W)8NE;ZkfD}QtGq|I3bG$jpXQOhwx+Y9 zZ6n*H)c4RvYRjbq0TttyE}fR21Byz%s|1z6uM)(ZRiOY9cUA|DK56u`yAI*8Rb&0m z=A+n*iNIF070p?enT^&)EjBArv+J`xqIR~mP)=$7T(9&6*JAwA(5gpsJfNu9UoI4gwT<;c*{d!FlrEbgIs`Ws z&vt>>nEXnhQarZ_REg)K0Nq;5!K0nOVIln^tO`zc z3Wn_<>FBU6*tPt?DjN*k&H%VK?iu!gg7~y$B8}qA?<2og@)rK1QsQ?#eh$rI_-^)K zE{E@X35bMXDq=C$?rJr8%7Qa*cY8{dG!3PS0N6H5OtKA*$1r*YI zS58xRWn>6VJ)Vs9#o1F&b~yh67`hCUP^FDuD+Hc4=JzR>e|Ru%dBO8ake~1c`)vL?*qDEfI6XD_^tixsAc8sodBd! zxJe#9q^kB{-05N?>rGehlytFU6I4SRKz*)TifC+xG~r3742Zfp^F!q2?6)U`C4_GG zhrKL^^IFYW?Fn&n=7g-5v)>MoDWIg*j_mids~yfaXwKXLqVnP=z%Ykdj)K@=U$=Bs zT@zqB=8ik|{=j)-_uCUP9F)wFfqy;s9Vd3VZU9(kPY8_^hY_`k-5uAFDRKGj+*k=p zx?>*RI?IXcC2*$uBIZIhi==$Fiy!xCcn@-Lw$-a2zg-#M2PL^*_Va(f=E!`cF4$kh z6zD17N;d69y$T)9Cuz>g6sTLzgFx$*+0XDNIn({>$4{VMGR!}J4v}u%l%f&;rxBg*)fp$6OA#D z3U8hwdy+J-OkKLa1w({}dCIt+-*N9;C$9h1oQDW!1RGCiOlk|j^5)IuAt`xrs?eN< zC*SWnuN3`b#!B~B&G}TsrP{i8eAAT=dT(5(ro;u-p!qL6`Mnu(=O0|Tqa(mz*p5q` zVgwO&-nh<8iEFgb*nRYWJ}~-0C$1LFd9=jkPQ{oM&ZAQ}pCvTw z@a&J@)L_YZ4(Cmp^I3^h-0VpOUNG)T!Q7vMX-~mCor2k&f_W_k^FazG&F&H=B#Zz< zGXA{Zlp}RK7&P~Bwkb+s3 zf?1P-p?wVHSi9Z1d^XVDbd60(*Vlz6iYHr!>wkOW0ViFzY0h6yDL_gLxZPK;G+`8#(vqgAi-TcM{_4?jo9r1+vi%aJ>=_`~=CQfr*EX`Yu zg{6+#IOm+&3B|PqBd4D`ed2`Dk}1W*&l!P5>vQtPjVl(dcF$?9fq``T&Wd#Rau2%JE3 z-X#F8=`pM9W6LJdssZ6l8Mt%SXRKOxlRg3tvV^J1xXvhU0&}^>9eL!NYJ`eAo*z2 zmQ0vgTe_;TL5cuUMb7TM;`UwMUiNMZwFTR`KfR~jmX8Se>_YG=QNL?_5fE2cXhxwSkI#Hy=23mO}wX=`e%UEylk7^sUprE=}5M+`2X zt(XL7rrW(cTpA+OH2bRb2|6M6MenvGXfR;>U1?tPKVvwK-p3qwD0|Jr&Kx~P(Q_~P zSlLT{FZ#Ss;8Q@CyqBCG!lvF5(V!4ia0cGrAK$2U_J?A~_!Cnhqn_c{R+S7>nbK|?9xz|PKw+HMY(Cl>4 z^~A3M^6di6SoSyI_@VaWcXvOm9pFdDWc9?4L(c7*hIDj({9Xs${zLFP0q+Mn-f%fT zekXzMOik-2--+N;e3<;|K-YW-ejGSl37TKH==|h+1T;^%=z7xM67c&2XvTB49ggMO zkKa7dtk86R>E%$F`@dAy?}@of@U0NB;gpZAHQ=!Gsi{O6Te%~)vN=}0W1X4v6}etyJR3X z0^mpIm)<`hY%^#UeND*Zu(I%TEuJuhgZp+(qbOP5&<^!L_jpfqJ+v>+fbK<2>nGn- zMD_+~MsTJP?qKC*GH7ONIzN7#jlU2y3vv}dwx^O_*TM@!qM)-tbDN%B^rIUO+AdAQ z_vrlcqc`R&2jWNPCm#peCxB+QraM@Amw;x?A^5Sm-Joe0FP)!!n?ZN`VetFOVe)$b zbdMc^-#sW;PlM)LY^dQ9dhVgT+zFcdHJzXSR)WW)pgEoMh;Rqf-+0heXgWWB7a`yR z&~&n)f#cZFPk;XeO|Mgh%r}3pMQ{W(w`;nCwWr%a^YkJ3T?c;8gXUs3tZ)b8XM*My zP3M>1?<3$&&=hm-502k=zw{n)IxNB9N9V_H7Q%*trbW{oEI)1l&0R_S&{JcPcn`my z8mRKo(X8P5=i-!aagr5oKWYwA|uBQ#PG5lwy5 z@$;QwV22j=z4ooP9_L;Pm?eGxr?s-zlELJrGExBj;A&Hbv6aRDe~H?|$JR1DT;8P6 z&*l9htSHN!)YF||JS0ty_f9J7PU`8-p?nnZ!O74&IV-4$`I^ury_@7c3|3ve7#-cg zA(2%0^+YF@YdATq_T^CdYRB_1!SN%gaCv~3Ahq3F;R@kDLvT!>!tuMqs*)~NKoqVV zepcIb*{+~)^WdkJ(v3Pi6>d2oHUsHKQv!DdAT~AWMm&LQ1H@)8UH0m!cW;89#UNd_ zI;a%g0l$KN2#5`Iy75yyRod=LK)*~tEMh8@n^hF_SOVIafSyi3y8xYpU%K%;o=QV6 zB%qf8ohYHN;i+`+W&(N-5cQgFe2Ayg#wQ7gRY~D`C7?bDD3XBKBT#e$6VS1MP7uy{ zfRqk~06Jc9rvp;?HXP7#f*TD;<=a?5F~N-oq+~7y#O29!<6J;0kIE8I6(E&I-vGo9 zYq~KHkjkTlfY=dH)t%!gw_|rlcIbw=Zw}jkv)V$%ZR=WiW(b&UQ<-CjY5B5nCtqYX z(n%wP|D*5|1|iuv2L@&xJ$;;FUT~PfK^E*!L+#+XPD=%kr$Da62 zGB8!#%t|`@^>Kjldb%|^r@Ee7y%qC?-DNjx+#90py;EJ%n6O89MkcON*Pd45&VvfOWXT#ZQ%IfTguzC2YH+6Y|U%6WR zpw^XZ1w5r6U1{Ktbk`Dg8qY?~ZHZo-6Wpt$3uaOM*|LD=qIY&~1_3CieicfD-= zd2gEar^q%~Rz28D#qsV8*bd8HGc*29MpLeZYZD&g$SeQ1*6(+{Vf{99SH~L}yZ&Ll zus6dZs9Dx4Iert_k_v%Glq`$)W?H-AT?6q}$14M^C*m)i)A2^Sxv7<@R=x~#(>lk8 zu(jgrc%zqj<7$AoIR2%<>vu=Kx82;d27dEKn$n7Q4{pxHZR**D-B8Nj;H2PgoVNf~ zhq;MnwHThE!UB`xT`*3Z7p>^%4(4BO%xWvi*jF}d4|5LthYMgvsysGpu~7xBr(0#Y zVjYY%6F1fmfu-5P_Bp6doj*qzTZC620vw0Ntl+4yv=_`a(A`T>ThAm-wp9H2;_S3xy;{69`9fOTvNz;V%KYu zyR#MPlQaS>g~J6E$3Grmy^g$nV?fifoW(NopRiuowbyzg^KTt{2kiQXdFu)!!TM}( zX2&}N%x&U9X`@Z&6lM<2dcAmWf9tm$uMdcC?_+M_TOF_UiGO^|no03Dj%gb35L4`q z>6l&r*xSoOl*fQ~vGrMG%Mcdho{JBd_p|=SgKF{ZLA-+hA7`7lHX)WZ74bK+n{qk7 z;^B{AT2(_Vy*u8?Hn-7p=u~``NJn;jd$zfWZ*{zuZAnz>>=6oC(Vv=5kAIQ|`)N{l z1DjZPEqQjllHIbGG8C^v3San~Me)6QI`<(=5E%JSnwzc%GnIl{Hv>d&jqCTo=}S#LT2*Rd6ZL_5jOY69 z%a=iGIaY5eGn8f$+UpVQO2w+#Ub7c9HCL=RN~g-zUT1fr<=zS->)mL)vpYwkHNrO?JpkT`e40R4 z0U9dMcLAxs=??*^p6f3FslI6g#&W}jt`(5#?{n*f>K*?8km}Lj2T1jf=c3=~d@4BW zi6Ar)eOZW&i}A}aX5kYV#%E$5KNy7{#`lEcU7?~KCXTbgwq`W4={q2+T%6IC`}KOh zW!oM^zpnXfZ6#k%bWK7ZJwK>D{$kKv&)xrvGg7Dv+opXzTXlxoW_~@V!d(9;GFd)< z=6aqU0Jm78qhqe;Q35-*5Ms+LEo#ckiCn#c%Czp`%did^|18`bf~2s882_yITzrgh z8n2W3T#aA4Xsj7f)R=&0lR)f)t-=pIe>_#_NKB>`QVfNlq*`j?e6Crmi6WTG*p zWI|cRMDlcOBBdF{g^w<%Z#=skFmv?H_}}-%-;ClgNOPE7iJWQ_;Oz25 zum3sdC=bOkzAv<9*=7g^e~vz4vyWZ&?&d}o2PyW_V~MwaR%Sh+&)%T0$57Z~W!0%g zpEV%|fuqY3u{{e`)8dbfMr@Z~XV;YMGF?+({xMgdjLOFec0`$5VLcBvIc3)4 z)!u0HU9=F>SJn*Iv)HuG6~{j2L8z@OjU8R*e=Prx}55&O5I6j z*(^G6c_jZM8wEtLOKxFc9cjf+omy28S&rlbE@)(v#Aw40LpC%Lz1R|W635Oc9aJff zO`fLV2&_jM&f&;N3#_s$DQzwd!#+$N=FJ>(nOoUJnOoT$O7;Y9-V71i?qhen%G@fW zudOor+A1Bki3Y~zQf(?{q5aK+!cMpT8GjYs^3qWL+pyMv3w@3az8~3=b!^9r;mqv> zqXdKR2j9x<2);$|EmUj<6}^MD@He|&jBJ?^u%3@>OD~OVslrLraApUf8H7qRw<~}A zv#7Oi%{St2MVpRA&c+@>s*U{L?Al}fCbP3+Pt^Q24}k4@ZEpl^Q>shcR zuTo*t6J-6(+E==lws>P4vqj^-&N4Ui-HunXtY;7}y3vR=SI1~|x#FCs;_S`%zDv(x z#@64W%#7*Vd~v(ecU=6XT!7)|`&l<8Q?vD9X?)kuClFa~S!X zhOY5v11Q}9NGD@Emx>3N-=+a-CEWn?yYze>=?27q-AA$Lc%_d$y1r@}xWqpj+3Ag!wya>5$yun#wyZv^jIHbXv!(iX#rGY?g;=vA z+otsoeAN-A{hK4ST*;f+KS=GiuIod6B4P}+L-CJ`nW2%ZPr-m@Z*LMvW39{CzgAFQ z`cD-Uey+aKg7TF`Xcv@!SA;zm6voz5L9zCufnI}}+9id>+Q<)$bqzmk@%Bi^zL2@G zo^VH`V}B@eZ-;r!LK57>hIz8N@kRVIZ~6gI8`&C~8}9~u)iwP1v|jT|!Z)#fYrSa; zY0xE(|2hNR;b>XMXTkh4(49YhU%6`}ib;Gm5@o+@TrN6X1r>Tu-!*f{VPpk*)LkMH=b=m18ELpf5s{CIs)BYGtTZCM%i z1bqmD%wCg<4y<{t=s*nG#^3AYSjycSY*@|ont+416O|9N^UTKiLU=J zvhG&IB_l31W1uE;L5*gm80Bb4nKtuJniyzCl*$C*EB?xxvKS@ z%_lAnLCJP{FbZux%JwnGUzlTI1kqWDIR*abm|B&y#eiDzi^@!bQ}#G3K*#Dq_cQ#Y zYDm4n-OwBf^;A8cxAw$e`80nohucG~R!(OH-wM7}hAw+&SjmT4j!T;>q?V&hjXdd&Sg}eG80T`%U@j(`!kyzF7_}S~6H2NYwZQKr6uKFeeOV=hJ+oz!y-SDbKip=-UpcxeSO?Q9xyUUs`j2JK`|Lx)RaiZX1;a@;v0)rEP0qeCd68X?=TST^y3% z9c;dGUHj@~@%B&S`^H{c9NDrNSfe}d2L987NGN9SNtM>G<;}eVE3MxsC}N{}+fjuo zQ=)A$^?D7s*s|fjluHp5smrqiByz@_;(GP!6~K=!P5nzeg9)f-AjHmf2Yyjmr*0SM zQaq;#L^W_XfHHK!k{OlqSt`(zcy7Zl-FObqM+N#5p5MbSYP^bPoj~v6$=SiETn})E zK!Jc^uy{npT9x8F7`S%9O$Nj%mULqppoazGn)^cn%>=YnpxJ;P5$FOy4+?~b!5vd< zr_=OByITOm*bl2xwlyhaMO<@dVKHflslS>|G>Tc3+SZHpJnLVcOeFOl$i_S&K0a*B zUs5pdrC`$RC=zcSnSwbv1;cGG%Gq&EO2M#Nd1;oUV7{4x*#rzrmC7ByPn#4UcrZJF z$;Hp1;V9>359VX|=p32|6h{dh%n86e<)Ik`%DV!rhb0XQo{qlFW?RGeC(3~SFoLP^&oFgfm`wLAWo|JUeFYdd<;e3PU z+#j6TE}$f6j4I)7{b1f8DX#u0aj{zw3@qUjzk7ao9R?wcmCm+AaAYE`r+njL3+7GN zktuPpeFz5f@g$oQe{t7IPFyc&&POHUdM^D}o_@*M!}fY;n5nSbch#>Aqh-!>^TVaru68P*ar#?<)ki4mj3BgC-yO#^T0&xQxkE; zl2ZD$l(+__#KmR&V1WBf7}wX{Sv1FqYmVkTC=u6E-?(y9;u@3^*D*rFg-X`FXO^Gd z=)|=~b3R7ma_85vDV&c<;mi$z!N4Ez?2X^C^FE#GaNeXj4_2IAhcROE7QZ8OZ~e0L zPL<#E{kMKA1~|>Ao!_*)foO5mGtVP0Td;J6gK>YCj{`awusP5F>Eurw&h45rX}l%# zczMhHtsI<^(i4OR$-}!iVz>HuG$a8)bbr;HPe4k&obwRsEp;cPaAsQsOH5$K{=xA7 zUUY@S`F+j#M8(;45CoMFZ*k)%-zvUp?zPTa=|sVul=2qa>R@2Jgc`=x-+CGi30R2B z)o-1w-f|ss;5W>hijz}P!8#iZjKq`r*_XckcMj)#&H0oR&ZnkuJ|%@STb^Km-y^yS zvu;Hpwq-8TobyvS4+X7P=KK`SrwNVCxliAvGab%THRsb(IG>)v`Lq}Da?QC=IMbHa0-R7*F1gH)0NShh!j!mJPJ#gxS!v1NZhFk6AKQ|} zNW|r>O=qTX9+|>n78u?5B`{RDZ2L}Ns5;|K{1O-{%6Qq0p%Ub}s02+R zBjZq!n4rYP*XAWK@EDJ42@R2um={toZ+S3o{hS4QZ=Q}x(NB@k%)*l;b7av2>mB`k zra2cSVyEp7<&txGEYRM#iX^UM@CFa6^DuZx-GY)84GX5@l)i%*pMoh%!A#K@9HFUQ zdf_U$XI*&6dGUqKOP5}zaOXI1?Sf@Z#pet==Nv?pL{?lprg#j#Np(%N4!y%KaY`J= z*=N>{ZzySKtXrVYzAMc91s7jBpH>RMT45kx<;4xS3n76_d9QYS(rdL$dD2@r-@m-k z%X`YQrbczvU!tONl3q%F2WRG8uhe?pXsT~sdf~G94NGd5E~ve*VWA{V>(d*irR^yU z7CtCrPeBcgIwfEgbfb~0dWcxzyb%h{8=0PfX zNadQed`8{sCYK^z2nt5sPFju}NRZjs>B}#v)8djS;e|C0d8v;28b|Xh+6!HX*PWDl zNxcg*(VN_H%jPe+Y?i8=B5wt*C4{XU3gLQ-`mp7KQWIAWYMip3;h;sNWcxB=Hima0 zYQq%z21JxRxrMQEs+bCCtm6%fupKd?Fy^>J+K#ZVA&k*>L?5vo!DDP3PSEvaJK_iU zpm>~*?T8;G(TVK{SJ#z1zJuQad?)_NZv`Cx`JLtLjZW}D-4Q11p3a{01AYQ%?4i@a z_$>$Bm51PWCHR@3p$SjAgYjd>d8nrIlkXhxI1@C@hr!PT%`Hj%kh8?Rhu=N;ePuTS zT~ycfWgIn??XZaz04#hAn2UwLFc&}YU()(Ik|j5RXJhH(mt69FC*# zO(j+k>z}v8U(Ueg?2lU$LXPiUY&>oo7eQDgxE%|{9S4Hugm7D_gE2GBRUvai7S<68 z+vkd{diMO)jXNB@B1SkCOu959(4YS~mh8bk{(u_F-#1x)YXg^}vHFHvH*AaeJ;lP} zN{3javT#lk>_?OFOA@jmz4NVXEe0Lug$fB|<;`!AX#S{&cw8p%<2MoORI~7-^OLUyVYQ%nQPXkR%8%bk2t1PnaDMz|BCHrR z*K0afML&Lzfaa+~@cRbd{{v_WSU=#Hg?{`>Kr>U*+4B9TzU_+|mwp-Fc5YV)yH1qg z?wCHF55XK>HiAv(1=ZH-Q2kTTj{8!)=79*!F-LFh6%2Nl*?hPUpc7w?octa9IC=5R z4;CtQ&y4zta9Tutvd#mfa2F*Y00yfKo&9BDE@Y@(=*$VX<5aNhJz?6iZJ9!{VWYP< zZP>EVDcjVoSwq%87g@)1q}KEp_qEf6PQ6E(8#HaQf+sz-`kk@k|`L2>dpwjRD2j#Z~k~Qx+*uOxNO{eET%eg@1i63uyo{VYntX*&{9F7 z|Aswn=*-0DA>stinpHsb_>d)hgxuAg8yB|eHB#t9=J+ft&Lrhy@0dApgk>>h`8YuV zF|*9+qZe7%4TU}ynX|?!4b-Qj;MsW`RydX)Rl>M-qDs^Afar@FS(?w z0I??%HE4K&y%zK=0p$pE1|Y6&MU63l1_<;vAjKJ8gN-H|j-cME0TEFIQ|i`$IqY|` zetG)MvT3Wj>Q}5oqJFhytMKlpnompFr*({HpO(JW66KgxuCUwdcdA+*1XALT1Vmrd zn2P5K0?kg~76DRpmn0wnMhhQsc9-{fz&-XN`+F)_O=oXFn}bqa%jD)^G~Ua{FKV2N=cxkWVa((M&c1x=6u^+`Fm}k~usl^(*mo#lKMXg? zSkGfG)_F8yF*N^i+`@;wGuS5cEcW*~+hjOhtE?1{Gx3iwZVd)Z*} z6Mk0ztIk%MhesAP_}}UF$~cKABPK;y*%%Q-0yA8BHI2LLclaG)<~^PF%7gI=`Gq>d ztb8mnmtVOF>j!o`{E*P8jxeEle2BACy2?f*Qo23`b4v<_LwMzEK9Aan1fOS8Ft2zp zZXNPd=IuWFbwh|KZc(>BHV`pvm#_qROgtd+NJ?zSL zA2_j}q~lUsMJURsl-RlHRXJ+R9XnP7lVbPVPQp6ICib0AzCXi>eZJ{DYYqB*x*gZIU3>Y zw0G`v%*f9%e#2C$9`14c7LoDWYBY31nE7x$jo+5A;JBU7_-%O-os8d-?A)pr-_6W0 z)*1!v?uiG6vKZ!L9OZU??ygUQgpZer-w*lON|%d6u5ej~}}>_83$M@$i$c z4ZOa82!1EveU4Y3&~#L#A3tuncw5u?$;Z}aA84kr$$=xeAHT(*`KG4x<99vYUk92T zJ+5Ut>c_7JH1<^iHoyPWIIpg;@yi(Jbt1V2)8cmgYN|86g*(l#2^(FL@ys$OXA3!t z9G(4|8d#a-Vc56HwgMPX^|7XeD$3;yg}lK+<#yztB9Platv@`(P`sGl*7_IJBsJLB zQPauq0KbFj(jn(-s-B$yhz?c+L<)A&b-xoko(FJt61}zTt)xK;%0ir-Omr|2QUCg2 zQjgSrr)>izNW63eI4B8@0~EtADsw_=SO9OLw`mVS2LtEGGD6+9E8~=~B^R(j9IG#R zLao+OOrlwqW%Z>Rq2gpo)uePNd2nFeNHK+NwzcU+iaa@F-S~F`WnpU*M@z^v>qd^0 z%rarid{t@Tutho zb+D4>wHb~#N}HFdEdwbl!kE|A9Q&Lxym0ui&(jMUQ!reSvlo;hy`WZPzujc_)C(FK z(2BAD`SgM~-Qjl93vz7$W!Pl=_NLGk7rVCQn>C`3VP)L&h`;`i0%RXq0PJEZHW z7sR6oH-fH|MIDZH+mGKe&|IPEY<~Z-ulUjxU&dD)g**@p2Gc^pP+G5Gue6MejP!73 zxKFruI2_Ihr}sI!&wxHh^@;X5vd|K+#WjltX2Upw}GE&lP>W?j+up|g}q-r4n5<_qypGMfg+ zKRGJ0;SMA>{>jmijht$R$S}8cd0)uA_pJE#blToJgA%V6n_f@sdX-7=m0o1;cr_i9 z-+AZ4Dq9||oVMQXc|nVi+^I-F0y6k!!f}5e=6EVTV-n|wax7FB1*^+C>+p)^LDW9CgX4_<^G@9S$w;4QlOrEt|p6(p;J~D{Ls$j8-WklBhGEu4ig?iL0QIEdbN@PIj|7azOtiK$J?08$WnyIy_ zDpE#soob|Pn}9fynhQO}lx@JalC*u+798JY;AC}I$ijM!iR ztdg9bAFU)>VhKEwM1ff@SAUEgf&uo(=!R_1|42c69%@v?wu^F%+&lJtrw47X34D=J z5p~4a7mr{47l-rl6bep_iU<|*A&$Lux(V{+gBbU0vERsvV-D`$tXsMQ`@-ipsQJq& zt0pd8(R3NNS9=iL2(1wAUB1b4zUYyU7=`Yl?GpP+)TLcEI)+OI&pZ>j;iE>6R!B83 z`P5@KRMbM?Q*>(FIZqUG?F-FIx=MgVfox2kZ!9)ad*nBR*gn!D@8RLsgYHBI?$Skw zrKG1Gc{A`lj8LI_`26R`Zyf@!*K~gTPQ&}Rg62sVogcs7gXSMDx}M}?HF^g$1Az(D3msA5(zHw=c$!r4vL3n+ms69ov>Sxx9D> z0}3BA*X8l0Dwr(^?ICI_y@fk#_J*}Rq0Lq_tLRz=H6Kqyx*Z`{n_2ZnVY_v;yju8_ zyw~y=xppRyFlFJ!v(WRalrD3V6eKEEESU}IV!%m#u@}RyAOK>;b{qlYC@{ymDSm1? zI-OK~u=Wi8+69D;|6gkCmIbixh)IlZbFijAf0s>y{P zRzHMqefRpet~l+g3(zatXLU!m9R2^W_a^XBRcHVB9cBm-0uwY!gouMiMT3}-0D-7X z*ipcQgaCp>LXr{$60;~EvUCV$yo}PS__jrBtF88}OSM+5wvZ4uaRby!Tyd*V#HCch zjr_mgbIzT6@622Xg4Eyp`JZI&J@+}!dCqh8^E_wkv{m2U^j*-2|vfPHT+ z#NjbG9Yh}U<9)(2XxSn1S{J{375&wn+-VaI_RGzALH}&gE-|=j4hP55kepNjwz?0sGQES#`6gZ$q3a$DO=S>|A~u z{nqvLKG7(S9UL_>hXchei~a!xL~_W}jfW_Sg<_%MUYGdj2M;D2Y#eDknny(ZT-Z;r z`q|RWvL?E*)`T2kWW4R1GHK&e^^&4nkEMP#>Qa4=Y7`=){21yw4z%p5T=r^qRi%^q znH?~(uk&@^Xi`285E^r!MZw=Na-cQZ_(bS!8)#Y8d(0)bi#39=Ik>I;95Zwy->9Ot zQ>H%79xo>qH48l{ceo-A>nmuZsgbW^Qc<&Tlit(sR1YvI*DK0WMQt5+c7}_cXD5X; z<4wvVANT&;q`X>DZo5MIUijdEwwS%_+~Qh!k9Gw%joBd>v|8@PF2+{InRV3_wF`=8 zR#sk9QKtE=AZ|ud4*smz1K^=G)@!&Uhs0uC1aCJksGW;FOPK?+vctT@snE@gR7N_Tc*HhJ0W|J7VSt>a3I9%&( z)Mf%;#C?>OE%k)4FX;=sOD*(bjqi9u{b>9iWqpBRRdpIKz7L%J3XlB7qIU}5-zgke zg>j;nh}!0h(12U3FgH>u$h~eQxk6QPlBhY&Rj9(3$3)xA-u&HsPmkXSHh36FC zcIf)20_Q4r>o81rCwkujr!x}>#);n7CyUd02utet!tR6Sg<3^!Qvu2-U0SDe$eS;oi-OgS*ysUk=^w z&3UfD`L4PyfyQ=$rgqDB)P0cIxVJs7L)h7hd3g^8c+JZerN;jaOF--X&H3#><5FIi z(99fRp};)_eIZ?wxTw8+8x@@uKpe`)HMY2k1cz^`yX%~+xR)a(yg)E1QhE3nDhtk2m`zsv$ zH!{%b^R8S126b^-a^O>68wl`B>uIUIjk7nmH0?Pl(8{YlQWu~4*Ygoc-1GE0rcVIq z#QR}-b7}fH3?%dl1`j|?(%~s7(8?>FQla0^itu!xiK9c@c_7Ls4)Yc7raf`qbt#wY z&jsG~g8f#`FdP-z?OxucKi9OU9d!G62EIBAE8r1M;H$Ii5(4$)t=FCs0Z8>OuR z5)4bWoA!3h3GE{PcYT1T_tq(TH~uTIC^hwvcX=n!__Ch#5^JvtwD!P}zn}KNS=1~}DivSqv=dt5m*2yo$x!?@ON>Nr?-A0K3YS=;S%^epW2e1dT25t zt=H%Ac}F3h`N4X+k&H(dA?YF{T{0p#&|eC?+d+RPttHUhq3Ij9NIgu8q@5lbn|V;b ziwA3_wJiIFgKO`t4Y+&-WA{WHteHHaC|_w(r=@1ICi#kHYX#u_6!ZQT`8hPX$f#C` zqoqoXmsLs~7Ty#-^M1Wip-{KlT&2dQPGg12W`$bR@2E=Uo@c&oZGCyyp2zWGWr1jt z$os{xbt2EWUu^8agZXkVDs;^>kgk<^vi)fMlCzjDk z`ctCx;Q=a-eysY&kgo)zET?chg?990^mrYg;hs zmlF79NnK~s0A}l+3&92^;Ls+xKMx#Yn}VCfX1jRD(2Kkct>aMEG~6mS+ZAck_YB?J z?&Xi_->Bp9yuJ0)+2jRJ-}4fJhSjG}@nAA``R(}ps}GN~=W;$r8Bbg^CRE#V7xoaG zrazbVqPRN^&`y}%M35iu_2{rMU~+Q7VMF)2_Y+wJHpYWlW`;T@A&t#$${2=aIK5y0 z#^Sg%>@C{sapTE!fD?Ge7j5ts|ML5W2FOg5kfp{_Pn1|S&gI}CDojO(6@X$EW;^4}oPNO~>c4mDN^G;l6C$74~Rd%5# ztzBXsvWq*6G;y8Aj_`FF=o(RvKN0nmonZJz3|t-{zIkEBNM0#WcqHSpc33co+%i90)h{|8Z+vHT7Y z&AToscW-AMwFrFfMuAQm${P>8U>Em1^uz55Y(B(Y4@bD^!DJMhvC$hg;u$z-^o9r7 z8wv(hZ+H;BArH@S383V?>0cdl)amE4H~a+kJq;1k#R2KAn?#>@C!aan7j-}XR@z!` z5}lxg-pO9_#(xG5q8oe^p3x&FL+uhc=(_IoJeN=iCocdW&bsa+gm(e z-o%i7byX-kz1gpK4}901MIOz9Sh4Vez74lcvSw|SsfIS-GF)|n-v3|mBGrO-lEk8^ zN0-G6PX?Y?TN?PT$D;9peLZTs%T8Mc`U0=G?D6uhy(hi={@#~)VM-4c7I}S(D45~? z#_V~TWWMl%%Z=^fqv`$j!8_S^%fRAmYeILf!RLhFO>7%OH{FMi;FGL)d7&p);se|1 ze$9q5_y}9g-7G1gTknBGe(25z=o1LI(n&bz0#m=0q;!F=3sQj%zE0?Sy!9#QEA%EA zwufOil7bQT7JP)m<~4sY!`=V~g#A2y9!=Qyppno~Cz(CS(&R6j+ST63Jnk0wuA9o^ zfruUMPI1cPz^)KG<7{v-0^GA$EN0mTXT%d zRBN8o<}x7iAKgwe^L)?wUt^H=e)zLHKB2T0w>dEC>NbbreGeKpBQXBaw+P+){fK8Kpo)FC`mgTwhM)=6t+IXbuwxvd(R~8+OX}Fux(%1 zMm0{F@bMvR9H1p>pNDPdp;?z1>Yjg16C4^yaz@Mo`v8D7v7ZxdVfyHS2l(GFCz2!Y!n0Uo|F2r+1YHF zWt$zofrj!W?kLzxs773u$CIJZiwn+e@$q7pUU=#)7 zuy?(gj5L1&c+X-`R1o?P}5@xhRY!V_DhTJcKAQX}=(sbt#~j|$dl zz5bGr{)|L5E~FF5$N&u;UKw?GS5Swi!~q%VOP$CNba+x6;D>0-L=blUtf|N2cx$A- z9lE?`>hg9Ad7!=lsUky*udNH!ufbXs=h zQ(5XmWx8+Xs2g`hIgYyTu=iBaqi$%F!=rBdZPw~)T`}sOWEpi^daAHC^cdUF@Tl9+ zhO&w*Qlsv+wxDS0Ib){n`HL~?mY=`ps2evzQ9UX~-L394^kBmW9#n_Hi1>5VEu@a{ zon(g_bzh8d?M|qcH|x;%_D^ghY);F`5w_I54g%E^ymG`c0gWhN1wjFx>~_7~E`46w z@F99|zU7e|)`h)@E_@*(!j#_d)pDuv<0sRGhB)>W7L2uhwL;b)N=oE zmya7UY~=7U{(eKUFw0v%5 zl;Payao5?uhhsfFRvTeS0M1>m1&3lwD8$GD?c+!a6X8#mw>C< z1y%BhlVMkkA2uR)Y_U4JoJYVL!I1S5YcLXE3nu#5c;k?GMTP7CWnfmaRgq+?iqkdh zxy?#fM?tn}1=E1^bju3=GsOy~9Vo$9sFD+F1=GiDpRFdw3Z_Q5e;R@3*AjqZcAE7$>pvA@*@{+ofVEi#KS4RKWJh)v5oI-`i;er#rYT*3z2=vI`O5oh5@D9fxHw$cupl4a3_9#fz zsI#@J22Yz*S$$3MunA+PO)4lZsjHY%T0CRUoN1+1#WSlb=3YNdK1<84n}%QUoQjf~ zX*HGQ=w+tWRO44(I+fsnmKJk*_^T&HD$%~vj-4}rKuA##pg7Tpjukdcz-U8-jb&|=utCG&*}U{VC{}5j`B0fGa*y9!sn$U{F+*vLH`7rr z;m{lWXr=U|5S?2E!N9Yv!By0`1RK_f=RJ5fbD&2?WOKomlExqiIa(2v9Iu^pr_ zu)D)<1kWI#T#3h_hD#X`G@v--TtrB%TMRF)JJaHg+VU~M2EiIhvniu7f=GoO8pkcI zgO)Lbx&-}aVh-SEBD|l`Us2As+RmYB*Put~vbdeTUKh5Uf7}=se3Tf|1sl17u=(KP zH-~g(&QZ^q%Ef;8N(-cbMa3C>AP!R$#Qgy`g) zCU0Odv0uPEf&1B}Pw;Sm$@5ba-CyqQBDYUaa|-&|Qq!Ng2}{Flx3X zI5@b_6I>V{T$tc~HL%xJ_sP>sVS7)2gmWP#ToZ}SO=c;=R2OYHPuVJ@LC(8rT z$n$ugSd`xC-t>RNF~1e(_hX%noRa}mkHj8^xH{}&wh@X#*I0rlo&FAITwQSbu2 z(i5ER(JSMFv*Y#3gy8H1H*+4lh+K8=ppELI4-RJQD9ZCauw9%^>!NhnQF@Qt*927` zbe>#X;6b5<&67bZini`XNj}OiQ2`7h>H{x>I@V{`8)2T3fl@DX<|` zG=3a1ab3Mji>GiaHbr;P@&oI#*{B!kpLy&1qxO5(-OA={qW*|zWpONW&KKT5cesdl z%>8VE{%cMIU{m3y1N+fjp_$tL_4b3_N3a^uz21G3XowQ^*SGIow*M2DW$!P6S@zzW zFz(lb$vRFfb8?*Q(UamMUENJb;o033>HYr+&yh_3=;J&xIN5`O@zYN+uQ~Oq=~F}z z<0x8o+nq!a%SOS%=-`%Gl$XHA3E2Bscj};9IMk`@Y|Kx3uxzMndpukrlebufm?j!*SeC4i7(r+QH zFPjqTP6|Bh35qX$HK(g^BH=B9@+~6VTNqgI7P6w>!qT6%B{v^em}7*-J~bH)M+zp* zgMyplpy2JQpyYW4eFa5KB`>IV3C$c9XX3{ih7-K;LstcJk{JG80vnPCyBl^B7&zEk zdlC*m5+B84ivkBII71vyCZ(i8nl#4vXejL1HYpE3d{KDDYVvPdYZK)XB)wTbBuV1* zZZ-gtC^A7K14$YOVi~$iiG0yZe#^N0oHN9pgy37jdMYcibhM1*I_l%`R58srLuj)ZQGT~1}%Hp zxJOZ@QrS+~Nj+@knR(}SaTq|;{^r|JwT*Bdlt8owk(AM_MWjYjlp>sMiQC22pQife z`Sm8{jS{Gx7DX8w+9D{Q7Dbuuh}*@6lbqh$GVeW;atk0d$x)O!ab?fJAIk;w) z4JY!{a6|RZ1I7zy)Zku7%qtlFaTevck{M&>l~>xp7CrsU8FOX|lE4e|c13x4*gmPE zc2*_M8!sy_t1g4;ChRb7M)frn^L{d7ei`N&lvd}8dG^opa)o8Vh=yR-aaQKh=M>Z3#{%bZg~!pcpl3N(9iXsO zNV{Rgy%sUfy(mPHER|Cfg1=bda%?&eI01#n_&UYokHC562=waVe$4# zOW^#k!ejcy;?D>8#r}%b+LwDe$qGK}foZ{OTIG0-RV)6GsATnCvNQ%zCsN1(^{ z?`z<6Wd(p?E9}JIMZg)N@SNg%KKzdXPPM{2T>h>A&guwymXXNAAa%md)tia=(c>`` z0nd>p2LL(anJa9pLL-HZdBbigPJ^aiG*El+B~;Q(7THUy1k#M*Cp~r0X3K%dZsLmv zG;#^;?}0dNENe~>V4V4Jy0C0k4Uwjqwj*OSvpg`wI8pO^!Iq?vBcHHQu4C^fFNBth zL@&fQCATD@<|9U&HV{wBiE%=|MkydpV`8xM#fikAyqqM~^sog>(k9|5{Z0|z#4CnP z`ke_IhCG1L%o0yo2Wgdqp3Uv!6?}7h)%a`8OvLl>ixXan5GSH1VQi#X_a#{}Vm0UD z1M{CxiOGT5O9RlUc9yH~gAGf8+)M>*sobZ#Y(2AL^HRcTHZNVSY{6BJgFk_Lp7gz} z$q~0f;kLsRukasSB|;*jG9}J}EdxKC+Ja}guw9JjMZz{7Pw6@xHcsHiiPT~q#c2!i zlxYl$#+Ke{`rrdY$0PyQPY(X96ddRt`H6|mpUuLzC?7KMnCj9-Dn33eW&rG*JWj^$ zc&u^mJ!ux3n$X=$Z=3}oN}|4^0VG3fH-J=dRBGrJW=-%4-{w(_m!_{CjZzX?@iCBs zlllZl^$r%N=(l78I0+jxLk}+ntzcz}zFLAX@6)Gs2cGGn6}(+BI4VV7p|H0Bd~s;S zQUwkZ(N~WJIXI3Et@w=LjOq=~Xum~(me7Dw7+U=w^1EWGaPMuS4;A)UeRVvD*#obd{_t*u<=zMOkq_>DnQtJC`qb~cF^LJY`eLwyYyt=I!QpEX(OmTz7TCSi zy)W=h91$12s;?CUa2U{no^ZysJ4`+qg*-%oWJMGb6b7a-n35{a`JvS;028=LL1J)z zLZ+#H3)5kON?GpKlNgx2&{r^NC#YaTw=jY8$)*vCPrrpJY=*+(AVUcy45@$i#-5l2 zN!3>{y)9&bB*~cRjYQHozL2ThRitvRNM$)yfjR*v)Cts#?^7p=Q)IO;>O|=7gQ!WZ z+Z)`W)m(8CoMfp0s9oq08diM8%63J#(zNbqSn)MLNGkBcoQtR%4J*D8&a54v(Sc+| zU9{8qRv?M`aSOW+)>b_BzAtvEN&);9G}s+wEiN0FNa+U z;Cc5FE*d&)hu^~w76jQmqqK-_D@k-~=i*CNN<%zV>7eDoMP0R;pg(yrkZ>PY`?Yk| zU(`3tX7r_EebaOi0Bbng@g#AS$pB%)BYZlxF{3pRuoEo#Th9Mu)=GKU=%>k}GzLWA z2oUw(C{SXg8tceUj!u{!|JwYkG17*Q@DZ}|$WKCs@*zy5FvAmP9=S&rF+WvjHHq)~u_F zpAW-G20#A+ghkH8Nid=l=DB+mJfSBbl)lmI4ocDyOnM>!wM?Oyl+*8b(eyedHP5cWPKFm zttiM>fUpcj^UOT6>xrChY4rh<>Fuz&hPZD8P)(5R#y?0 zH5O=xBPe%`qD(2l?P5Pd;@h)!{L!SGrzoEiMVU3h&hsfzlvyU-E~CBw@TZqTUS$|G zvlZo2qbRd~vr|4biZUC0w@W->yX^MNEhgo9MY$U&+tZnK-%hz(6lFOJcs?*m=Bs7H z-#01WrYN5tMVY;bo$~2|^8N53w2F|Oi_3A}T1|1qyxM+|u<|*TGjKgF)sI9hompFq zYut!0=Dck8w;4#BXd6BgzJ?DgEFM!+Q`WDrdd9q(!dZ25OXkg}z^t6z!SXHV=q46U zDK4n1s;aE6Er4&+J(7+QBH5}yK*hBTs5Uwv;n5xq6W^pCD|qQTvZlI%t_7IVD=Xy8 zBI95{<(KvDI)gL%;ca#`W5A=yfJ$&14BnAyL^g>FzK3yVkP)1K3>Z2GQ;{|hkRlS8 z%!RQnZU$==^PxmGJ`niOIh8Z7sgdCu;4$-Rt7k|DSS_VvJPJ!}7mJsX_QGTJqntRK z%8gqx;f*iLEG%~%WoHU)wR{}u%;c}4Zd ze_~_?Vk}dPt{&ABfE`zVzROZ zS>_>HYTRE%M|%od733VdXs?|d5YnPHZTH@d1_s2MFNfZ?T^CqN9`g*G1LBR z40>Uwani>=4!jKtm;Peui`o0W*hYG91CNK`(KykgpmMN{^xPOopTfa3j1xU>e?0>@ zJyhl5$jd3d*8t}Rh37;MLpH4*IAb}Sg5mhliQeyl^Mt~4qIVPgHv(rA8G~VToaik8 zPEg@F(Yqb~Zv)PGWDJJsDd<_o@`NwtBf>1z{EgP}51pC6cYxOK6g{VK*@r&@oM#mt zi=tCJJ_62x2zr(_3ges;rv>L} z%)vQX7oL0Od42m|e93@|23|TOKJk>(y7xHati;6AlJPo6ew}shX##pqZ@zqI_fA)@ z!NfhcZ}x~DXPnJfL3J(Y#g-AhoL2|l@XY9p)q`L ztSYq-`qEV32_zOh8Uu+%MD6csN!y9zRTG|}ldvY5)}&`RP!!N))0*-OOH|s7yfyQ0Iz%~JY1yB5Il2V{)S5V(69Nxr}(wCxy z^Rh{7mvH+4Pv(*!Rt##>gMr<`n~&#t!uB&f=_^iq5YKaj4G(QIA22ShJ&Tu?ik~XS4MO?#Y+d`mvXBOz z`W6WjuP20vR(pQnsVwqS=h3_Fb?ewfwTg;=91t9Apu%tSQa_zx48+ro`4!GF7_&N@ z3utz9;3QXn{Nl7pcxDOPOguA%tqRY6!bVk3hOptG-NXkBxu!|SuY0r3QwaMBchic~-p1zT2m7OE(Sn!o zDZzif8pu$&oA_ge11@|b>EI>o%8P^j`Ix{oq^{i0zL;%>0^QTCf-umq~9QHx%g4w#wB(5^}^4k^%U7X7KNgBkFQwdtVq*Tv`2-;)-kMULA(OBI0~c7-C&=MZRzm z9G*1xh1K~I2;O}W$|DYe?CJm~^(Y$$n!?lHxX>)|ED6#AeJgimO2B)X`2FD8s=QT z&pw!8Vn3|Bscj0DAvs!6q{dP_qs?ac@&hbzgmbi#_uq=LiNkv{3?r>Q!;r|lKyMq7 z7tts0u-A8EfgPUsUEi}Of>MEMgA`>dI;C}#V_0m7?fEWMpGELNRgX{_l$Ot7J7WSC zR{Uh)475FlHcDWXRMgJpdUxsAucqu;t@tO^m338eUA;j}oY8Ydc}?!j;WKJyjHs>_ zYC&lIA^=z`ABGH@CpBRroN+U*DJztBbs03Fi>j*{qqI{zPN%wVUh$l=>&oU7r^{1! zB7o+JI2KH)+_Gbuhy0j`QmJLf%hHOegB({jcV^Xs;n!DImx^c&rK-xJoMMu~W4~f5 zMr$e-iX;_)1$ICrLb26-hDe79ji7*0D|V&GoQM=sSy)^S6`!dGRQkzzLOp3Drh)pC zvUz3IGoZJ$UT@Z>8_z_n!wR}w^OJgfHQ86V(# zfOAp@SYX&CJJHJkPOidpqSp)lF9*&Xg~xjCL~ki@Rvm#JyDqNlq^^YKaP*!A&ekK) z>jN5M?I-(Kn8U@lH*m5Qo>P2DZzyo)wSnGh;Qamw^f;*h6L4Noc!$g1y}9T9R$&nDU8B6@pm@d zQWTCr#KVcdA;7!h2=u1F|CBb;dklE%k3f$@*yn*WMvZV8ZNXned0{oXSK+`ajMIII z{|mgQ6|PgdFyA%+=QRtSQ@XqhoX;(I%r`XA7Y!dVGI!$G!m(q94nC`{uA;Or&K^3; z3CxQBIerh}cf9u-)zvPDKHCVu;@Y{@$3dB>v@0LS*EcRs4N%P0T5EfR5>oS9Dc5OO zbK6<>q(VJ~gKIi%t%G_llk47^nfUAv;>78Q%)&UaES8O|>?hd0u!zeBL5@*7XssNK z%TT3i0;|qCn#*{_s#Zx?(j+x{kuXjqOB<>9_^=p`NIMv`nJGBDy3SMoY;A{5P2yT+ zURSLN*4akI0a-F98SaHItD*R9kUN#+9DOpSqdLbnr7jV9JN`-gh9JbCMg-kGHG zW#scGNIh9Ihs9^%mn4*Rk~^vzr0qP|$Q@e{xeAJJnYc0;Y@zK&OaFs~MqZFAjD(B> z%0_%1)}Y0QBg0gVOkhswn^9obL}NsOU0(<74Xhl0Q;CT+7nfwKTX;|929(q?x+!_=o4 zi(feS1U)alNUutm#QPLn*l%;#n*Mn(FJ8|}%GnyMO3pd!WV+d6Hp?V|3r0Z}Y$ zZJw>ob{T>2n~6CUKiO(bhAl~yJK1Wm@Jbu?nH|K}ps;NWY}9|oX(f0v@sqUbu&r?1 zgyLbN@rjGF@N?tm5>Kc#VK-}_s(NfC*|SJGun287-$nts8ust2!DA7(8#TNtAe14v zU7XO3Hmte)(MV3%(%T_EK$wy=Sej!I92jl4i)}k?4_@}591cb(|`4nZQtzqm- zd>EcxHh0?W=mRFP|MUBE(#)`~1cau&2+KOOWd7PIJ8gFC1x%*Ei-GGNGAUO8LUSye z9oZp}@?E-59F{j0OM(EckkA`~2CCO=bsy7$s*>kx|6lJHydF&BbqRxA4)iWmL z-z&;ooM)#@&6u5Mr=@u89GDl+OiRT8!QlCEMVU+SK-n@Rl^QCe^pCrdlQOcNXxb*_ zi#QVYwu10w=aAijox|uQeQfaEuGk#zCP^3`+F|FA_0{b%IDBRFRZkn-U;~`+Bj?ua z{BSs9=O_B8500BS+2+UGTk;jRI|dQe72%|I$~;H+=)UK z!LwYhXRQ|;Y`I-$<4MzW=9)Do$3Tq1O3RAc;+a%~D!@z}L!zv8aFgms=u8XeLZMn*F}JF?IKQr}dO==Ub$Mm= z+!;73WLRb0yxOvAztUC8!%PG|RhMIGU@fYwfZ~#$lGMa7X*d>EPOK?|I+f1ibDaIN zz~)HYk(tny7FXkZS$|eWzq0JC>~zBbUOuO`uBJ?d7ba-+lb&6U)5F8Y5;VdRh&5%k z#b*4eb1bZ>gQl81=9ZS4AHvBwZAMm?U0a9qR2DFGaMJ)hf1LZTA7b!*k=75;{<<)95$j!nS`pwLY{%Y|d^_wSao1x!qMDKhF ziUduhev{4r2eNz%ckzg!-)w}#M-h0j^qV&T?|u+HOO0(1w9=12HxIjE=saEF7%=D` z8vD*K1!AhvYm5DbyjF?lzS58dq1Unuj|g9g-_L=QpmeZ@3wLy+p4K5;?!TX~*xNtM*XfaOl?GL(>BuM`nWsV zK=0RWr1x9kJr+r?Mihi_YBBr&7C}#Im#(4k)9G{k9>cFzb78!J^<~HDlxsAIu{A;E zWix8)s>^D^>LAxy9KBMsJP93z@g7$(v$_(eXV?0APdMLqMOAIZ+=_)bRLM82a&A?{ zoH9x}6ZMa0ADTt3#iR5$wB`jqjxQ*hBWa!NO~bdewI!nG zgd=*kuw^zj<1NGpz75kCmJXVOW9H!;Ddu(%V!OF0e7VMQ=GOeIc74;+*@{VswLc@& z?Q-L3H_<|Rqa6WX*1;_)xLxeY*x)>P=+;NgL6_==zzYXmsbj|v1d2F~hQ8tmVFZLq zBMccp$OQZ(q%XTTf?!C`?J}so?|TNa4cmMgp$x`b;0VYd@stk?CM|s>yC1iU<(0mB z{`|bzQnV-TSUz9`j#xkX6G|f&-WYM8Bp}wfQ!_)~ zA~i(Z^TQBp+&N%&iu=uQqY*f^n8pKYkEz`CM{H;mgb_Hlc(MI)yVzTkv%Pn2d(Vv5 z7U9QG5g74eEM%)?ev7pG{P;M<1Pqr3*+ma_0(JqxX>m?$%Dok3xj4tF)?m+Jr|h(ZCN|~4 ziZYkb*m-8ZZl|mku~bPgQ^(8Teox#sge7;{6jK^3=!jQbHA70KggeT zSuSLXVn`iz)fJfhnJJel5HhQl%SBS7NER2D&7WCTRa-o3#=KJW?n*E+L)8uws2QeH z0Jb=cn>*i;8r+URjlQky=T^_XZlDcPR97MviKi{(b)P&iH}c-<6%CnOTfvMYKw+E#-U-%B+} z8W9o%JGNmF$c`gw;LTUKEU>Xg)bjxUDR4fs;5pIz8aN%d`4Z2-LRoHbNn8`@7fb3G0m*vlzt`7 z0357c+?5lr-%DJAT(o9#(39F9sjcPR1v@9I5>hi8b1?0T4J@1jLcGK-06CJ9jRf<7 z^JIycJBq|Ul0w|2!@G4b@3osA^v`nsUE8w&6JIHrZ)853xx@Qg(2nOu7M_t0yrijg zU^{##;H!7AE4~xqvT1r?Lt=9`kY%`(g|Nm5KPG*9EsmKXHdKHk zshZ(_j)aN0ASR(`QflVnzq5ROv;TL3SzBekvo%x~9~$Y&D+-PO zHa}E!aDqIeKCmGv=SCEgQGrc~f!4%DZ>|IK(ol^PZceRtROnXX(8E`Wi(V6<>R-?w z_K?W0{pw3D9$+kRcF9z+fPf1`!_?opHO-d56-K*@Cy zlAal?iCrn2unxsep4!o~6GFF(T$@Gw39^)L@Pv<}t8c7JJ%F@>qrbMh5R0)3g(Sn< zP8eEq7?{~8Xe`?xz${p3Gmxrh;VIL5AZ%Fz#yUvKNn*D{hOo`XlcW43ZCTisTUR@) zY+h}}%-nIq0mRx+{OW~G*70=Mf4GP*{jWuwQH+dhj)Rpc8f93GS;1(K z-!LNO!w~DKHf;H0$piFt9v?8ovCF^=!Rx3$>i6AsJl@`=;7 z7WM;V_xBerddZ|b3=o=Q+19cF{@LB<%w6%0Ntx0&O?(v3#I^J6w5^4sMW)MR>j(YZ zq+9|B4Y#$}Q$tF#iEv{~X`HsTuo4m{{ah|wF|cds1?E^}SA+6^&euI{QeG?xL!TMR zvllM*)Nqnr4ax(rx&3UDa!^q|3fa{ngGkwxb&O5b=35_q(xiNcqI|O8xwxjbdfv>r zRT3y-VHtC>A9K6d-_qRkn=^i=sd|E4-V!LZYqIVHmDOVu{+ODud_1NG=f4;vX;f40#3{x(67HK zRv%H`&dA8hH0A9$A#Zm>BS-xSO)Pnv>1;DGW&qh5cZk4?H3K*ucwDsEOBN?ls+{C3 z-i|gx;gNJKIqN>auK><|3!W3b?|{>p4LXcL&m!;q3E=7zChyF;1{24}Ebve+NEBzD z`X&|3*5nRWhzY4!RG2k!wq}g>lQVbJzp?lNU?*iZ*6&+-uc$z+wk=E@yIJHG#G<^whGh9s|K;KfDJ|)n(_WHyb>5sfILTGl9)t9~Cjm8U zljdq|=MQ}1s{0V1*@#anJoMH#roEu=$H9v?Cl5|h`0!-l?t$QyrEBhXB1UMB#VR^E z9An|3>8K?OKo{7*@9IBQt^_^#h@M!89)M^bRRn6^xv8&dC^U^b5ITxsOQ!r_lZ zBd)z6c3Q{B__HGXZo-V$&9F`fgytyL@c~;jtHW@e%&=M46x7Yln=@mcY8VU4YHF=O z=m-b&&pN6$tDjorKpkPcXtUNLjo6#e#A>q&8854e(Pljb_el|WvD&Ou;CV%fH3>Sk zF`2*{rf`im#+u2bz>&nbHqx60yg5gp*BA7zYa_k;fcJO=Jxd$-zaTZ|M6`i5*UzXr z=GG7T4{BSQ^zBUtS;)nW*|e}M+l{r< z$)<(nn5O58505oDV{<_xn-=SA4PDySkQk}<>hE8<&7{mY(;P)ZVj1yroa=TO>DYee z+l3}&AIZWT#e!g9%NY$6yrBzfRohg6FI;%826p@!TRHD1990cGnpuqOerizVV+-XG zEfiaU1i@wO7V2^37JkKOq1a(ypl>s=TBs+0QDYP}h3(Wroe#c@E!*_MQI(|ycnF{q zvSX@dR&jZ4^>xRg5#aU))X*gK^ocF5mXy?%Tn{#?B(>zmi~TCO33$b~_!F^nC8?$H z?X4|ZiziiBo_o8g#qZ;e7V){2pXvCF4}YHC;!oQ7T#Mhc^94Gl?i60Kb`o`pr^TO4 z$9U=3TRLV-M}(O2HXIY)e!gYv+s!*i_j!B$&e0dsUjp|>P@>{U~_6XQh*sACyYeqTUKRaR4_2zs6`wc9BJk-BXgh< zd|2nCB*QcC47Os83XZ2F^C2QbN#+67n=%`n>f9#a{6paxbjfNe!GApjxQ7TZ2EG4A9mf6zY-%_zyB<+_J-EO@T;G6G$4|)|4q0H6cTMB;_E>nd1ad<2 zFT`XH;ah)EFj3#FZ^Eog@-Ot)C+P=yFqk-~y#CoGJr;EcU{94+b28+F!~?GfwrdAk zfSMS1u@%9j)Hg0UWs#?TUrpx&Zw0n#2X=yP%7M4*-w@zdfZqwctQ~lRG!ML;&!#0m zZ=z5aV{cPCeRqMreiHl)7a;d;N*JfCM_8#7CMmq)tESd}d1I#oI|Dm#a~#5s$Ba*M z^KX$~oViHS{(`3zsJ4b}uxKn*oKtYCOT*LqLY_+>Km&QiUV6(pJtj(ozh&K*$Cy9wiH&T1!s_wi)1?OTat)G*iq9F3G}Ll zltAK8{u-X@LmGPF)>v~ABEZCpoj84vIC&GLF5Z?fJ~LqwMZ)w6Crtg9)33U*gG!fT zuyr@slS%R@Y%)n8@+liEqGGU+V{@pe+Z=5Cx7$c&6YJlEmmj*1^a3wWC0Aw;;N2;{RXj7R^~`; z^PuqQsb<^kN85I+S|*Ni+oEO40^T~5nf)v`Fnl?+&ELVX^AXx+CVMyFq*(Br=$#83 z<5Y2m8!^6m5TJP{Lc)@5^Dz&v&?a#18hf_uyl8FW^(M5*qDgK(Fo$Oh>YwRf>rKCy zkT*$cpNgk9Ux+xG+9GBKjq0z2{-uMqhajd8Teu{CKu(axK>VTAF>R5V$UM1x|GkH? zJdidT`(P-#qJKXrit%R%5C3k%Ic8X#C8241wLTNrmTDcg=a!(74->WdsPr!bG7Sy0 zDc#%$MmdW^6KkaPxO6g~#~|Hw1C_Q)H#dW?U#e{4E28$DFzIG)WocbaUCA+5KSY7G z54A8pr>VMQs5DheYszV=`MQ}&%aox}&628GCvwi!+Bvb_%9{nq)AAQ{_L`;GUSrx) zKiF5uQe0U&v7oL*l-q3U!A(c%g$52Z`Yf~DW+16fRJpwmF=%VKW$$vH%Etd{xfPdf zTz|aEZ8-}r$MlK%KLYQ0L!PSIQ})J5{eEC~yTHF(<-z#6FPc8_)PGr9RURCD2+-s6 z5`^MoJ~4;DU{_5Sm5A9ypOjPxXJ?u;W-N5j$2{iA25%RToBc+38B5 zF2-|5tVaX-sd1lKkIp=S_2}n_L|f}od+>GYkER|ShZT)x`){pAf2!>m*zG~}K{5VP z)}C2Ly$X*07H-G#q<7Su$Oozog1bl78fFTOTRTZ~w?BqjWAL_=08ZP6V?0t1d(WKt$7`M{Yzw{Ot$~ps7bU^$8FSfv)TE$ zH=+BfjUSCF(-2>GP*xd#!|2x0ZT*dIh&TUH6+os@Rt2Us&5x-n7(C5d@eLN%sH}~U zTiP-Ti|9ba%n52jf1_--r6y#Dr46(HSabsWk57>|ZLJ9<;H&z_(SP7%*W)t|<18m6 zcPjr9^;c03ifX%->*?jej6hSnKqE(Cb)PovgGSW5{28QG!6fgKiQXrx=;nQLzI;s< zn2i{mbuABGi`N2Ad2mYHVKMXLf!YzM2|(>~c+^Coo($9^pq}Q0S{}?#23~jIr2wxd znQ!t1_F=XA7-&3;r%u004C$ETG;ZyblllHJbWR3O`OoYhcf4vOiijA}p+;sO&5DZb zei>1H)0HQ%M!tYNX={z7-Z1Y+QzMVhh%QEr^y=xXj~-qhg8KNms*k@yN)=4f6ZI;( z=<~&MvcPKe1iJ>W^#m8h2d5-BVdN(UuT2UrNDfX(aYXS2uT2du=pCHWCl*RDKRtMD zR&YUfaLUDGuE{UzTZOg0F+XX3O!dv+>9c=)_|>u0H|t<9eAqT*s6iP=ql?H$&r%iC z>;nfwVRE8IgAZW{(AFB~17GR*(QxGOUmOi0!H>^qP}MjgLru~T1wJ~nw$sgt4PA5n zflpmjK(w#_(z|>KqFX>6+s%pICnmf6{st_s^gfZychb$t4PCuYU>2<*9~b>#zgI(k zyM`(5oAX@$n8^7ah236Z$2Cmp;EWxwuuoFh9UG=}a>h$4OpOAr#?*r{k47gmAdGFcC%;3Qov8LC8F|yz_CyC?zf$?h*MF-$!BU0e zrjuuTf?0j+E8SXslHQuO)t|Gq<||QjnKU$N%<`icd>TA$|J8R`0;KZddx(Q!r95Vm zgi;>;U|2iY7Fp0-`D>QjC&AB&Dz_IPW7=A7?*d;&o&Rr^TWsdR$xvm-NhcqVY1@P% z%-V7?cPl=Ua<(t&jB|%KUEe|Mo1EU9sT3PbEE>;`NXKXJRFL!5u;Wsahs~`jMCxMA z=b-GES`9-~QWBGKaz($)ftH;#@+`d@F@ualb6bE3z^eqvX(!5rRBYbG*4EB6TW z2EhO23dbPnL~j}Jes%0in88p(< zqtP#ixU3*F?bMPcYN{fAHPv;mZ(P(#`kW50&H81YobeuE&D@dG+;?uGssv@Z(yYX^S`|kkj*g7 zit{U%9ZP>?ZH`&<+^*P^kA9V(m9pGaVU)aECSL(^Mrtz6X^vu3g{4d4dM~%jD1$%! z)wT~!$^!*mt_ky@P*|rOxboA!#Y7%!X62bfL$}K)rmsKH1x=8_^Jqo6Qxs*E6+308 z6V#33I%4*Ns7D6nDT;FED9T)xW~c0Qf_k`ACk?jvg=!!;byGrS7?qsIWLMih#w7EpsZ}I3$TNU-g#e zpYfouH{#t$_*HLhoILdMp_fnoWK6%D`yc4~{^F&LlRYbG&$-{TGUtB6zj&$F4JETmX8rV|btB$czBoDe>2)I(C%>~i_vyvS zguk==*9EzA@w@QX1?zU;_jB53Jh<-XGae*--HvZ-3QG!0KH2@}T+hmryNz4>=iHOK zc~*{FdvZ6zJu8P^URW~p@~3+by?o?rLoa{uF51^V{@`6}A18d|YbCQ5PhLFvlD)lh z?!L1*>75O|a+;IwzVn?8%}IpceJ2N4-gWWy&o1f`$`vaen-03mgD&n^i08-~D;@zk zu(Lea4h^)Xu|CnLY9j6i@1O}M7D=n=fe##_wJ0?~tE&+KJ*j!uZ7HvByz$hh1!?T# zbRT%#`{a6T=t$Vx88a|VU%967DEDq?(*EtO+M<a+_!@Mb^yMe2*9=A@K7_p zJ^+!gw*j&MbPqL^d#m3AONT^C0y+b94t)ZjU%+J-T&i~TDED5o9?*~A@jrNf2$z4t zrTPOpe@W+mB9`s&D*??)zn>Ai`u{+bh9V|QO0H&{(#DN?{dvr@ zs{i-%tWwkpL}nX)S0a8NqKJR^96nSDuS6045Jh+&iu8xG5%+y`T!>8Ghw4!&2AAdD zJ*YSzeuM8VcwgxQ0Ci#?lWN}v{DeRZ;Jd&;McMN&z!d#`|3;b)t%Aez_$kDF2(VI& z*Fo+TAXJ01Jukr5LejpHMXVp3z-#4fKfnlWPc<#?m3#M|BO8l-aNVm2R=x_iPl5d+ z-YVohui<+kLf*F@Kh?tQ`>x!3?MLlF4$<6aB+lEgD|YrFJ(dgx(m#Pz`4t=x9y|?A~-#$h=?|B&uoNo?T2t&Lff7<;Rli4Ga+43x%NG}(c`u6(>4JSS+Xz>k1MbC zUO&A#i1=_XL!5Ryo*a z@j}>Eh%Q0GeiOF64;zQziqml# zwjeG)GjQCr<+ERyu0YQ0FE14zLkXa;dd9q(!dZ25OXkg}0E@$i72f(GSmmF_>Zl*v*YEoJ&+N|`sXYFUhv6!!q| zo>I6hp-xgJ=MAjJiC#1CUOoc73^cQE0jG=7UGxKCCwlFWz9+NMhB5fFNSO}u*#%~sWRrt*pq9f)iC^~v8UEazu z@lq7=E?Mub>!%Av^Gh4Z~qju&klO5ul1-pZ0H$ni>y_b&M-gm}pC6yYJkQ-Fv3 zuEcjp?-1U-OPVOULvp9!4!K>4?U33jc6*n6LctrdyAq%w#8PngE#>;J+DzPhg`12a__$HD3n7c zS7Nw#37jZ~YTkYSfjCZS+`Hr@$l?^mDTz}M_wG4JCLw4G-|R?;2YK8Jky~>3CdF;a z-AKheO6elIA*dr|CkNKY|NjYl+!GcWjo%>W67h@ETJV&5hi}8SOE7Sinuue6Pa zO@_N74EsaaMm>h)`D_dcq>qtd8|6<9%Hy=VV3V4ZXJC_>lor^eCgt<6tzDd(d;Y(w-lN-{J^USWKA{Csg(0Vs zTc#e_Hz6DzvNV~HKKM!wLyDDP@3TQD-1oLYDB!1uA+Tr{`E8Iqd@Z#> zuEbZP4N{6Pih+_&TXi|}=nLlf>vC2|!l(z4S|Sva2rZGkea_0WNPQQ}5GCOEGKLkH zx*TdoY1*#Kxfj?LHIAv75gHuxQz&n&pVZr!iWpM|W2#@IjhYu}vnpMjbS`$4i>YxL z7;CSLlg4F0y7j!@WHGP*35w`tB5h)yH}eV$htsQ6gucDUQQ`Z1GNq&ZIhzHSpR z124{rNU!)Hp_VnN_sQ2iRwpKS7?1RUw}G#%usklm|0Z9Je7SLS?&y|biFl1|>40Zm z%dlj;3Pnobq}<8 zLxqUssQ3x6j}9%DQS6W>LL0@PEun2nY3UjG!~=?B`I_#LAGk;$J}@WsVizEEYw1~c zk4nlK50YdlxWJuTS4)_YaG~2}SRz9v0PO)XE57i-{-WhsSeVudx+Zm%`Jqx@;;)g( zPW*d_qSBS$DkDVNuMxQ_$g1RSl-MHG;}F?dEyH+V@tl@nNqAMY3`@bQR;Ksz)K`Gb zBySA;Ep;1x4o9RK-(C-jNXVAuGQArCE)9c+11vI`;8|htXn+~`&fy4*`TN4#AGACN zTi)Ay@GN}$T|6fnNTmX48YuW%df+*&rDr&ok>f2>;{lx9GBp9O(JfPX*m7aZ)Fiyd zwoFaNE3aj0%H9s@;)#}#zQ88t{naSoSGSCeXKv3jiucIGe0)~5jAT($QST7g%u}5U z`5N`D{9vxj51IGVz{jX>f#ny$7J^AKQwYAuVj(yp`?z-kZ)>v2)M`d8APJdB8$?=+ z#@8Gq*~XUV;Wl>X9QZ{F;a!M#A>Nbmo{aZ2yk+uC{}!H*K6nn7<#BS$bSBT}mg!8M z!j|bwp0O>{nLK$d)04gRd$IXZ71$g6C^JiuF``<8%O*>aQ8@&Vje;nnTVWAp^mbV~ zPf)86AdiT&(J%xW<+r7_9z)x(L1wWZwH9rIp9NyHQC~Z-rO0c!Nikpva8sL`hr48I z>vai6YX42PN+NApwBs2anWTYc)pFqb9)blDK137BI=ih~N2*Wxzn4XRLn%P>C@r>e!sox@fi)}@0Y z3q`eIVJ}4WC>6!B5LJYw)LxCO?T4%yvf7LVZWStutTwD*wc%{hTVPnOfCTy&FR}0(KXwXcmDXF6AL`xyw zm*7%})*CxK#n;}1OInd_i`zfN7b)TX(DGp1TPdl5O^I#yHvIc}oBaK}jsAY#3csJX zvER>I-uLh(+HfR)ZKpspy7hT`x_yT;U8YafKfJ1$BGJY8#c3&c4idIBJh|Z@PAkVV zQ`nZ_nJ#R%;CZ32?ZEQ_{F20q5NW#(+7mY?9Lrut`q0!{!sbd<2{1^gpmkPH`;0;&c&glHNHOmn8`wH^Mdqwj`|{ zwo8TW@i6RfVc6a5@w?>pLAP9r?@Ix{bb8?9wWoeMZ0&x}U-;(trLbSRhhC9S zLY>LzMjtOc6tE7Oyg^Hxi_T*zdB%D&8h;P7G2qLm7(3qa_N!DA<2U z9U?mryRqt|P-nVZ&lCD?qeyomR}8)5xI`67-zEb7+Huzojr@jlbnACxcR*nP3R zHht~v_Q!3eufHl^#F61Yt01auSaOhRE|bpLt$#kv@B>|*@H7VF-0 zdS*Y9e4L_lswR9{^ghTQ_+r``LCL#1t(4h!x?OAm$>*!Tzi7OPJym(@7DYK(__9*& zCNx{K;6tqWE2@^-XXt;ft1iB-th%P6a$a$1-Q2kgBm(aFEGnxmsDI_pv)~~E>mMc8C1oZ3)3eGmjql7dyL)DY z|4b9Vd`@j$4ev+AJxrBz`W0izq>(TMRWqv1FR8}Iy2(LDvpX+ifN?+;cjt8!TKtF5 z(ey+<(nPMC%m9q1%G*o~Ej}ftS0nI*7T?lpkj5DNer8m90$}`_-*3GEnlP5ANV8N+ zk6K^J_Vjho`%uy3%Sns+6&z1urwT(>V`))YPfr2Pc?$1v^m2f6`4Q;(KyM;&>J%Pd zPW;^lN8{`WgFk3xFB(2#WbVYVg=5DI9eh?D?#Jyrr=sL6CosGA&+&T*zvF#ln6nPI z?6}-E)N$B^F+MZ`7v&9`pFO~bW}$DtzUf*0d_(Ih=9CT|j}>+O2KxG?;~tZYL4(ur zpWRW*t*XL3z=M6`3WjC$PfzbNuCSvf##Q$s1*Afl!-6>c8Pn)=V8O8(7C3B&SEu?5 zzd?4OTJuSG5IasxS+gr9C1c1an@fJPkp%_eiF5>w`e$ns@_s|-yw>fIcAHtCBsD&X z94D^KH0k;PqcLie+%5P0PCjS#wHvk1yMR#g;&!p>+KqL1f-(slR$H20i))QB3BJrh zC}~-%upETOs>JewP`dL+4sbmre#|2i!oed`L_)0H6uUliP`tA8q4{P?4Tl?zyp)4B z5ly^F$8Fo=&OEetiS0$lWerOXRE@6N(`kQ=8P-hrr#Y5=`9An(`mStQakfbrfe6#~ zefi6PFFH@7d&Onr0#Gz!LUCDjb$Q)9+`)~CrM@dmW?MgJR+g$h#?lwhtgaBfb!~NV zmC-jBl+})?t{!QnhHng3F3QXZpIwR;D|`xfmi6c!!qd|S3>e_^4ay#*rk>dg_0~3E zkN9;^A=Ig;NA^NYq(WKi6b4=nz0jlxyjZ=EA9d>#=B~x~*$Y{AcY&`&+jSBB@ z<+KGjdyYVl@!b!c?x&M8**H4!mkpfJ3h!{~Hvu>c+CcA4;M{)%dhHR=qriEBiaZ#0 zQG&l1<+(5WZHsX#&jVuNMbt|l=v)fC=?a(ap;Njn0?tZ>=aept=4#+PqVU+MI?;O< zIG-PZUMl>51DrFd28KCYImiUgFooyDANd&voCy{@C;p}ZXO0DrCTdOhKvmLd+C~0ZwR9*r-uCWO8NKe0{Lfrj~pTY4$hE&K284Nh4POd`wjkRxBmS2 z#t%247EHw5dihCut_LSmBL8lNz^Nn(>7kyc%}PadWQawwEgba ze-U_Zhg3u-vb81Iy{ZEoCv z3R|MSEp0PUlYx8=8BNgw&Bo!KvHm!IW+W1?tkE!9L!Gu zEY-br2&B>I!in$j82-Nue6g zI+lyj7#s;Q{*ZUw$Zx&tPQy*A3HW59#{<+3-^uvy$kg$!D~cnxfXDO3RZLAYS5g3z zSDt#GHU25aM)bzrr~hi|Yn-VZjw;>dKs!E#X^ z;6A~k%v?DSiY$r`X95D-1;GEu-j@JYS)6NsCnua7Ao>M8B5KqF1dS3fkg$s6gpf@L zgdG$(1d@=jC1#PO0YXo)q{rOW?ybFxTHD*()-JcLv|33Bi+k0oP1IOyr3K@HOBHG$ z|MSeux19yjs=fdH|4#CKXXc$}-kEu4{bo(J6L>IaijClb*=I8sh*Y){{6M7I37H`H z?SudbX?8+s=um=);wT;?kGpaG9Se~ZOdX&0fvJN=V-J#1H(4d*9^ z+T395Uf|xpxcy|pl9v4B!}-0$g&TXr+r8lu?4L{0YnG(wHEXf!YICN(^J)Fm^ZMzx z^_{=fk6xiaH&oyGoL=@@9EoziUfrYD9X(%P{~Y&`oI0SNeuY?U4mtHF;R3|{`st_j znz`6h5gex1)THY*JF$~1|5bhGqSy7E71+peOh475pYGImKCGYmjeh#1zVoDh>O(<+ zRXex099`_!pDVz2lmmJhcG(@#_3A%hvz@N5KcMgYtA2E-{@iqZXRls{y?1{`uxN>3 z_3Aqxh1+5JbKJ)FxL)?CUiXS+{kVP#UOuLuI>pT>M;Ckb=Qeruov-UtEMTAt2bRaza1#F2hyBpg*ObdRjmIuwKJB9MMl5)lVPOcXWn3kw%)<-h=F%RM`?t z(d&QfkDwPK9|tq_8cLx0bangat-6BDs zUjI9wofar3!EAlUF$Wq2Cpc8Ee-3D;#Z|DFsP8!9K%>z@MJX>lzqrs_MMa-eb1NibEfe+Fo$MFuRU={rt1(C34Agk@Dy} zuXJYA({n(71@yTo`e|&Rz2(o)@AT`ZH$i_C`kGArbS3n!LJz^8E`a_B^o6DR>BZ3h z0s1AY^wYOO|0n1-*NUX`9xuU~E`76F!N75EIrPT0p!T}!pH-K>{u8LW4t8j$vGju- zxa_eo1;40*3jO%S;bMgmmDRy^U<(uUgY5)gfM0?~;FsX>`oY7rPsA_nefXt)8h&Y? ztsgu{dk=nTKNP>TzY4#!pQs-^KzlEKX+I3Vv`@z`?I-I8+h{)szqG#;zqG#=zqFsK zAKXv-Wc<=T6~DC4z%T8m=?4$d{(St>{tEokek^`zZ&W2e{AX42@wAHnb5#k~LUAla z)+F=fnz;q?XYrDKu+bji>mk0n-7lTr`6$-JwH>1|{4jci$uFY6_j1?okGy{%w>7t~ zAtBt3QW83ZwkBcMnE+r-4~IIuyFL`!y}|CTmED~;FYDl!UOFC+7*QN0bVKkSA#|LP z;Ao>qo;#5Femin$%0+4Ab&KsCLY>4pg8nMZ*FV$uHEl9d3T**_Gvn=Dp5=96IniVATfMs zWydV=o`^>dHgoJ$Dz^y31Q@UoOx+FCl$J93%mV??^oJ5B2`+m)1)(0?k%yMNgX67q zAX!}v9Tkqc7CH8M=;cw@`o2L(p+T*=%$hv8(w=9HlPp<`sKkd2egk;K)Swp`J()|> zsM$fqZ%`^!QT2%QWxJ&RTL zDcxQ3yE|JyljehUsp9R;>g#&*rRBXTzdzDFvo{6x<+hP8i9%`ArzbF6VXsdc)93Vz z>N;``kZaBdFNZsXC+$Z(?!$$lzCdM5wg_ueYhLKXfPVXUQD(%-S7ta_YACpsczjwK z-YbL-3!5}ns#uGP_Xwfef;aQHPn@(jO3?1aTUN%*29nlh(z>COnfguWtTGCNQl+_z zv)&IM5}^(!|D4o<(3wC>@@{IIj;`!rsg^vLo4j~DVi&Q@S1>a5lyZr3R|Zp(Ov!s_ zA()Go$eqMg;gK7x)pGLo7*vLn8wp|* zDqE5ZoBoVzrv`%{BXA*fQj`Qy*i6t^>XS-M*xm^JvX-zx)#mo0wP?RU31V#(iuPNJ5F|l475oB-ZU(s$A^+?>Cf= zKQi9tq_=G@fwFMBIQm9a@x|dMWYZp8Q&q8MJ#!cbhW!{owjT%2Jk-Cba*hg7&h8mI zu#Ax21k1UaD-SwKJ(4r?qmy%z7?`$C!VeS}&R~+?mu`C+5~Gf4r2IkGMsT*pbP#MH zXXR@0W!E9u4Oe57t3gq&nAzN}^>{O6n{rC$TdpQ4S3J}n^0Ccyve)N!#hUBHNT+fo zFpl-CERXS4!LkTZ5rc&lw%H|!)#l1`%ZrGVk+V0_2^2AsCaM8JGbo=|CJnIwXWKld z4jX4$L?6x1;_Y^^kAQ#e$$QWIUh0DNa%mcwr+~9t3zpVZ6l2A~9spI`ZGN$f>hvom zD%~#-7}l8dYy0;59=Fnh^(NH?!Y}InlP{qnDL8OezC;3U2IM1*Wu$C>6Tx= z0ENm2znl_d73bvai{d;~U`CMv)byu%K4)=$OcJqhD3UW<7boYTQJgVN3Jg0KOzZ2P zSq1__PxVLngPJ~)Gb>^z=V4Kt+1rrPV7=oXk@={_`CY~NQo)&q0r0dLztO48j}E6_ zmqz);)-#@8m#FBZM#X}$c5+UQ;>?j9tds>0hU|BD-u4qK7NZsCE5Mm?)U>IJg7`9( zZ6%Hkn^jH)SV)|@*~%3$PFH?VELZb0Ry`oo31qEYxgtiEQ|tZ%`X1aUE?g%RiWGZ& zI2<&$%g;BSY1d1_c4G1agm746=qv`PlK(~_mNS)vy8Z1M3R5%LYPWh*b;ANS=?homI8@1i#$W@@XJ74{jfGQo#nr*F)(O{F+%g`EG^^{Y zt@U4Wg_c+zR$O0K&DGcl#wHO8RM0q-wXQn$!6AyCC)bvlI1w+W0D{}9*G8bMIE$vi z^e%TzF+w=ArV-*YqHT{F^#(ng3p#B|dI1iIgAyo{04ZRyH=>9%pd8d9wzDreH{4jM zcKFnP=0+S=}~qO7JJqI|X@fufhn1XW{oYx_B;j;h^HB2YX$Efw@xQm}TRIuMn6e=itY_L>VyK z70yhL82RN6VD35xKemG32j<5%T)go83YbT2xQJCqKLo3P*lK)KdmqChBsT6C@32&} z%Vim$d)S@eKs@Zmz?}{8`hY|S;`IRo9Og4g9tYw~Qj){G$H^Z4xg7lAUxL#=5Nrte zmuNSiNdm!!fPWslxz7uNK*&hIKh4gc{@Eq)I-+CePyg%^fPaa0{`Aiw0dJDW?jQY^ z5|I8sZg&h4{j*Cz_-B&<{j*Cz_-B^@{F4$;iA4W|1Z-v@0cjTg*(4zSvm_w=vq?bu zXOjT^6B4lT7ZR|WDFK^VNI;t3l)^ESK>BA%K>24$K=@}%BoRO60ULiI0h?J!z+pz9 zrCIrBO2F{XV2AV)A&lUUJYeG|Bw#a(Jm54N{)zNQk|Zhr4gO}9R{ojAP{q%kVB^OS zIpqn8&7S^S{OKDg4to%!dFKcFKK%XZx6b@0>cP$=e74~E4#t9L7MF3LIruz^h_M>) z?_I6O){{**ALrEBB4Y+E>wSDaY1*&(+Q(OSzV?#dePLHy=i{9n#=tKp(o!&ymZB!o z8ePSmk5sn&3mtUskB2g++ioK+bQm)v37l%{3&7a))zCrjuG2z$o0xU$T47GS@vBcx zys_o+h#lqpdXnSy{POpR$uc(89x-4kbr{prhU4*xp;C^ndBg~^q-}?pJr$33JKoa8 z*GwHWP=Q?e>zt@#e-7yZb+H%%WOHN;vi{N!gP4AN_g;*uO1AWbir!HfW2sj`uMWq; zIR74)?xJ;DHo)3Ku-`q65I0w)is&Z-{JQn@~9Dm{9N`@qJ=KVHnze zF`+<>IiWDjm{3RsRZb{$y(zh2YgSfY_}!iaoOANXOAC94iRp!5VtT=ucZ4UlsoHD8 z?VMgXI|%c+yeZ97$jsFjX!=HXSNONxokA@6m>}~*Ixp+Dk3h-e0R@y4hI7<86&&rD zDkQ~kWab{9kl_^QJYwfP$0p@mgUn4^U>+xM&3Mb)c`tOs1?^E&_aStn1q}_E@(o6t zD$T`hYq$kY-+dfZPEGxPG2x4qk%-(~c+Fwapf@xZ)(6Q!ytfTaOL-Zd#A8Jns z9ZT5#Ow;+h_G`$v?XO|FH>F2^fQHd8wD%1D;Kj-otoZ!D0xVW_=84>Oa|g%7WZq%4 z_?1A#-ZIqif1}rR-8%FZc*+Y<*u< zLi-<6!cUI=P4y##;M#qr{SPUv*%yxfZTp{7M*k-KLaT53=nq<_4IbTv70GFE>IpwK z`U!UrW@1xXHgK73)gX5dbP#vdpwZo2w+y>sqnBfCHtbqJ)0vcA2dM!+tP-kC zY(Jec8jF-if4J+gun&I^Svn}xmV%Q_(lMi7jdg8EvrME`I#Vmu z=C`HSzEUhwUK-H%)%r2h456olA07Re`voa-Bqi1{SEWGk?SD#Xoi=pz^AN`9$6B+m z9Q|Qy>Y&lQc@dH?&4jBbu!J2fl;lg@uPMowj(!d(xqciW7m^1q{Irrh?5dv;lE)Hj zaFCLJPDuU_hUDo`0EOfM6he5-E_u{!en@^OBz44+JjVGA>Ip;gph(FBt0a$%4`LG~ zKNOOso4%otJT%}3(Qfg#pB_580g``V7jlVTL;4W);n4OoU{jS@*|HSvTWx8mEkQ~C z-ywNc+o1!gaDl>wo)J1rC{k`#7-AAQYD$&$spi5{j7QF<7C|RxQ`vO;M2{#_=(6i`s8cow#EMv-#IjN%Ak9r3yY zW-n|6M%dl05Rzga4PuFx}iPj`cB|Y27ujm4%fEe7B9!u`ld)adeP= ztjbJ6BosrfN@>o6E6I7YVFijay*MOiNgf6$DN{6Z$`vtAS8~3WDMIC(p}I@CB1Urh zrNeh)cGn9_nd{CzXT@63?P5=ZY+9;{f>ulqD$blYcBak{;fih*1QjBEv&)bbrQ5{{ zm&$YAl&@ImF6HckD9-(#6J{;KGW_1PM<5I%9Iq>loD-(cr${lSL5gl9L6q;zrOsRz zZ{C;{HQ5aQZauzy4BxL%oIlFEG37{p&J%<(6zBfW8|T4A)MS=(a)>9|ZwS_J4%Spw z1~=BPH&(U;D~(B-U~OGRuo@FK!PV6b^(M8kRxE)bF<5Og+RXH~`2w z)ka_CWLx&QY}?$DHR}}b$f5pD!l}t4HPL3w_iZk#wW2Af{DSorYZ~jS8@56~HS4P@ zv_Q~C;))z)5x^~sV*2otno28KP&_ku68961sHL?=wI z$+L=rQ7jjfRaWrs$8nRg{gyiC{Mz`e2@=iuwTs03S`I3LJmhDpSo3SkRSh8#c*mGu z+Y53q0vCuezs7=dF)Ia|3dERSV;Q>`uT*NFSl;5zA6x~@L>n&F{L6f}4*>H;g=5_< z_(jaueH-*h)y(-iTboLI)~tU3uXoPjZ#i(iz^r0d0g6$N7mq!_d|lxf-&pZz2K{b@ zfmWz^{6?Uo!5d_#;_>@5?8Ld|0wrJZ_&o$(Po9I{U%`R{p3kVp@oee#5-_jZaIxb1 z1@L+wnA<3DD2@z@@Wq(_Tg^t#ro{Z8t7It^z7X;b2+gc$i? z6mSz1){ryG7+JiH=LdNHVK)L)Zu`j7S3GPq#=`?iNq>k3lJbC3bxbO&oU0Lr-Z(tkR3aPl?g|3Bz3@+#^#mFBmsu{DoQG^g-7Qyms(t zU-r-m7frl)Qev8C)PSp!t{yh|(kYirz3lqrjPu8wH&(wcb=nm-Tt5BEoR8{WdawL2*)D~#rx1+pa;g@u$ z29m>qY^PvonH8w?mAzW7C9~GAd(>tX(m3|Zg6PpWdddE~N1S^rX~i(JcP^_5)_hdP z05waH{PgAa0Pm94ISHdrh{3s@L287G`^O*hdGud=kq-By=nu{7GYq9J{h=YIApuq{ z)8xi@SExM^17?l;5Sy#vnEiB*mTl^CP2F5m2aU#hk}5$PB>GX5AV<=?7)9gm_%JqU zugqK$-jNZ06N5COHo&)fD)c_aQ!bZp-i~vS&JPa`FZRw`()SDorhB{?)=3=*7w#Qt zPj5&|#c8(r7<%xz8lQnp%I>y?3&L|U!;6y_w-lte%*m#!L^&Yg?O=$S@i0g(ZHUMW zY0x`EmLA@e8D8mQ;IMq2#{-zb3N@vrYTGa2m`d{$tuZCMNDCKu=P&7d3Sk?*GX3fD zv{VFaFSDBq!Fjr8@XD0X!NhA2t;YSK9qC$wZUiqz*jRhZu=zyTt`T8Fyb`q5 z!sa4wG8(p*^$~X%xj*RS#-gXh5M$4INU-+f*q73N1pAEO6r+tzp|<~>dySa?ufrot zE!!e0k)iNA7LRpr$AEKdZU|8Tcvh3S{D^swByWGgKxFH0uyk5Rn zCgKQ$$uKO&6%6xmpUFzOXQay$>PhUnIg#%I@xIxMT!xz{LLD6E%y4zx{9ack5G95zRkXHk>`|A6`pd)82vk*A~_^wzhLLgBeZ;YD6|d-%re@FlH# zS*V$lS=IFnR-F%#p~clWGFMA&8jB+?$zh%qxjIQ`WzlASHj4Iq7Hwc-7j2fhc!fFx zg*rpdXsatb1jQ`o%hQAzlhtN{w~>sZZzCC%fQ^J~E~*0?$*34?B%_K@Bykne%2eFp zA!;b`s%&wi+(eLYsZ~K@B#mV%lExAiNn?47q_Olx(pVM^8fr=vn!MUj2d8vcIH#(~ zG*vi5h1rRYW(L{vm~{`vb4YwSFMkvPry5XM^Z43D0Tugn-ploTwt3? zu@9p&1o5^=RKbo)UfD|BR=$MtBNp~yB@RV6hqj}qYLF(t@RN>N<&9|zmRYH?2NWuG zX@qTHi>c{$eOuT@zP_vo0weVI;Qb$XB*h*=`soZ|^kuMe!l@ic%H`fM$KJ9+XrwE* z96IAJr=XbOjXX9mYPv#BI5h)9wZfNm!a_eLiTLb|JUN;4X~pBfmmdJZ z2**o`%E=^WnB~-wJiVWL%zsvj!11#-sa+ zDcEK^6`H^ZqjYC^R<@yftr?gYvjYx)3@^k4!NeIGFgYZ{A_#e_YmHdRS&5lA#@c=_ zf|P-noebTj5yg3Vycg8zi%tqux->ywf4Zc=T)F_1AOw3(;!mm1&o;BtlU{ z@#1kEFgXgx_{NIIt!NvHf!W8p6zXjJehbVW6)qmX{owZoFh62lb`E|W!2DL>;_({} z9^Js4=?A|HAe<2t5L7&VBVm^T%v^;#TYT35Qy;uM z7~Yex3=9=x@QiP)>J)~Pq5U+Z^T%M2VmGAGDF(~<(?%yaGM4sjAc*hUWhX#N@8Uha zsp=lzW$(e@7o-e>bP}W#+=A)rTGre3_{&FeckN9laGmc>@8M?Oo1|?yY;WrA3Y=h+ z5K#R1Fb;s9RF3cQYg)tGkKrI0Au*7kWRSwZX)un@N=9TJhpU&5(kXTPy@|qt)yuC)Q*@5| zxT5oSmxW6aHiS|9qd3U;ynI~#GFCU)BaMP0qsI7L3RlQke6uE?;g~eYn&22gtO;oI zI(dm)$IORZ$Fhc8$IORZ$FdfY>zGP^ceLUbahB#`M)f7bDI#dpSgQKUU~nUAED;@} z#uBk+PGI#V3~4l&HI~q;!tX56AAh7MQWSEE6os53MIon1QOFr#zo@<-ZBg|=;0$SG zm4(OtQhjh6gxmA*Y9N zzjWqewRefrIJmGq5wm7^A=~n&pqFz$$^r(=H}tq*PN6tCUBgBy*d!!`NgC84UH|?d z*f-uAdb4@g;Umz7-f%VEj;V=;aBd2se2WjxGeyjiY;QKhlpQ*Zg5zyn&meq~G5>;$ zI_5(b&pU>oX_&+MyCcom`eoc>NBWC$(tK6N#psrdfNwr68KRdu`p!>;Vfal@7sRql zF8e5p!d>B6zQy4zdk;lT2kd@dZ=Ht>V-$8#7LBfkEcvRii*^@<9eEr@hP75?$rt6@ zDER{R&%O%8z9rQw3a#Uj`=NL}ba%E}IoC$VcJHy%nIjDp5r z%xWT4rV_QI{P}Yp?5=p?@kG`vYz@1~_&RMy5GqxP$LpITl z=09>q4l2W-Rq_QDZ^l-Q;Y*PDu2VYla~@RaCB1>wuD-!~G_O9PD!L{~RvM9DTq3^ihaMloOcR z6=%62(9XI4bGXC7gPhlWYEp^C`B}wT&f(fQ_kYHg<&d1U+g^Ib;(SzbRx`G?X&%nT zI#YRw#+>*UJYr_EA!=sRpcpfol@W8B$}FtKyk0}ZL}i4rpg|rZ$T`G@SQpbv04D|| zL`+F8Xk0C)DdSBkIlhY)LCuxf^|cD$P7 z>{sdruQwDw7L8c*c+6ZM05g#5IG~7&H!pZ0Fe7caSp4XIjKYu~RXl!Uft%hBentJ{ zR}9>;e(+n@#6b3FmKv$vE+9(_?-miN@f74v!%y1z)Z2> zV)5g?iacOeD;yigc;RaX<_qWGw*w5m3Cu9oq);Zmh<#V95b%k>e3iWsC^l`vU)w?t zgZ_}h&`c%vT}9xSjrT|40s(s!Ot-9t9|i6Og{Ayr$>md^zY0u{4xr3<*eYJqX}uk< zR)velFAKP@0rRNBv4W2$=a+$b^BnxX4fiL3`IcJ9#wsM1{3w?{*cQ9Ni1DvwK8fk4HR3!^y_m@FGEo?LDKro@Jem2M0l&$cYL;o|Yz z1k4T_E*3wAZx1kEx8dUPyBnCF+HkS>T>^d&0`r{0v7wH~FA43?#atr=WysIAPT)R} zYc-chh}x;km(vBB74b`jb zm)F-+mRGD^! zhqVMb_NVcNs{{7OZb$vI;maI0)6HFaf z=1RBFXzWDT75mY0X~DXM>&#nWk~>((b6t#FOrdhB$bxiz5uPNigIeZFD&zMu=;K)V zqpd&@Y82l5a{V~&MRLcu7il#3%c!t5mI{l3p(wJy>0Tr{kgV7cQyKRnG4pT>=st=& z^yd?D`N%H`Ry#b^e$Gjtc*H3s6NQd~W}`1Vi)@djN?@)~D@VkAibZ#kkae&nzc-xE zYhS~QQd;sKUeKEVVoS+`a&gGw(2)~MS{ChX$v@Ci(iYBd3$Hj3ZhSbreXqD+Q&0Ek z>A09Ry)vMu-?~aqe^g)oyuS2peOZd0{;dV3B zF@5)C&P{`c*ts*IA$D##UOT<|p+4I0OoxW{JBy&9 z{mv@9YLfLsZ_vIb0~*@b%!Y>cH5>3+o1!0jmG)~hp`rcSQfO$uwiYkkm3XL)_P8YR zP#f(F7eYh(!UnvS4AT!iL;EF@p`rbfrO?oR$rijer|O5^r~T$>(9nMKa%gD3xv6-^ zkX?tGk?gw;^L_k!Y^9J_r8e#jZ+}pxC(`mewAIsp(I$TWhE(+v4 z$+XqSbRZ$$)W4kM*N_>Cm^^)UyLG$1@737Pts z14s)H9+!lGKBf)A2jO8!DAmX8hqOU>R1#L{V-7*QAUr7vxXN@eucJQfJ^n*TSKk~i z>BTXdPuzSAvJmHNvTwzT)FW<{lBM=mbO@(|=EI_@eAL(VCdR0JoloPG%&zwj4A_>~`ASbh zXS?wJ>(wo1o+@4FY-(^^LXIL+tCkHmAv_c1xF}UoP!>O2C=RWKd45mKG zBjCC_#UXIX9c=Il@pv@sZP1GF_%tp%pC)t@p_8^SDkV>HT?HHV+Fja(qQ=gJK1rL` z^(L3VCCd;nxv+_RONLm2fKlY!t|TN0r}tAjpAk1mHlDANB8Qzx&D zYr--Dp5V$>auptV{U%NFg1w;7<=`#jTLIltLEC}1jQQuGTZKoqu+S)VLhQp@C+|^Q z*1=-VOd{KN(aVF0;-XrEM=is|ZmZequ0r;pEH~^aQW<*A5_gHQD8II=ARb_sNLwHby_axQ?w zWlm-PKy||kJ6ROqod@S}wJelz>>%|5LyZ_p2;f&zqR08!3ual|Hga8ol~(FION{f! zIzTYiz?z(dVJZ(${>h_)VGznWYR&BD9H)(*9bg`GyV&Dq9@@QR;lEiSydD&)B+ZXr zXN*JQY(o=X;GBNNyA00AtAoC@5oOXa%@RI+w2^;an}$jMp{7-ED9Yd99o{ z12X;aI7=Uy2Dxm`fY$s|s(CSHlGhNT{iGm={zu2(z&}G|oM8bZXlyDi5c` z6?nYJ&T$hShI6qQG>BcCG00Z9#7ro5cG^zAJokZ^Mx^94Dh7g$b3KhiJq>e=^E@jX zYBr1y*4M)g=W7w2pvh)oRpZ9ho64#Y7sCq`S9O%9NQJ-uB+jhLN+X2gS9)VyYG-&U zf@9kdiy+Dna!YI!C`OnKbPOv-$BKB2ExOiBInL%BKVcjO@C|jYJ+R})Pns;TJezZn zn4A7G$^k0|s+e=rE@@}JW6VwOh2?i6aAI!SRvFU$9e9E$Iww?tV^uBYDr}WFaij-i z*`!e@F~=0KXVutrZeaM^%(>|p{EA}ni@>p3D2>8pM$K&zw=fniBEGLeCQE^v#<~XT zZ1KHaVI&gq$DA6{ie9~qhkdPo+!>D_{faVqZA|EOA5K6!#yDlYcn^PgdBg4(8@=+d zk{*xz<#&7dU0x8A)z|)~0WD2wDRNc>Lpf00*tWu}gI*FcdI=+8f+bw}IMP+vIXf*G zyDLI{Ub^gB+1vCq?u7T!FMjTe8(Y|i2ghj;Op6G_uW#M{Cp-mW)yy`GH>00CeLVF2?x z4>A4s`tj-t9KkMv&SLIvydeNWXFDR3jmTto<@RdXjJGgOjEK zd-;RIj+lQsQg)pQz^LDT6=eb;Byfk$hO}&mh8K6KyfhpbnKQ z@G7p6p!>A1K{rC^+MttMU=%8_re2(%&OMyVh!z7_6`&|xLvHBnb>ERd{}CACs_eexi!(9wAGlju{zGqgFV>I zqap^~ZCky~A`DjydX!2Bg&`0a$0w8=>YyFfl5Z5C*s4ZE<0lCfG0v{N9Q-h1aKo6& zUs$e;0SRK9uIP((97xCFfsa|PZiXEdG1C9_!fb?@hGs>P-ANiaUT7!`v;^~t*VNQ2 zf}g(I+KqvryIpKK=*QAWM!#yM#W$22wS3Z+794)E(n7)v`FuyYB1Y04QWP1&=p$7g zg}v;@)XDBhyrVnT)NHE9^1L$J9m(ZW#*eF9JyG?dtZtqpnC6Pr6Ed?avt&=FF4hV^ ztDj@LPg!)Xj1$Xcs2u$@7~qA~gG3K$(nO#552-@U+#q^Lwh}}yIIdu2OaN-nfTx7cQ{SLl)#LL;^!U*A^B0CX0^LJHhrHG}Z22IcAhfaIxU(>&E(*);t*s`*3 zCnq8}+~*N3FozU9;$FQAgl;C@a;E1-=s0!Z(dOYT+wCB95?2MC>^}}0GjpNp@quwMd5N93?q)XOFBK1?_N37Ishx}r^-^&{I5`Z zfM;Xh8Qz|ZNwU&#`{|pE8DVQ1>#w zVZ>!|-OI2IEf9LmMOyc=6LKFAc9jQ8!w*YIg&UJG>xs^J04Y0-p%k02yOYodkJIh# zLxr>R{2R2BeSO=L_wuI)-ChuJ=cT$*wa3-?YoymSSL07qANM|Rrlft^Q+UfV&eWj}%&`1gDT!k0LHd8IqFAvAD+=0l6~=Fx6mmLykDmUzU4GP!RE1;5 zfuIc9woAWD@ zFsogI2j41Knt@%}>73Oyp=ko<;8WMq%ihf0ZyVyCi zUAH(tJaPsacEfp!(#VZf!(kF%JjPHjMxM*o1S@gJ6TWc7R|<^PhSB&Qk{>%0va_?t zmyerle%w@6I6g`&dilh%%qbNUCr+x&TD?Y|0SUHe9ptrr{KzngvE!LFjjK0A4XPWy z8c`{L3j@h7CqyoaLd=4ynmR<%_T6O2!nDL#b5>@|vF1tWyV{iTB{e>C;&}Px#V@H( zYaRHKszt%BR&tO0k{XA!DmRAJR0_xXlKL6!z7l~GUsATOVLG3QrC2Yt5@4>h;o|YT2AC-}T&(bM zFfR|7uPPk#Pdt7nh*903Kx$bN5-B9W*k3~pw7lG49uMh z7mwfN;BhZ7`xTDuS-ki@56qv=!H?zj1TcTG;o|Y@14idc3aEJDV-<7>Fk=+%Y~jlV zW?nz|-3&}kKlp`!`BFdl{VOm(vEkyy_W@uYv*BXpzrBd>bHKE6`U8sT6OZ4I@bR{f zA8=6dB7#!mc>f z*}^vpm+o1Zf$!{X;uJdbJ1s*E$kCpFPKJN14WmB<6WM{$twBH7TR^V*C zaN6?QtY|peeLPfW3*TyBzOHa*3*WN}BRML6Bg!wsmpQ^f$lrM3`xJ0tg^d?Jwu4^* z=9t3qizk-+3PGPeQu=4SdC#9|Ci~4HqvTv;*_B4Hv6ilHZHK9JS%% z@p}uHJ{v9`zkz9*b|D@r#v>lT%YhkV!^Pt_37A|PE*`&Gz}#%Z#p722OpOf}kKa~c zT5Py@{JsRtzuIu|_!HAGRXERC`28H1gXiE^2lu}LCihzDuh-xgkq?-i z?ob$sjGYhY-7jL{V#x3Jz`dog@#4$=-YH-bM@wIcizmPHfw{tli&cKfFCCaH8!jHd z8-OXX;o|XI0?cX~E*`%Pz%1Rh(`LiP+`Jbo7fbA=5Tk6$`4lWn+o{AK`CV#CGbw*;8AHe4)zteZv-&o6)s-+;AiSIU>5a*Up+9PbMRwvYz5~2 ze(-w^n4{<5$Ir#LfEh?ZLY=MrUI@%c8!lFQup2%GnAtX5y!2fROr;G+ei(whZf1T# z?xNWXXBW?yI-;?$x_m57r5F*9%nJK$Jm0}n^-)f}C@bG0kG!~bW7JU>!Sec=#!cmu zm)GCA@gvW)W58y?;*#r1^KgcSe{n_K*l}YgPWI2>(Hv9f)ZFSHKgmBnb6l2x+?1)A z_@6XL%dM@g*i=5%U$P)?+=R@`jFN?ew7U>rY~N@Y6+Vw5nAi7|y!`>U67PPdaUgG! zyN8gz0ep8bUHQ!?H~C2&-yB=_h?T?qvXCn%B@IS#iyeRIn(9J4N!mKsF&dVMYp6*g zBiTg}8uen<2RNZ$V1E7r?CuwMqy#7S3!E;&1NsGKX-U$mj-l8qJR5K;j>$0D)p!_^ zWLgLjOCb_LcXl-i25_b**Wm|Bc)%NoUd#KLaAxDncd zE$i?K#`N$!=mL0r+HjM06?8d*#s*CkDwepWRW_M{`6}LI+YrY(!KQxWo)Ll4h8&h?6w_b0!UQ zgA6(aB!kWln541hn~ldOmOjcz1Ynjr88{|aDQMEgBIvB>aHy6lLH=m7@QdhRNk%yF z3DOY0^TNqbP`uoj+;>E5Wu6bCN8?HWse?w00`k|8%sl9mWRj3X!O83(DifFtKbHs~ zD;xOh6%|g4NMW%Igl;^dijg`P6(5VkinDT9V{(wXSR7WH96~2Oo4w)0-9&X{wRNzx zvK;cUd^RG7k539X8}?XMWZ|9HTQFkRa+_B0Xa0Q|ed&NF9?`>NtlWb&P}5 z4L5aHnL1VvGLWX2$MbPG$I#wJ~_UlaDR_JPlX(!$_ zLbnI+O+wdd>b_{|zGmvaW$NxSb>A^{-#2wXhAx1Ialxm%cw4WH&?ec$PF^_M0Cm~e zW7O{B>mk0@r5b1LdRvlEk}eJ%;#J?f&K!Yd(<`!B#nC-g1Pixld0}SB*p9~|Vn0~u z_gI4i|4_{8=D8E-$#O?W)w^xaPhTb6Q3V?7|D@VogJJ&8D$%q-o2=o39}Zt+p8tj*|$9 z%-APH(l~apkV5!;wXh4z>JK3Den6XE6VbI792_m-hK&s8KvTy`T*i@ofe;>_I4VWb zGGLan$bwGRdXr5ZG@{{hQKKrRPeX^BASfK1u;@k!H@i8wuM1_K(UIATUP~P`LfHJ3 z%y4oW^yqCEZ9KzHlFTyrCm@$%Mi4wlbl1v*}zfva^%VmZ*aFDYP<{%4Y&T>sXYP@C=1S;(gvTeA ze%>c=tgo0QWNDa~iGyAim_}n@sXGV{IjE9C+h9AXu>pusl`57RUkytKv;q zNMBv<$L__ljTL~5^-o<;y{RE{kL8 zOJoy2L6MFBBt&+<5ZOGVIw(~2mpt&SFruar4gwYVx9CR;79QI^<6L(7^d zt1{W_u`9rW=@Fj*QpcIX6hRwh>PAC%NYE(RX?T3v6uc!a4?4;3MpK6xI}7#pRD20e zWoByJw4r9r`l)>RnMwQ`tLy9i8_OEjREsLaX{h_6dd_?pxUrJ{;LK5M&CUCEX{EQLKed?oWJ2 z=;q+fOzjgL?zaSO1>X6BM)d1~)@ahkWlkD5K63(dQ4sse^HwjowXV2)YW0Q<6>Hh* z%lc*;;pTTg{_GJcbmH{>yef{bl0*+e0l8gLN8Deouw$_`2b4kjD$`~=NeOY zovF))PRi+e=uYGDXaT&XoLI*GDrj>}nv{SjZNZrp8-$!pDOHziQjQZH5{i~1*olScG0a1Nl>!_NU8DdrK^u%f%WFrau;zg#MR_xHG8?WkX;sj1i=RjI)1-?n zpbZeT?a)b@6rVGL*~DiGSSCRHjLL58p{U5#&3l;h-<s{fb@LcqC8ZK?g5WOEU^pQBY z^RVm;5gj_5e9eY5U*ofai%a6L3ntugbH`xV%XDQUCDWCu$;=_Ij+HtqHJ1t-+ET3% zZ?+Qh{J4u`zX=Ybm(L}tYV!9n#_x=2>l47N3?A+kClOTxu8`-XXQIA zXBEXZAN@Mieg)|8MQ6P%+0q7MgKXWhI`F1S(Bv_zT+VEMC?ICyGl$}nIf4meSED3c zj*p%jeyxPd5z=$Ruaj^&MtW{IcdaAriAJiNBkWToT#l2ToBMPL_w4m>wE>wx|Wr4}thXy|d`{IX{!lM*pOOrQz!tmo}Aw$XfQm|lq=o6#omM3E*Z!J+} zq4~lS*(9LAB{L3!Ur_X0SYJtoI&^GKL$H zbqZXw|Kx>hGMhKw`0Dd@Tnq>FMzY{%9Tlr(s!GA)@7qx`PO`AQqxaGO%w}t8>APPU zMKdBsNsZhhDOWf!_MIM#zS}iZxqsr&Pgs{JWrT?s?DVj$U8kRJSFF|R@;ly$V{So28{^*L;jcd~i zXu~GNx%Xp$;Ar=Y!_#ipK)jJ~TE|x(M6jr%GTP=O_=ULJID291qZ~$Pg!#K)Uye*}aQ=bf{80`g zG&oQB`um+0=U*z$awm*k&M6|Md>f&Ncl02?cZsRpaR5ICS`J}jv`~wbGb;k8oaGfm z_PlYSz%Un)U+%myPg$Iw1%--74?6P(>jfw0c*hFz^Oq9&&*_gLqZ?s93JTRlf-`mR z@Ff)eqGDCZBj046C&k!JqzPANKT4BBxy}$?6qUzV%eh_bj4_0Fy>(Zr6~f^vs27_d zWcw~vq%_!Za{6^~lwWKn+%9(G>DP{#kNm~*D@Sp@#Po|zpHz{4u{wA9bxD+890PH? zL~{b&wnG=(V)?Z~alXv-s}__mm~yt~Oo$`GugjwRqAzY2>o79D@7@EWEWd73eqC<* z^<_noDQNeLHMcWfmq+=^^VLAe?fhTXzU17#H+NwJ6dD&U-H z8t=eDwv(*!hrO^JpNuM~S}C|vsRIjbYwFTLb-Rpqd(FlF^{mVjMBk)b5hJxIuV8vI5e!=2= zN^u?=#hHB=C+D$IoHGT6`G#zqCHH)p9kt9T&P-n?=gcV1HLpg3noah?#xIXj9oXBVt`%*nY}ah@2(c~TVTiBX&<3yjg4Uy$(L zdsdiND$bLmI8TY1 z1N-Sw@nT7LyNr0fdf#u*nj7J{j#UU0F_N}UQKI7&0LF^fiSM65A{%_RC|ATd^CtMZcO*Q+?FaO*M&x6VpG0yPJ1jQ-m z8ByWM7Z`@cg~z|`-+p9;=P!zLKEmVVToA=MKZ-L$>&7{olHbvS3%_b{79A7V6h?6_ zisD=t#kttQ`8)Hgc3GTL*yVvLj^cbHs7`4VM{#COw!&PKGw`Uz*{?XyisC#wiu0@} z&Ls}c8Kdjav37w*b)Di|62*BAY@J~)iQ+t0U<^6e-}o7PK^vTN6z927oJ*rP&yC_d zPhfW8&DQhNpZhsPXmFmRIL`xTXWcSixMClJ>bATebXj?IxpGAea+IwmVTo|N*wRs5 znfTl~%aw7S6){d%3qi5Y(eRA?5D93M(>+kf4HyyOZ-OP@SBEQJfJmVAkNx0B(7$yuN$`BV{r~B&TAxRTiGcWu14Wa_4DiNzGKO7fpSHRQ}Pv{xLxc;Q$6#&1+|u| z&nZ{LIOS6bic>yoqGGXDUOcH*G6%!78rx`#1B$` zYjJ)?ajuTyjH)Dpb9EHw^$yMxW{*af%?R_K73cL)oHs;qULVC7T_X5ygn97Q$A4#W zKBYKsjN-g0iu1-O&NU9sb<-xG7#U$6%nSro6U7`FH$-u+kK)|u;C#zx6JEABPgk59qd4Ch z#knzx^Jak&Ut!R_dhG|O!i_M`SDZITao!Ted2Dirdgu8k|=v&Re56 zZ;Rr*HH!161m+UH@jTGJvDMzEI6z8TW&Yz0nyj@_fRh(Z-J@}NxS*%)s&GsnH zJEAymkK(*jU@pa*GMM#qudT;;w+i#lD9+8o6`D*_ayz3q?-H0R6{a+$ewl^-vEsZd ziu0$VIPVgi+u$N7*0N#tG`MCHP7i{qqOLBuv3{+zslT-@$Tf2~qNz-g#4WPYmaFH2 z8!B$Cz|pbf!}Uv%=ITvrgJRvAiLhZgkFN!}eq}bCTDrw$xI)1oFW71a&9Aq)SXfnu z1DFh8euJ{Ysk7v_kjw3aZ5|d5o zJGZ#-#(-_Da?XUDtegpQxpK~ghMJrSa=|iw14@nyf_Y*Mv-F(d+{}xNRba8OS)8}k zP!|-zrN0HpjP+Hf^O+U(4Rtjtk%YV!f|9$b9D12HVkJ-{Q6Nj}DwZIoizQBy5Pcg> z$ab|8r)W+f(xJ2ld8wif*?_AP7FyDewSrVrk}D_)3CXE-tx|GW+L|+g zIhJcyb0%PMYtDq#mgMs3oxv!7cAzM?u%sX_zu1-p<0K=dp)(ZVLLzQ?zO^D^ajU@* zK`SXPE+{H0MHsOFT?TDpzk)WKd<{kjTHdU@nX_i*&9nt={5gUqv%1NnC{SFKKQp&z zPDwy5s?5nkcF4(MG$b}Bi}eyR8ma@tkD0|NJC@$8aio=1=SZ_z>qw(j??|(#dFZ3a zEJ$i2e0ha|*>h*j$}1|F6;R9dMEFc#ad}RbTCkThp*~=`n;W>Xu%MuHX6|gb6ASp9 z?sBrQgfC|T*YLp|;-xaqq&YM43Ug=Pm>WT=G%AAX-I5vkUS{iwab9;Fbrrpj$$nSrC|8P%`VryplX-7A`i6_KwTVawc%SnaV4I z>5OvJip(u6<*F!05p3})2o%jJD49JwZ>|U-mMKY}Y|bqaS@F6tFn31Yj5&qHMar3q zSR7~e5G_V6;|S5B`ntvSX49!SL{k=3Rj)<0X^&gI!&p*Qy~#<~TwKm$3vEu|mqm+N zr$S~+svD}%cA`Td-5S|Unyj>o#2Ge`I1Q&6W{vY($~+f-l0~BqNiEKWpF9PdYlY%z zhH2t7!|(erB82`CRjkttf2Kw|Bm(ak=fbyvd^7?V&{AgD$A##=2+zIz)V8TWjMEI$ zZT5z?S<8$%&2S1V-vB?JMNY*IpxA94aq8hj&~F9i2MWg^#KO_vW5A@45fppev2bNB z$O@Rxb4UpaB9u7Ww>;^i@GKcbouy)({=pfZrhee~jsN|A;4TO5*?!=L0rz$+T!j2C z18yKbeAD>x3l&c;y|9}B%ybS?L6LPV`Ee}gZeR{6Ts(dpCwvu{N#{WW#VjWHMaY?7 z8r2Fz9F>rBL_9J;4*~Zhg^lO$A>f_>=1b?36PFRjjt9R(x_~*UaPj!@dwQsjO;&iQ z;_+ktdlH!U6)qmXO5l9>P};_iB`8xa5%Hy*e*nx=3Kx&x^}xLe%r!&EO^&n0N;k%L z9x$~E7mpuD$o>VG6ABlvypdnV1^7b5LluwT-LR_$X7Ggq7FT{8Uz`WbeF~QdbF6q! zUe7Cx$D?lZuAEdqzC`|mp) z;wNBO|8blSfe(-J4Qt~c5Wx=<0D_yVH+>8TMQDTYLF%75yU=l3#Q1UXPm7os`?Lrg z?{4jQx(mXYJ1Z`a*u^4s zsV40z=$Iem?F=kyaz8)06xTW!9(Y^wdqrf!`Mtbpf-&XTj!(pw@$rdOF1v(| z=i|Tb4Q=;ojXt}a60_Ql-+=5M+MZlmA7wKVHsO44sLdTZ(%X`Ma^388TDat-5rpJ* z*n_&xwN8@Ds6s>W%BWQqz=OxdV z%n{D7fI(}1Z>bD}fHD9=2%!VR1S_v#g;&kB%mk-0n?66l!@x1nv*w1$M9LF)!d z4|{q9&O6T*xtSmx4iw?w{XPWlunXdWd`?pQY>~#{kw+77V9>{N$i$j$k4R2Qn+w`# zVY>?NYw>ur2E5rd@Mv4{mbg2hlbP>7p<|}>Xg@S7 zd$^#T#9Q*?J{al32c67hW1+i3;FtxN4Luq^h_lCy8$U5K3!5JE$~O5o)ifCUu^Xx| zrco|8lS&YGMn-^8g+y%Hws>;yX#|`@GJcG}ZE6^+Ex{0pzYKo(>#Mh6Z)-jFg4g)# zc`o=^ZO)?Ev;DPlEP__GWw@LZfkD<5SpXT;Sf4HT49IdP%LJ2W5+1oYeV5S5GQs?f zl>`kJqHKldO`dOK;|1w(ZUC~;!i&7&8OiFTkk*pkd4k|o1Qd zz>$;ou0wVKbFa$F@FHB4Y-TKPXj`(@aB(E{@C;TIqWo=1(HbrhEK-bB?1_LM4v2mM zEJ9norX&qPEY z+Z|)rpoW1s5?zhwIns>M%S~L-!7i;Vr|hH2vcYcFOgtV@3MH)&W+@h9Lv&TyCVVwU zcY)M$<760jZJCU!ZD->kI6Iun+jL~c zpNzzD^v*lsg1hEm5vSq%Ma!iL#%65!NW5%0}$0v4E%@Vo?@Rstn%Cob*I|hVi zFVjO{mU;LR=uANx?VRoqWzPa7#0c`Vh;&1=1qlg+w)bic$&iE5{w2n% z_+w=#Ms6t{p9piV(5=Orb6P%DVn$YS#yV~`Vy{N>W5sR7p5RL6n7u;m)1e|KR>j`K~-p_#$#wQS3}7r9KlnR4{}0F{)uqOiIFAAEhXDbt8-$KU5T1#u zuJ>^6G#997xEJ+W4S%?#*XofXw4p5lw)B^RZq*5kdW|+9v1eaa8v?jLQRA1gY)9F% zm+fc(I(GehqB1n=ffXGHiHNn;M@4i)+t8+sqNulIY7G|%;bu$eWXk=lqGAU>HW$tg z?h3I5S5~+APqSQoOS$sG zcPX*&D++&P+z&Y@_7vp!tlKq8+3#8YIrt&nV3CHR5+iBO?N7A!18*qjqAT_T-LC7D z^^0?se zMMw%Gru!8iVw~YQPq-RJCs5vd{{`Jv!_{f!iWp}qvw?NHF5?@|;V<!Ah@j%DKGi z%APmaUv|5C@upnbes&$Qn-RfWTr z{ctO)dBgV~DOV}*-5FDM5#6o@c(XJ%f9HXjmaBcr6}JUC7tXSj!c`sK49_FEEq}FKl_^(4 zrNnHpxLCM~U2oJYS8}7E-7n@_x2qCwrq0s$?tI1a>$A$$uqeOS#>dMEcPdwMqoCa{ zrl#A)?kH=|U%p+k!}9A#%GIS&eu**?M}}fAJ$T8Df_A@HN4s6C@n&uOqsiYmWBK(v zB1$BpV#SMojU$)%hhppTaN!;RNqt{xl?p3b* zQLcsyS1ij6=aJi<+G)Akr(6w>ay3G@Vm;u(bKsVH_gk)>Q?5n`SFqMzRTNpi>|q`W zTepj4oW9?il>J+a&wI)hHzhh_nsydfE@pbDG~tTdC9s@{qw_(vKuwvjcF435>($oC zHBlH^$H=-|uEb?wdGoC`N0w8u>`1tGEI3k* zEUl}q!InG=~S&QiVhkED;YEqNhytdj$Gyj#!WOLJ7Z3ubmr{2rE^MV2RNRYGl2t| zSmJ^a&729T24yXF9-B2-i^*WsW7vQy#MzZE_scy)tDX);pYgu6( zgULzxj!dwifr|x|?}k~W{ES(FxpRx>-Z-alW_qJF!kZ2W<3^a zDCUu5gn^k}uE{crfLuIgNGE?&c?1(1Ma7}GKCfnD?FO86h^3gyD+kSrtC7`B9GAzb z>@QaCF-0IIi>CNFXsVDzl^>*m@(S?WN}S+`QdLq`k9DOM8z()2mEF=xHxbC1H5K*s z4*PLf^J%7eUSnMya&l>%zy&f*FHr)^gS8+t|EOTBK@zU52udrS6KUF%SMcbzh6>@r zq;jO5S9>CMj>W5r9ap!R*haZ3lsA1&oZ`2Xxi)5^MWfDG8#6v@l5K6wdD?#5^qGoE zb*!vqW3G)!WnFGpan{C^MBrkrjo}yZdA6pUYy(^yV{7lOHO6Z02IkabE@c{lFNzLC=Q!GjQSZb!NeF~j6gY-FOd^k%7hr`#1D5m{U$wXPt+n1-YfJBK6^I9`|X7uR^HX#;YsZT! z^S{3a-_WsP=rwo%{!7>3vF-b^Wfj%NI(+Wb*?Avr9sUvIFec=gzkH)iUSj90fGn6} zR?T;Lgws@*z2n%7Z&PX#JRZ%$WN0R)2h+`^xJ*vVDLmh6_?GgY!E^L)*&{ zhcI=@mQ2G+Lz803E0Cc-StY|Eo2!5l*7@2c7}skFU)I#umW<&`+iq%g;-VI#aVF79 zlm~2y-O%!U?NZ-glF#71zxDsQTPDt?iY#<*sWyYK!pWj_^+g2xCU(r-2Cir|u`*`J1lW5fUqfA8gf# z)%Y9-A^a{UIf%n+399dM2Q}yr{5J#I^|wDg`YRwath1qh9X<={l>bJ6^Tm)(P$|=H zVHB31Yi>qPjKXI4kHTi;P1hmZp?tcv7o)JNQQ%8-&id_8-p;0Nnt)N*LrFNlQCK;5dr-N2&oB)(ROl8B?ozw};& zkdvvP3?n!n`DOuEtFb}y-3LC`0+UW<1w*)>e4Jigp)thK_{n!6{CE1{eB|2&+|M+2 zDEVFiW;>N2%uw=;Wal>Jla&Jg*Cr_cE=2n&rqYB-$k! z1pL&^Y7@o9aV&?y>Zol#rON7cnz%|}b3m=me&^JGmW*OJC{MK-U@N~~xH#_2vOW)+ zqqS7)yRc6d*Y{y7ob)*M++{XzpwL%ZB!9q{-7FWxOtq3JhTJ!p46e|p%O@_lFt>Cu zVWlEfi&TA!Emp+9_cd@;O0;EOkKD zmBfZ5Y)le zhgPh&f7&;SB$b&158BUZXZZ^OMR18o#3HyzT-b!*R|HS|HMj^4MBe}@8l&&t!otA9 z$O$TpHz4caaILIJ#HEr>Ze@k=E0EAq*eauAa9u8bJ+SfGg972^3|E_x$xdXw{2wOg zZR~LQ{_B8z=h~U7`g6qfe6@D z&G-2t0_%H)xLA4qcVFU}DKukdpGj@6jXh)ye{xJO6^ISBuq}zGrVz)q}U*e77 zx4fW-sJm$5`%XJw4S)E=4vU7EQC3c6HQR^v0DhDL7lKw+vyxihGJR&z=NkzhKGo6E zW|TGb4h?pc;SdM^#;m`(H>o1S3voCyekh2E8XBJRIU{1Lb_M&pl`aBQAaypiDO9 zFM4`D+`@6U7)GdWPq7=HbQ6D%^!+?iBW*cFT7Z5Dq^HerMz13#JHqP zrIfEVeP-gpTAlFW)8{oGy4^XiCJZiO0L=H#?_B4^{;;MZ22@6lvCcXn6>>OG6U=H!okjI7>cW7G`}D%2hlIILs0F5c`&$fIUyh;j0# z15au|Ww!$M)d?TTpEU^|I1-1(((TS4wa4Z{2Ed#*ZBC~X`#K#vG4A}~kjTlO|Je1h zAD*1ZpZhhHU|jjbb{~{Kdo|T5R(6tv9Csfcms&uQ>+=g%pL{E2BQ!B|s`m%7u1%G=&I zfhOY*ojr`qh&Q^ z<)t|P!rXVDSoBVz?Z# zoBI!94eQrm*NWw0__TEKn35bd#g@pM7>)vJXln0@sU_$RtZ2GNv3Bki*F@&eTQIMv zyeyGKJ#bZNOd9GYaxckWU8-l~+`LFlO<_^#`~_upa$Rgai~eNnNsJ~*$SwoBgydC` zqKcZLvZ7Ku1_@STdxnV#!95|E$u#6Hk5rXJOXgP<`Y`nfjpFi^TghqXxLUQh>p@kd zx~QpK29SE(Uq;S;8$e3p51i-*QWAe4Umy&Ql*Au6MSy?bT#uc_V4=;3x)4L< zkwehMHM*vvAhXehP|0&?TN(P87i$pf?jFLTN=@~px)9o|2kuL9>;aSdR?6hej>^qB z=xQ&2&S!$2Mt{*{bZM*(Zq7khd--$D5x%VY$+@BCO*oihN@;?w_VVYPtBA06n9Nzt zZkU|Mdh%J#W%zTxTys{NAIyAa3Al6PBoAjbbK%dqLUZQVLGHRiY2BQIuJ-chyi{}M zH#~06e4lr7R#$s9!av4wNb!1}fNHz&CTKgc3)gn$VTY{kuD#xL8~EDm4T{?9LBm}W zbKJWo^5@K+g$=Fd3xqMUnTC;&!gFM^$okiH-8K1GVjIxO^Bvi+yiMaXvUvjGe@w#p zy(_SZew%f}Fn+7*#Mx(W*-*h5YJ>i)Fy9Biy_zShdUj^!HD;wEj>Z2oU=A8Mzn*jq zaBl+hwt*9V#?%@4<=}S=n6tFbV9(>EBd3EH8mikaV0LO82Y-U&<_ZF|$;SUL1M`^1 zF&)6|Q6p`KAJefPnBTZ@kz^d@c@>z$8kdMy(&6wM58Ma9oXJ)NGZgMpU@DSvKIvEq z%w~-nDjlB&=JRfxCmn2z_W<*c!{C^X?*a33jZ37%P_;}S^Y2w)j=1=FN6cJxeotda zM-x=9c)nT=8N;ab`tzHrF$x*XuN=7LBjC4sg#2y5 z5%PN#xFf^x;~s(c{P-p51Ge9Bc!4}mzeKV;g366&*v&C;e)`}7&=+eAoMM9bwF0+k z7=8!Aq1TUJQaYvsw~9TBVS?hl4Y<2CHmLr!g3klMoXWu>%uxAq4ltJ*IKO=PIC#tg zrrE#+$=43dRs-k9kLC6mU~V^X!Y@hhatQk+V7{+$9GC^^-9G^nR^wequO;cL37|g% znAsYq^3PxI^4z{fZk$J7QSb5=(B3n@S~o5eT4kp1?~hAz^HuorkBB|YK#D31*P{Q;N}d&kHudM%rXNP z#IGKh>kVAQXXc3Q{1d=DpmA((LHynV=GZX&_>RksCFkHr!}=1$ZyGR#8W)s*7lD30 zFkKqQS4rWQq&M>6e+Mx8HIBo(AiYrzC9{Hx2F9t+?(y0LgtY^6yT<8uv?qBS#xCni zzJ=B26I42Wto!R=$GbsO99v1^srg1}+ z$JM}GHw?eY;MWbzS2T`#B&d9U3Ct_Q@S}W(fk|aUh8aq}vw*o+}Rjp^8AlB1~0}W@ds94vvVs(9I6PF=wCVqI0P?1T#rk0C#nbE?$Z3F5LrQws{0R+TO<#h0H=g?4^MA`-0j zjoL`2kcQm&c9xV39v#FFsCUkZP#7%N_xld|Kf?v%Fom+u?w%1MuhXb;w; z?<4jsO+Xz)Q-EJEO{OnR$&fTzzBCnnG-;5nX1w5a*CILqP^;PxpGeC%-#BW81{(?o zt1>s9vNYbE7Jp`NNmjT!9UhzhvTEhynf^^CIU}!Dk(VGN_jHeL`*8Wd=|5x(ZJt!V zIAizTcV0MqPw%VY-aQ|1ULNKGvDH9;&TH@+!^8M$<15paE{h-CaWG^1kKu`Z+g8T* zAHbEjr+IGi@{H~G!yQkp9jwXOv8QWH+Xsig0FR8_wTtui9D96J#`ZX|PxWspZ{Bf6 z_X&l)2eNzLP3ibEtj_bA4*_oQ!@q0yL9g#NB3vVig%~CrS{*D3(5mUQ&?S_ zB#E$mJeK9yCm=5 z`d8)7x$ga*OlD12&NvF2y?syjsb#(UBqgr_x$^4RDii?azj4--!Hn*+0L_Z05R-0{m&1Q@s<|4ya8Sek zDAnRiSc$ku$i5&|&I)EPk}AhtQ`f6}?RQYlsd;X@s#K8Az8L~0< zESb4xCZx(K#LN~atMKrjGEW1o1~)H=D-E`z5~yQT18))+<58i^dF67C)u`yOjS+T> zxF*BCMqE>1D+&&ClnV}zVLSQ-ek$H)#btx2Sc))09>JI>tZB&ZS1u+tGwV0v&8Bjp zxR`clh-Z%q{hF+jk9pw8cM+bHQTq7_Jp32cl-~-gA!&fvU>0?W&5-f>K5${B=BxKztR^&=sA74s(~$cBnzjuUV1iruwd_xw&i& z%Ew$oqHj247b70D(d#p8qB5QfhnUlDgbfRK&QcSmMt1>2tr5-{nxP(Nx5M z%E%vfbx!`gIr#DY4%IE1iWqlXnLP*X9~O~r)+XQKojVC=Houc?S} zQ?Xq;=_>1a5o+6}dR0>qqx`~lkd>`{atxo=(5wU!j)aLC80L>N8+9r$PPvo7yTO4y zl5-5^PmYFu;k1Gp%{fctF*#Emx;bZgHVbgr;&6WL!JbPT&JStMr+YZF<9BmD-NTvv zhQs--*0UBkoR4eH<2;M;e3{0>;c!sqkBH>=ShO$Iv&jRCaE-`?wvNiWoN)$7Ml%+})ar z7&p}np|W$s-N!wusfbZhzoLCCsblcAq%zV0pVkn^x_0`+)77KRgqOR9U+k&j>?Iw2 z_~>`9y4h(vlUVU#W=ZU3k2V{=ZqBnjoaYFJeFV*;`D?%Ba9*i7&+%|Zm!HIWj)(JH z!Px!IC(ii6iw@_{Y0h&!oGiW>tk-c#i1I|RK&Qc<_Q(kq=x{4fCZC!g8EO4n`%CM zobhw{k6wG-iEDzUB1V;ARQss%BF}3LpVrWC6G(>9m}OdtXLp%KJ!M)Y82|dyr{k(p zWop!xY7gfs4`&Qv5&LA=Yz>n?GtlSMmTzm$3p|`_Je(JJI4=~8zsyf*&I>)97kM}@ z6wU*nD5xr29;;r0Yo?bkjxMS$tc(?x7gkh9{AQM>RTKdqty)}H6OENFT2K|MDy*F! z43(pdaVvQ1_1#Tyx36D^Ys38*FD#5MUw#$7h@9rLNV%ji8j--*ET7PsMG<~UxhQ{# zuw4JuPn@?4%2~XmJ=VIed3_{eGt2W~Cg4TW14E`2MhbEZBhf;9#_L&VRm9WsG{R>k zQz0O!-!i9?bWvU)-Sof^N30-7nUB24^P0lt6%m$6EIK407HjYBXllSRy;UH~8!^8O zC@w50T$T?Jc=&X8XCwmlHA!h*)P#D{*~Kt-CM4=kgaTFK@Zk~1k!$cOfwqhYizRYo z@keA*+R@ZBVitxNl1c6);V{DTlFAV?L!yvMGg)T2k*g$NnqND! zn^JL0Q^R#SyBDMS`!>p|!ls|7Vi!YD9I@)cqGTzx z=7}J0tO6F>M-#E$0chm4_d# zqtrZPT4kA9EeK<%wE&3LYo1VBHYf&9n3gR#$fer+$*J2sAs*#66v9zy9+aO>t0+sf z&4ivB5uvo{C~K6VoJK}z*J{xpBPS`y9a+z;I^SI6Wb#TAx^3Mv57&p}Me3;UmCnlb zQ%w%9S$@HZ7BEyGTYz7T?qKh0}%BZ}5fFwsgz-B*v07=IRumIdY$3zueG+Cg2OF z4M{k^FPt(!K3Bha3NKjBPEOlLy@Aa0!x`^JMDt~)3b-X2%eM@iuCT{^S0#?3wF0wV zo+orvRHSF(}wUX6DJhV$KO6L|F*{31R(gc;c958Ug&zLs`MAG{lFuzU4`K03yz#KJje(^FLe*-3@-yReB=fiI-FlQUMAb#fq zbBTeIbolU_0Zi1u1@T(|%n}0^#4iTSdIJ~44|h3RpEPhm{Q7|Tf`JR-cP}vCGH^ls zz7Nbk0~f^a7r^|=zy6jUe*9)5fN%eGtgtW> z@DqN z)k`W{b#x5n67v`X$%1er)dZT_fGm4sS1P_lv3Z&CFhV!AJ*Ag}5Hp@jJV-Wanv3x> zkzDw2^Ry+(O+s>d-yg}v0h1@EzTHS$PEMSg$YKxDj=d-eS>Zw2DJoAwazf8Pc1{OM z9&dX)4P|%_9<98e;tGjKy}ii?X9pAc6q>>KdQlEbPuiC-&h4iZ!4LiUZ~+75ez zxbB4ABQ7pNb&HFI(;=>J!d5NpyKt=+zaPL>ZRt_C)`;I;*b~I{By7f*YCQv6wVHp0 zt6BUG!dC6$HMknYk4aQ5;ZJZ~BYyt@Th;mZ;aVwv-0Guh_X%)aC4L!jsXBK$T+767 zJY2=%ngo}syVK#?0>3N^F9%Co8=KabM2i=cL}M~5k?hHn0+am~b~klws#s9l-O-#J zRMOOdE9J^@Um!l60e^wocV^hn6;(Br3`|7m7m4De-X1$Qt!qe*N#=ReYZ=Wqz8XW3+1iA?6HORDd!a)-WLd}A ztatl?9m^dm))E?0gUWbG84aJXjGFBjh*PFS{}+t78)1`&@-bgxsHdDG!5$g==D#_M z51$rV*5Yi&ZoJZPRPUVAsbTuxz4(u{HRw5})?8*uqfdxKA5=s!sh%Z^6W|{t&t6UC zTxRoI_;6I=jf=X%9aqpfEJRYCPhNB19!D~^LK^3ynoNK=T-0$HFGiHWPv#hEx>Rt4 ztBY#ju=2ns2mie?%MzI@f6_hqL#^i*7dczF!? z)l3&lF(|Ho&~d4aZva}~hYxG6H!k)G?mP_I3ddGP#_l|PUdN@j!XeoDBYY^kH?A|_ z>y9gEbDV!%AL_W&<~YWcg<_lR8`qhhxPrFJ`NuUyt0c8uj&YU4Cma90>0%%1PFK(d zI(hX2`mP^*^E#)UHtV?b20G(4@EqaHGNSp;`8QQNdi4fPMT}b;t1We`AvA4E$HJ+> z);G0-7&p~<@KHCelj_u0R<<})ztU91xT&(?qn5bgutt6FX4-VZ*rya{!|kS;03VfO za9H2@*hTFQ)n)8nV2E*3O@vQ4L=8jp!Ko{rbf{KqDq`GJli;H^0+Z@@Pc)#y*b?5P zsfck?QM;+WiB#VkcOM_HjGKz1q;M!3Hcigw#w~TI_Gv0&+*B99Cmga%`HWB9 z^E-#?Z<>l2H`Rqg#kxn+vugvCq@AwGR4g#WD8H+<4}FzSr^lzy<8!ym$9skvx$%lB z+bGWVwU_i&J~+TVVU*8_?8e1p19Lu}^f9|Nk@C{=lCt8;s)+L@S&)xcN!LBZ(@Sx) z@PeZ9s>s?V9e@?Gf@uW>mGVLx)$ghb$WWV7 zk4Dw_&Y*GoC!sx~MK56hM7m}QrbeTRPP^f&#=0D^su1JZ4z-831|Z?(E2bVE2Z?A0 zC($ZFojla}k&xdzl=nv9q{~E`<9RQQE7V&x>{?e;iY55+>Y|$Jd66W^C01A6D~d)I zM2m|`ii;|e!Ay@ETN$aSuC6FAF0Dz%8lt&Lsv_kzg(W2wh$l%F^999CQy3{LDXX4e zT8Lw?-7hXKTy>cXn3%HlExd(vB6 z7^y5=P+d|}F5zZDC0Airq$q&0XzBdQ3f#h-lxS&7Zg6F!W?oHkVR6a)1lZeT6^V0w zH1CZrY;5en9n)AI)Bcs~>l;xmI_f(%72+^)?ORjd)q*n=R=2Ke!oBHTOp_qT3RutLyt!%o*0ZSd z@8P?UVf^NYiMwxvxNnUR_ni^q{%M4`hx~BH>l2g6fyobn+pn=4t@_RDGwYrO<^_#o zhv?*sbHW}6aBmaCw>y{w&Ul5UKZkNzz)aUT#tVLX%)RWyaZr9aFqLjxBpJt^c_}bg z4};@NSrahZG|rLF*=Y)h#QQm5?sM_;o@m6^r(MA8HE==eEI$M0pn>ySXW@S2H-Y(^ zfeYd{dMu{L@S{=r=arBA&I4wKfeYeS0L%gd=O^FSz^@LN;~K{o5#eXN0KiKwlFsM* zxnZ38;&^hvJkJm3vu=1DaG%iFp!9O&xg&{RPZ%9QB` zz)WPrgQ1=ioN;jv{ionJ511Z}OSB{7suki${~3+pvl!f;nJnMM2)G5fM>Lk@8&qyM zw8VPez(su4>G=}zlEz4!L+}e@p5#={mB0kmt15(@15BI7CGy3mp56h>*N5T9iMj`Y zc|zlue?jSe0hmL>@S|S)GcYGpA;ApAZz3?$H7+Q<*MZ07zqvW1SJ5Qt0RCtn`6%uoP|&v+Y>)J z*pqSyZmSnpEYz*qHwMm`_^DYf-9qpj7O7^yg%wep8zjH$HR%)SI2?#czdS+7PMn67 zl4dS`Ls1qXT*aA8Styi{G+sJcpX9V^U+uE~>Y9c9KOP6MmJPNmIpQy1S+nQ8wFV(sh_I&Z{ zhdodH?nwCY-L9&6V-4@M>dbC!oYL9Vd4=WnZRo%m4)~U!G5fX$Z+>S249G2uLmOpO z`IO;d3}oI%PmU{0vltJ7fprpy)2@2oZb4r6ZkcR#r{U17!*h@c%i31-NAGI0)Y>u1 zp}*>`g)D$X&L8i6VjRw;>K>IhxMOg0N?XN1C6;8H=R}Y6q-5-l9%=52{yTn0`fu8b zh}ueUS@QjgTYq)_!bgfmp}X&kz8x;$#YLXSXer!ZAxIJ$~TuSHUS` zcWHTT-cyg>4R>Gkc>GuIyq0m>-gjOc`=mOAFK=+p=HqpJrIme~-`}z}URqfjK47P# ztwc#v1MmKl*_k?Z)s^uj?<3}|TgF*k8S&DRc*<>k+vnVc7zWOzfR%HWFN{~04Cdc1 za*ju(>x=$%$DSLr2BYuCqwk0RHaB|w#?Rttso1Kg_O-Pp2_KLC6%+%nu>={EWpUtC zB(C+aSy{3yt}Qp?mx`kY>~-IJ;kpLDEIGI(Ca%M<6_-J{6zx(JnWDWKt_Jw0TGzmJ z4P04x%Q?|nWHnh`SiA19)>+wDrKa74rw+I~aA-_6234InYT|sWQQnHCT2rkR_|fhJ z??!MXvI)=i@acii3b9*oK-f&AsMT5vf1*2pwV&GIY6sOC{9lLvG0-&$FaDnjS3CYt zK~f%pt(s%}Xv+_5cU}C+zN#a=P48Pcv~0{FVt6*$U{6+W)%$~erQ_q7@h1ltrNocy zIJS9Q+m@uPN504RlRzlFs|E&p7Fya&HjYXa;J@v{~C z#L=HUGX$R?!!UNttUBr}pAF(-!bE9S;!wA-s&4l-S6X$b!thD&-Jicy>hI(_sC_DL zB^4a9?S}ttwZ8=}=`7;aBcw`Rz``l6AyOhrw)VC5lI)AhEUb}v(t3Aj8iOND=xRdC0v9UXH}(zl8&fi zxe%2lcZECo%kriPX--q&<`Gr#qj?8$++SOo5~}uqp!$}l)by=NlUQ1wfLDKMO>NE2 zRhfOO()(6T?prm!Z&lXLRpa_rRSKqUTz_ePt;*xJh{|#O*!x7T9CF2keF?u*h-N1? z8?F}ovgFV%<*G^eu}vsHI1+}sNezj;b7IeM?yIy`i8h*iQ$lFX-WC?nfW-d zHIi_}Di;(-B7(?)?F@kIhCrU*bcM);zYdVJb_gUJoPlyqU;5MJANv)XZI8mq+H#o)EHEIH=SSG~S5~?>v>Y<=-sxQ-V5d$jYy^$4I zojyRw=D%&&^Mp3{>qxF!bulHy<2iVCK$e=ka7Rx zcl^oWc#3ANE(1caRgj2`@|atV$iW?#x*o`^QG9g{hxls3xUTrubD)}Sh85azszuH; zU$cY6$Bc{W)*aWWp6xAatB8MGk7>@QCE_|WEK$NrP8T`2<2ua~7snvs(AQwIrvKB9 zPaSdU#0<^(48_@KDb$}TH{h`T{MLbYoZRTpRKzG@?PYu|p}|LO9+^NUFcqKw8yc>i zb@ok(=BKd4MLe9TbO>k1&qUV(p{S#jtvpk9jFL)9Cb!?;hy=74gubMy_6f=Wys^*dhGBKl-*MPOh%g zoIlFRQx}3OO~wh|{Efr;%bN2?IeDrITv>wGW^-nh($ny3BN}z`6kYGT^T(Lkz67D} zmg_wOXo_HLO*Q?LMps-6NU*r{f~VO~nbxptGn> zWJ87_#!WR7K2GVlM=}>{Dq>WsYqgK%DK8|Jh!rg2Bw%VxC6e4x3rzoVVg1qR%042dYo7 zgU(uUW1T|@{QRBou|2X0AwPt6)49LI9x7P&_arvaB&Pq7AKsH3oPA~m=0>Chwc67a ziFk?C@fJm`U7cN+FkWk)cOpW|{IVQUlGtFUH;0*#SOvy*sS(F$M&LbS<9c=W3Jw!U zj@gLIDsatsI~B@tsj5}zmt}fWV^LXTeqmA3{E7wD5f{6H8Lf>4xtLfl$SJATdz@-G zK61D_E)`ELj}<7H7n{dJ5DH?&kyvhVQKX`(yrQ(Y1iQ`5S^I(+i3$3G83j4>3JY@P zR~6(`R26I}$SE!|f2iZpja^Oa8ZqT>6jYt}6dRs3Vj$$moMKrAC~4|xZD^{hUsr!^ zQ->qB;~FZbWSf`b;1D>jp-9bxSQ3*pBO@)Cj&mA#m`ox!rn~dAwo%%@(J|-G0qZOdo{{~5(0su zi%{s($_pb4D(00{R4#AS9rs<v`c~gj-zrNm(tr&Pv=-uw4}3QU3+(zT3_anU}i?sB8G!NI4V%wt zDAV}thTVhkrX*a%^6nnwo6Pxqr87*>E~Sfro1?K5&u>>2gNtEZZQz8T@pi?ivhZsH zW|PKoI>g!i=H6Ary9R%vaeT)Robd()FIj>56);CMPRZxLtLQyoPUJ)xjK=xyD#`-p z%wcex@tOoofyO!Vd3P1n0@L8)=Pi#)@LLPa4-I~P`Ny}>UuX=RVpP6(DSL24Nr>_F@SB-P(f%B$M zc{t;ihKb5cI9Um!>!0tg=o!F7-8kQRx&WBP!{As?R{?W_#yRqN>&q>`eAUIzTTdB$ zKdb`=E~vgd2h1M~oL_xe4SoZ_RAs{f!}{%49-P4H%Z6o`pn89MHkMNHqY0`9UqRTn zv+)__1ftY^A%5|4e&*{MBS2U|@jeOM3mO{|oHzft8uJ=3e=%@=@v{DX0L;fG!T~c> z{VN7$nZ}I*R>|kBf7bzXi^eJW{PpBrz})Y~`PRRG24?p#IM%)%me zLTo57Ns&UJcwlU>?-CME&#OcL|? zzfqW~-iRL!%PmO02Y~sJ#s#I9-P#ktyky{l>dRZeyr*$P)t4#fBVX{NamvG8U#M~y z19QE`4OL%00ZiPD^Q|wR1Lljv;815==JLHzIvV^wI3FoY%YCFKkC%XZ-IG57_g^u_%|uB{rC$>PxQ1C?xvM0KGPQgt*8Eapfb# z)r=6ge1y1bMu=+}A+CLdxQ!#kZS}+Xe8sjCxF2XN>$9|TpRd@SOyXya@_xleJ^6Fs zM)SoLCaAtpA6%+20)*wKU)X-<_~Cr?K?QJi8XMF;xO&?F%v~DCaf;OYB>l&DpVk;S z#rVm`-Cn;N0gmI-xBYNF=}3W)Sril|C>;|Kb}ldxjpMk-FCADqwpM8joMQaaaWX<$ z{BS<<^#FI1#sOlIZ%LMzmw2c;-jpw__qd_4H`F; zevSk4C5;P82l?Fx%=bpX?+IXjJpz8e2j=hy_X#F&zBUxuSD@Gd`|d(b>_k0=r16*7vkFVKe@Uwb!*btXPDVCENoY+ctfzB& zZtmK@5J^|W~PIN1w})J!F$MiuSwJ2W$urpm?_(%cKC7p{IThaO+XPlY^^MPDaj`37YgV7ja6IMDg*d);D%@Ev9KT$UWfZKI z*b68C*jJK^6PBGAvf@b8h$!3rh$p`f7F7J>5bDIwCuLZ<)PWfCAxb=zpEkD8kGIwL zZ%I?%J@T{20;_v8zULb_FJ6+9xxX|$bVW7tv1{xV%+9Wqwhsng?<-Bo+Y?)bZ#mfs zO~Ef!Zdm7=bQV5KT8;lSmFk~0%2HR+GFMgnrD^8JMrl?ZBEly@Og;CBWeFi?x|9h^ z_OJkO&~5*NIW5Nr2e-XF4rO}}0XXe;$DP&)&dWbtO`=Z;s$G4SABE>pH zC{oyVeEH$eg5i#1-6?G!4*WS@n)^d0aqeC-kq0w&FTJvP$MZc|_;m2{<{f)_#%Ao^ z(-+;DvHS4>I7{=zT{^QbdRxZsn{EQ{+GQELw_KL7`&j@pb{!A@cqcsjqBjFPJA6EE zPu{`4C0m>4MsMq!6_0KoY)``nk2`BJcJIsB6}=gs8-~=UI2pUEcJ@AzIrqto9n(>6 z#m#e9-q!JqhzPQHB;}I58Qb?F0lkODX6)d%r$_<)e#7+9?-(42^s?sX)^5$%y%N9b z+3_FW4Bz;}x50-0PW*1`ZMxZd?oh_Aea{^Z?+qUhAIaM@Fx@2@gx|H#SG3O~-ofb2 z&2jvYq>d-a3?IQVdHET;H}6dFA&X_<{dV%0wBs2&mL<_YiyC!xyr0ErAI`h&r+4A$ zsmD{080Kr~Y+LZ>{*;^JWJa&fUcVHcWZy$qY3eU`Nmd8b^DC0uX8RVbkm)J7G0N5VB0-Kz5Y z-~3#()2hd3r0w`Jk)Mio*gDkl_+nh_&4Ph$p|ULrF0Xp^g+v1H%i-o2C@M0M*R{0sPdrUiSi_ zQs37Ii`w{#oHTsEh)?RJo2jf7yNp z^$`9B4O&Q#f8!nq{D4;oIxn1L1 zMxpe4Qha3jz|`JrbFIPBl&v@B;M9qpl&-Ve8uOm-FCDCV=je{-yH8pwWRgd9b-Fud zi&qI|`Kbh-371N65nP@4Wm$`1D_k913bzU_g^R=0fnTb{&SE`&St$PwX=6=RHfnb_ zTH9*Wcl#6Y7JQz45^ywMQUBQKOU-0kP{T9(*o^&=G<9dlClD0e#I{H%M|(GmD-HG? z;$ltzytvrJzAP?S9z)zV{8SU$E-oA7ZDJ!FoqgKH#`=u=5l?h3_*AyziRP6eq5WG@yv-}^?`d9aY-aPq zqo-N1Aen5O6|yY;E(T?y7OvTf+iai__+_N8$S>h^34Hh+ubvWqa-kYHVHnigJjEK^ zfRDfPFL@GYFH8kTG z6@9^zVwx1|=%Gv0Y2Tf_ssFaxst>Mz{2SRb0i-D(=M3CuKx~T3^S* z7_0ZjoD?28ph|isPl!20l$^Sr?({spOQVp9GgG$jNZ2g5>Ep&h(}52g}m7elpYQKDXtQ z018B`L!_6^@9-@M*m10DO#hbU=u^hDeR%jr_-xyfD=%go^YY6-d;DE`WoIGA%9ju3 zW$a!swFa+2d=&^sZ*B`^?Aps$0gUy_a+OFJJUCuhV1w!5ls{=y}XKX*Kwh#|i%6prpRI=tTF zp^P1@0lm?kqvFw>bEDfkeiV;x)p6d(1mHDmdEQfneN{W>RBi8x{ylMYR~Y<%?C`&T zFi-LneI?#AScHjNK(_t#PCW8Oqvcj)#6Wt>7x`~=%f0yLQzYn}A7fV=!7o*6+cV;t z2m5FEWy!$qY4KYDo5M@K7u$7o16-<(-Uyefqa1{*&bbtkD%S%E*Rya<2O`UQ9j-!g zjYgYNb^b)S6u%6(6u%9tEpzte{M@|8shhfcKncS&_bC2{tVwVw%_3LGEQ@c>L>-d@ zeSU?2rSa}8sAPG59M3OD(`sLmwjz1i7tK5v&5XaWW6$PP<^57q+QNk|kI#|dm(C&c zy1G|hJ@&-t8&2#y??5V~w+1$X%}X*~FnGmZXgzocBlP$_#ns^n^g;z+`1`{{@IDOc zf$@I4`^Fqd&4gk{(XWcF+{dxrVf<3@f&dcyvaAT~xA04~s$jp4UzSx1`!(_7Am|lw zb;DM)H^8N6S$h=iSK)dIzf|j6uoahGaJ?vgtQ&kuPqm(dt+?=6ae>3KcJ7PFe=A4* zFTXX?_E^_v$E6%8xU_iuz-u$lVv)lfVI_chwSZ?aZBDbgF7Dl&Zgu6vqiF}Dm|n3< zBpyva7)^JcfB){veJ}p|%6*(&Q9@smaFHQRyfPi-IlOoM?OLEdXUVmh85UUaU;3sc`{6ESX&BC_+iXZy-WqE^~YT{4o zM#kQhsck2!`-OTBoVaZ;_pMP@$8)h}96_>=)r2h6@h$Jcm5QIL<@`U& z8YNZuUAUzR$E(sH`Nc}|CFz~ndCxb`yNW!S*~AuA+FA4|B%LYh4t`W4_@n^k;iTHaI3FsXKS{K}V6ab7x) zs-Yw!{tv(w_8v%^`*g=2nx z5|M=xFvo-{@jdWUp*s_y>|dM;^C+HZQuIXVB*_po+<0MH@7r0u$47OJdGX&5N8nw{ zmXddHe{|5=AN|nk+x*wQ&Bx~+=xL8n>)ZTx-{vFGZ~a-bUOJ087wSH5>*hh8J{CRl za!Ri9q^4a7sw3bLqBa!h=o#^(t2jb zL-8fY`?H>nA9;DyOXn(0K29PXYkL%SkAawst*m!{+T2ZP9lvH&-KBX4=hUV36vQ_l zkAH0MAHz7%?B$fl3w$^Dt-oQeX7d zzUUi$(L*o(`?k$#Y@9DIc^fyRbrs=}jWlD&4^ce5Z)d*D1G%bRvU{1ArLUtuW-Zi% z5qkKh;fV+rCcZ2`N~mIcnB&uzUx-IDF^inlm!$k(su~CVU;YxO{j9G1-b3N8vtV`4 zS-8+hhw5AhF7orta(NDne))x$qi;*j@+37dfg+bjXlwZ|r==}KO;#%@%ca?rB6?Q( zELjua5I@zbgI|@n8WW+M5m2~oaLtp@+uJC`lnhvMNj#y zhD-J3*TY4vmt}2&&AIL@3wcE*R^rUJ7ktlrQ)H(BScqSiEaxl%gH-E0JTDSfaKIeW zLxC$J^4L;90t_L(ACdo&UF!dyTSi8?`3D#Tf5U5DR#TmrZbzNzH>DG^p2;x|IG0kna!mIGfIz-J|#@i-Qo3OT;86!$JGnPdGN*y#(1n> za3QW}PBg81OiNxEjcDSWXgb{abe}#anh7^g85%foPBg3gyq1}8OH~p}Dp@ZU_Kqw+ z%$Kg(!S1ZVZZ*t|Q!_%=ztrVDUzf4_$#^vDoxjAFq{UaJU-x`?@9U$mRyX%o-55@c zy6&m)z?F8;3432pQT{2{J$1ss1@R^6@s(+<&%X@**Bxw}`@8P3t$XC*sYYbOlJq%C z(z?@{`^Gf)ojic|RxAKU)B2+04o1g0L+^~;cu{^l*%uub2f1o!1rCq!EvUIKRlls% zAcze;RVMeO%?y! z<_iM1Yb_@bSMB2*Jl|!{ZaEdiKDFiez!^)W>Zl=M9Zr8$=LWyOd|-6nmVC|;?qe%b zxzCoOa-XV5<$gX~qY!r%jzYD^fN;qCI{(`Z;Hy6Jai%tN?yCF^<6F-67x07S19O(C ziK6)NIwWOu8$>%_O?-w+r|83qRU$a^iP@aKEjZ_qqT{S#>MSMuB)F99li^ab&w?vQ zWan${H^fy3mr4&D&`-+Pskm3C;^=`?21wrdon}cz&ORYkwg;$cMZFZ3IN&g}4*k^C zV)Cvr0?w-5od~LH@XL~o2f>_~qLFe|6_cD*#T;7ZxNt`LQ$m=_RDxq_(n>nolk8N* zJsmDb&%xcp?8p#qWy8<> z?2vfpC?17j;hUWK91gJ~Wl2xC@ZVl@IvYE_(TcONQIi!+9hOLXWu(%<$!bkXKD&?W zp)v|OVsR$IXoz7doR59d;1dq9p;N+(dvE-bN;@889*_TtVScF3F~tGP9s3FJadN|b zFwtgBLX4Y=^&{wDqB}JeF>Weq=%9m%zOAW92HlA`FdKmDyE zS&^n9h9&5H4#l}xw}dBoB&0%8w<(g%)02Pu{~QUg)tob}Y;cY>H>_FT*#r~~eayHx z)N;oabnhs)8?X$%zwiX;ULA$CLpx5EpNy+{5OaQ8!-(64Aw zt$NM*bV<8e6O{5Ll~)670~Iv@F?LGThx61kK^ov|Ixb?E3P%H+DO8hSQ?6ImeQA%K z7nb#7O+}15uCw6dq}|=#U(r;=xT($-DyGTK11GNcH5D;#s_{ZanaP)#fB)%I7dxE4tvP2a&PIPRL8z#uY5sWb7w>d(^;Jzp43E2P=(Kw@ zl|QD06M=C{nC+2}^&}kn3T$fgotMloG)cOytdm4S1Y1`ns&96pOzE$Wa|~Ue9;^jl z;?_6S-msNOQ{^C(8fgR1+0aPgV`#tg;qR7tl1FC75)M&!h44G$&fovg$<;S?To;JU zW*g){H>ejLjpAX(663C`lM_^SYMgXUVxhti11h5pUId?Th%^F+ezhagAJOB7&jHvAL3%NNu`V}>sC!gjGJl-e1iJiuV^Y_6epP+7uMO@=Z_j= zA)i}A@dQ#pu*`aRDW2VBdV!}*rwWF;f~n|xx1rfd&sYv~V5TB2=CjjRejL7T&Ot{< zt_G4Ke|hvt-45rEYtFeI&K&5wIjchs&2a+PFvB5Em^1f(xS;f(9nOuK^K{|tz1!AI zMV=?F>7M+_7mPjf960wsKHJ}(Nx5^srXtO zROgE|6){Tc2JOQdu6(u`KCPjL5=c12m}NQ_K2EwAobM@945WamfX#CFMcZ$VIA!`Z z9oOZmOpQ8!g;3dA0uOi@W=@zj^GdEX=RYq!i-dN@Y}!zFi0 zupw{k=N!&&Yt9kj9BW?R-n1^(2^b9X(A36-@C%3Z5WzaKp&O0Ut}Qd!6~Pdr{HnE& zmroHe&Y|32E;(nvO@nl6Dq;}3k%z@XW#(bTlhP8w9EQyi`Ckv-b*7WjTQuhqPr9N) zWmlB*Z@qMrBhQaC6*2DID0NZIygUEX4%PFTiWoOlnTu-8nbkjVsO-aIiE&evyQsc= z+vjd`s79TLKp0}&R2A@XZY;lS;Ob_F>MTt~4Ey)`)wl*!kQ8-16iBE}t8HGIM$YBQQC&0qbE6W2YOs#?Wm)YS#Rx?5$n zr>@orMrk}ul%H03zQg%fnsbeCX3XY{BP2B9S}1(Xc2VPrYms26-)NqEt`&pFkb1B( z#wy1ml?o%DYZ2hgOU&qa@UTNwq^W8X60Xrcy1WbtF@R3WjarX{O9aCnoO<=$XZJy6 z+7fQkoR=sGjlOcJP}yZ#cFrkCsH#txLeo^lxNGJz7uCGq7e4GzJ*KIMaZ@c9s&v>i z6OR233fqqBElov?o2m{zs{bO@gXfoGfN4{mt(g(yF4L=o$}H0*o*YB>pmP-ttL4op zP=1LV)10qXIcAi_iUgI7z1qWhrC`p1O-a{3bgNNYKCd~i^l)C~;k?qrIVKo1R~gs6 z`qC-TW40Xj<*qT|42X5m&TLOy*C5p0zG9xZ>IK6?3utD3>k7R5=?CkO=3K8h8+Cp) zu;I`a0Qoli*IU1}!=Xy!BooYPhe{u3&;Vcc?!el6(Rs5@TP^YseW|8u09Dx4pEe4W zU3*_#yf@pa8;zQZ7euBff8Qw04rO^KFQ@{Uj5JxlryV;WK?H|qBVQ->jlGpkZmWg@y@AE zi_6uVuUDxsG(Q=IL$-qW@TP(1?7YC94oyXjnr~@XOG#)bvpJ^as7GlMhPGrsgV^m_ z_bJVX7*H8nv@1asA{or}9{tk|-*9LK?9up@Jp73}oOC^|Id^;H=@BYwewr)FKJ`6E zo>w##G451sfKNDd3Q1tLzWsYBZ#xy|X=cQ@sW!q#t&ET=rS<2}J5-IDiWqm=HwhJk z?X-7$(td+rCep_5*&z z+b1|wDIY^13^DFhY=)1!2f4wMiYNM#wUf!%%3eD&RYe; zRS34)wWqyb>TsT~Id4^*jlOA{P;scivTb6AVYKY`K@5^VYKt=eIQHJ`d;5csTcYIL8Ik4m%aUmjAeHwZr*5-F)N1nX^x8 z*Y~g^hsjQ=y*Il&G}Xj z=i5A-Z}o7#eF)B9)|_wmaK6LC`F0QI&kAM&>{0kd9=;WmMs(5a(VRc);e01T-TC}k z;rx40;AHsZV-<`$Lz07L7DaeB!=n740G{8S92SvdxqUATNrvhJy#2kMbGv=R%aVQF zmxT-wDo1?#geTn;Qd1OL#_JSfu?_YFle(v3+KhSgYAUL#ix$X*1#%<6YTgyVA2LiG z6G2Or3lCzvP-NDE zXnDzk@*-)RxF4plP&dxvN~4j=$pA_1a3oPlYfJzmkyy2;hz5KAfo_(?Ws$PNdBruj z;zs0L@ryAdspNd76}o7oeNj|Zdj39OVphzIfZiNj@CX}!6!tt zzt0Y=gEk!6MBuY-1|Zyj_82Gv0qDya_IVMEnHAB(0~NgK_Y^x z)ezLl)k>;!qN}!#u}CgMG=dC%FPIKm6+jgmX*glsg#n#6aBI+v`@(xG)Ab? z=H1}|Ic*f78!v_D*S_7bWVS>0v$@mDswzv1imD?Uq;W>9Sf{!G6zfi^&F2=CMdlS% zRTj>#D2bRKk@8X`d`DW4j}J)=4OF~-T~AYo8V4+@?`n$R2B##Ms%r`>az(#%G}W(( z|LOS&PdFU^+0FSr_`K%k+}!+Wv*+Z^%3s|uv);z%HBYP0o7ptI zY4x;*{JiOnwtxOK;0en=MuR*e8ubAk>kBXHQbSAKS zn^jyjuc~H2b(M4~GT?OJM9X-cy;AL)t{}7mC+cQNQ*(XynlAK}9l8OQ zRluk&J^4;9yFv#O;pQ#fBGEF8c4xN8JXe#k@%hv8nr9jm3IE*H0WH41*=+I-zIk?o z(XJeSXaZmV#sK`x1{_D2FbO`>rp=j=@HNxbFl(0E-@IXL_^d+&-h0H7E(;qG7x$H5 zBO(dB_zSId@%qK}9oIH>E$PHvfLgtngH1G;(yF4$nlkk+C|AU_v)0S#O)PtmW;C^(y_(MZ7gmEboQBF!l6ctA1msFM2l*}s^ z=E7ITm)DVrxa6)p85+x@X0GXrBNe43^Q)^$lyK7BIdX|hsN~kYpcGa_Di+ifmsV9* zCJ7-qBr-`hi6!F5;8+su;aQA}*g8trcdV`Na;4h1>~PM!`O(VC1vTof!)m5T6r-q6 zucBKJsi`h4n_pfg($x_zDotqe`6x8Gbn%C*FDou#`9nQW-;@+C>RMk@xQJd!oi;T{ zO<@`P?Sg`7J}>y{1~wIv7^WMeCEsvk>}ZC&hcptxVN~)3aY-V2?lF}#eS~{63u1|3 zpCM@CIyoKcm)Jne5PaN;)*Md6O=`39vmGnv5LGGBY<~Zp8zsH3`3d zV7{ku%s%kjqtff}<7EDifO*=DizMSXSN&^X-qbjz-%ma+b)N*L7m+bcLOw~a6EAUB z08^KYGqx0xegb}Lfw@KFhDyg>z})Y~dD6jr{byi)qH$q72c_d>VBXcZL^_h>%Le^P z$ec^{Wd2a{%>t&(jq}KN0{ATi<|>U##OsrP>wx)8GR{Z7uLAR9jT=h7CxLmvjq}LI zWsKK=`QtD+mhVwuPSO+NiF6ptTY$(m!U@1k(>Nuc_vW8VfSn6Wvw;gbLA)K9tp?8T z1o0V&=rbBaIcS7mQv1cu9P1~iN^rsoiuVKHPRdfSpmcDt<_wLo83yq?2e?az;defm z%mQYGfeYf-3`~!Ki};+Z-VT0SfjMH}g801$%!$~*M-!A@W^ooU7ib*of$&Sxf8*eP z88C}9j``%*E-BV6z(!2C|*lzjgB?+sx7>c)BMJ@v+iz>GZ|4w#|z z#znwHH7-%_ecEpwFx|c)BGqkg#t82i>!&Ci3QepwG(T=Pq$!$-e-4VYaTr}%mG z3zwCD2+R`(zo2^m0x*Y$;a3BGe+H(A6&r@}2Jx!|W`%)^__Ryvzh;dgKbjzZw*z<2 zF#OH}J#S<+O%T7I0{5@O@S6ZeuMl&l;y6@#d28!g2F@?NERP(GQ5=KQ`*Gmxn_Gj* zm+iG;g#0RjTcNQ*{HULrN62pta5oOakL7U_Fn1fcpz?SCm>(H9zx{Hdqk2qZNGE2L_XZwr-+U6d z3(r;%wtGMM*uT{Qvqj^ElJ6gZd0yiZ@+I}>6T$B-VA7~SU|26CULU=20WdQ)E~p-G z(@g}JaswB{ZxJx74P3;hoilh1teqOibOiDHGB6KnT#$Tg5%4fDlkg5j6O_-B5Vi!E zjT$#pKHm+@&o$1@XS}kJ=e{5iXpW(=NtB}42IHrU|7F%#ibIl$(w&f1~^QwPvrAud?bSoz;R z+9|>ZZIryU9eG(fY5efal~hS3yH-bJrmqOszlCiE4f(!*>}>0#MA z>0zU#@slqf{z|@C;v$ZQ@>P{CAAxvw>M7o3_$7&_1fpn;KzNWIz)zqE!jwS8;({dx z0wwms3|$-Sdw~sR-G?Diap|oM#y$M;ZS_T5H!COZ#^}2+#P*IQA(u z9%>5>X5#S2RqVUrQ>+C^o2NicCbBbux30?bK0>dW5*wfs7l{9r*u(OwCl9EFe7L~ z*5I=2y1KUa25Ot*3nxGF>L7r}n|mKWuX)mMo8y}>lj;MDO9TU3J?ITZ0!`U6*e={4Nw%*9CaSn6qni8_wOizP~)wSDoKqKB{+5 zxUcl`_~U)mvvEe$z&Qx$-7^YjMoL7&3&a)2XOB4)3t~u{$j?iSDrh} zi#>iB-WPrnkgEqWGIswmWA}UX+S^x}9|37|-_of#&pNgeCl~f_lkAwyJ9v&SAGjpW zQ`Axk~&BTk(~0G(#1KEjEDEU^TOGCdS4Cq?)iYnZI1!81wU2lY^F5!A*fWBD0Om5 z#}StC!*kzJ2YfG`^Dj&k&iFb$aI_X@LT<_In$BZoOS3vJj+bWkr$5p=$LczLa9Vr^ zfs)#s_zOty!EW5lQkqpZ_jt!|27ASo;=JYtcqwIjueg}iyTp|a`yp|$yZMp0D9ca8 z1t`zrP=m5?CLB=o+I|L16I+J($eO>V&CPH_ z0we^&6a_9JxsimB#0(4yR=i-jy{6SZt+lVMwY9T-4z+dY1Y!-^(GEUsZA;a**!X-{ zsm*Is^Zoy8?=#(VPZEc(@Atls4fkZ9z5i>iz1JSkKKrbVPUtDsyicdyV{{tn=!{?A zHHSQVkH+=|<1o^%`y6wCFbkLsMwvB4PnM-=aHQBkTI=6eqfyhHCReoxKrfq?MRSs- zIlfjJHcYykq*U%c{8Z}ChL6rHN482Z*-!h{@k}krRBJ#M-f@Vs0tF6`(rjb&(>;wJ zI0Ry6t8)V!HA3QlBJr3CCo+(?2|9i3wBs4l`xMD-CF z(k-i`ucow0s>n_T$sr+Q%3s1yStb3QgqaOstky$c5PJ5TFN=>^ID#LKG;5VdB2x!q z-&{t-D`MZh7Z9VjuywjB`^3R`btZL#smcTi8W;zozc&#k)pBUy;FIzcf(j||Cxl}nXkZOkP^K9doTz6{~7 zJ+7vb&qn+_e!23XXG^6v=uD{#;fK^*yT-?>562!=Wh|4%Flqx#Z)QJShGXTfo0V9U z7u$ChW_Phehhl#^q~>)!mvBZmUC-#w&@;LmJ)`59g%3Xv9GLjPl!1%~at6jdkd^(- z*R${YTlRfNz!nEiw5DIV|FyIvGvoCz87=i{A7-mVuXLe$$D&7YU|jS3MXR%8yO8qO zlk4NXFfEPLEn1$~nVIN4oREsQ3RBrbGLe}Aql~DAD^+-3^{Y#VXFKM&y_YA#ul5_9 z-zIjxng}0momAh~ofGR%f8+D8WRE$~4b+920Wz_};UlqdW_o@7-0+bu97b5S5-oWC z!R`}>dtatSW>raFS%lQW@-wD}xryqRCXx4c*|iaE%1bnvHv*VbF;&+Kc!rC$A*vCQ*73CI%3=( z$1%pHx_rSJbpPfcSVR&yVnF3sa~qG4v_Me8F>5WkXNo<7MG#6i-Uuei;z*=S!|}a~ za^~pt0o+m!@0I*dDFCiEAN8i0a}GaKHs8`z#PEYY+mubFP@Rh_H9l+7S~P4kr@ul7 z9Wg5GA9AlQrpA=?;}B?n^7Ho-7Vb7_R1F{vF>WgMamu_EbE%vuorhl05#y%fSZo`& z>G)m$23uC8rXt2omF1$UeC)-SY^rumMGUAM`eB)*1;X{JwVDq`GJ9GCsfk$qEB z5#y#pr{Kt!+a%ymH5D<+`-ToNjGzuVB@L0{XpW5Ium#cK*gfFDsMvcvA#b=soS$j) zHHuxzWa>2>%6Vj3;38aEe>&bMs#ZSS7zMg9pJt`G$!gxrg;Un)z`JFgChPXjewA|% zd=gGUaC3IOA4K}bxJ`3DLu5Ir&IC3saD~v|Y_s@`Yi+9EYN|68mE(QL`-RGExgIfzhqPS5giK3g!;a1G#BH~n{|cA8r?=d*<~qK$nz zMAZ$aR?k7KTh`egS?3C-6IaUm$aT$6+p=FkBZ!4ajH=-eTOg@pjy(wH3m?^2z$;GC;9ak# zB8D~79vP=2BrU+)Q9o~$=U_NAss5^|h;g^>3xvw7KklCY6b`>|#JH(0L`Yg7bTf>Q(f$$a*r3+YARwt<j#U)O)5;`@po z!Nz1xeBg+2%PK&KoiF!zF;i0!{51*7n?K{F^bbi zbckUDb;v`Gke0w_EhIeRoNaj~LhO7odYY%-m?aoBze+Zz@Vu5a%aZy6_fMFHRpF@{P1jWCBI$QZ9yMpa{i^} ztc)K8lpa4z+5E*FeBFnn&)seLx*?V7VTZ0M+&VGrkW59bQOuuQ4% z7j~ZaH=FZ=nsbFG%?mu7D?FSl1;ajv=}w!_@|sbF;U7{hyEHPXIo;3pHnL z>d>LXYQ&}mrr}B*K6vJbr!BU0*rlneEgk;Ql|m30&m)8dq%cnX)F9NYADc4`ol*0G z!C%9;5g~Lc#F?)p2u%x|!z+Gn<0Q{%swGmU&eqNT)7=J_NWPq$mkNgIpq@VV&83gp z_4%Kg^HLAzWggB;J)G+VV~)#rEj!~roAbpdAQDcQLv*HjIYQlO_A`FST|X@4OYYzO z4ZDM8#3~%N`VhoFR!l+M=F*r zsg6{a)GhLd7U!kjwqkwo7@3_KFsl?F8WrcIN`p+;m*~v?>lf{;sBGMF_B1%j3jma-8&MOIp zOG2jM7RL)|OJ=H_ET&9fx&q%AJEMM(1*r?j@d18uBs?lcvLai8x>GiQYJ6Z^vZ@G) zsOxFKx8R|W&t=iJC^q9+ zqQ9Hz9`X$HU?7d(3??9N>e3?76Y8PMf;qHJPwWbi-~wR33jK+LX3W!n?2 zySx!&?Jj7HuvEFR`bTa(^d!SfWvV#4SN4#pC}+3q1Hl-?()7fda#O`=x&BeMUVJgS zZ}!Md)j5v{%J)${80pW3Q>o63mHt`r*A3Mp%-gD}V4g#_cJ^U!mmH*|53{wXp6eZO zATbAwcSu@{552n^nxm11uC9jd7_nBT94Oe*th~Y~06rcc8k5&)iC33+B$8z1Vq`oFT;P-TRGqEG&tdjqWL_yPK7{;@tGSIqjLO?(2VzvT zuL%gTNu=6T3Kb>|<7zavCVQ}0(y$p5AXH9|p5Gh3QXU0jP-e9M>28Das!mg;-9IBCp!q+4k?tO6;YDvkUU@ag*srvtLm#XYL$j?}GL# zt{3|i`B+B39V;?)&iy>R=bGjde9`Z8KK3jAnuJSbzk+LRkLEg=8R|Rg4c*<&P_Akv zyBiGi`)E6ct9}Pk@pHVBB$~MXG2(tOM%+)vi2L~%asN369F3L#IvHn#LeBSoW`2vY zELz5;Q8*TFi28HvePZ}2_*Dbb zvD_Zl7)#MC>E|h#T;cZn-hT=(7boK!?_tS- zI~zj4tkpOv4ra$ss4I6r=? zf!XN5rQ*lEC0)SW;=uXw`vfpwao|$%!2vVl3vflI}Y`Mm&`*$$i^zY<`UI&i7@v46fwW8f9% z$8SAwoulw$ey;^)j|1n&?<2t6<-ny%ANhS5n1>uVKYrf@=En|PDt_$8p9AIUbk zpfSP_7s+pmekdQfl2Q1zgMJY(k7^v-fgisCVE!=*Kh7t|&p=;^AKgg$n+D8G2QF29 zF9(leV0LI6=a+uzy9bzuM&U>OeHWM~9XLOJKLzHH1D7g&rxQF z`L&O85HT5;Ie7~AKKv1WN%fh#wjR?Mg>=q$%@Aep?k}luN%j5^NKV4T;~V(V9fw~k zxkU)C=C(VBv*+1%;5vABd2kpnljL&O*zbUwQmAN0D&G(=wHoKAKi1zXfr&V9e&x{u z%ytJZlwus*0e&%HhBeO8ON#bZ59PE_L2!QQqk6l6xkuwh%I^<>d0`ZOoNxRQm^U@f z>c>;0Zz8rHp2qEmaDM6IW5QHm7HXU|A4sdM1`_^kzIvjdlk-@V|s6_|5p!vl9Ret!J^3e0$RG;n_TWq7v62oM)PemTGe zN8xt@=r06jjsxe%uN0VN4qU4I-Vc6jfXQM<182<-*bh1ERY7ML$(ghzPPG%-Z{O!Elo4pS~i^H z7feR4 z%a&CIE!d^CW!vV=3a*TH&B&jTS1=<#FId{!($+L@Nn=kCHwAh51;K*+c|~*Q6%UcW@dE7M_$ zjY*|-4Zh{KT?xF(;%2S*>=@g})Rapsmsu*shl@CE@^@uRQ?#QzT($(KONS&PjH@k5 zt<5NN#EV=p+9b5l=!bf!T;e%mb?O&`|UtgqJ@Uxg^8%t@qx zGgGt@ejlQ>h)PYgMiH4(#N>9Pg`NnX(`~?wh{!=n+dr$sb05zUIW52`dE9wIXO`_o z_)(@X02$x48YxGv=vcw%%)GS2Kf#RTY9gH(*$w{$W$o_(!_LM}6_8m>CUTn~X-iSn zANaERh0g&(&$9@*;7ezU+6li(=I0np4&ph$Cd1Xz41;U3tWQejN$}B`HTy>RCm44# z2v!|WfV$F$WifsDr}g!cYQ+Vsehx0I6?A6$KL|gp<{f5O;s}f&A5Z-$gM0NfOG|OL z;Fl{J{0Mv*VlkbBxyIs_4fyOLysfjXrLm=lJB@?$f@KZu=l2AgTiTm~Sja?t_twIK z8BJ|%yVjZavx<0+_i}LD3PNWZ?Y$ZP3CfbCnM(8T?Gm+X|270jk_-18n1HZ<$4}J; z>dfgrfg4q2T~w$P)Xv@bDLQqv_3{~^Q#7x@4<>j?f}aAC*y+B2n+b+P1O$-cYxubn zW@hDHp|H%6njNKCx(_-STJj&UxS8@z_`|8--}S%|AnrT3PB0uL9XmLT6f$aKV=DV0%YTu)DXjv!kmg+B8Eo<>Wr&fQaJNs&i&b z{eeWSNW8jq>B_zb4nz8?#E;{>L#i?k#&-_x8P2}>exS5vQQ9o5gWbiAHz2IGPH-4L z5AiW3m%HWLHW~qeBwwVJXoLj#~YuIEvg-kEm}StFI%4|OOKZ|CCW16WgD*= zSeWQlOk2&SP(1|3{TWPZe}yDiF|8h|UFBpSs{zXzu&l_8U!N7fetqG-&_GrqoY@~* z{}wvu!hMl-PeHY8z0c#9D|X7C6CeBF{}kUMTvga|_@0%pt8o3L_-@5j;qHO&7x-lu zU&d8Yd>uYT@fdv1;FoKd%l_;XcI~HTCC!CT?cSGt`~IrLeqH~6BWPU2*gpT7)$;}T zS)oa5)xVbzn7aPIC~$VVoA#wiVP_(Q&Sc00Ofc$TCA9C;Y`&`!Kae!_eYgpC%KP2* z@Fuby_TA4n`o6m+Mc{|6JZUz=-(+8J79YwkvhJz_>FqT>o2qD{y^H ze2us&1;ZnjCixdbN*b^Kg&(I7)7j0&_SY^Q?o{&+bhGSS?V)cn;STpE{9=-HRo{1+ z=fqDWpRq4g;>N7hH|&_2W%L~1=g5+RMQEFs!`55)rX)t@>j#1&ekYdo_y%ny8tY2=sk=3WDo~ zYqK0V*|YBh?`xejd@=>S!fFJ|>6Nv^TNX=_>a!o-SN|w2X2!!q&GQdt?`G$dq^rSk zJJJh(HZU&n^X!MiLy4N{E&DzLR9eO2zO{pOeQS@_)h;uqFtI0cV}pO`*%}-CYtPQu z;F~>{#|DRcx>0VEVuOL}$HxZKu8(d6wK1@IG22j-i_1w;I&RrX|6_FkYv27;~QOz+8N{sx>QCu-kQ2Z9j9;{|f%zz(V>LuQqy zNZ1C%P8J^r)fW76jYn}kS#azd^Cj#LxGLP=;5$($#^E|id|9|E&L_c_gCER`YhxJM@ zC0((B!e6@gi2_z23A|%2&b$zQc;x$v_6;SB1;o8i^b9;WhbHc{| zL8=B$6E*kUk%9VW#ht$KpNNxkk&BcE`}G3@orU}6EEwOnE-(A`eK2whtI8#~Oswmx z&I~P8hO7aMhjB8)&NDW$+9$Dry;%STrnhQK$*2qOOPt=1#G=-%P8YMx71I+F;x{n^ zh5N*Wf0o#$o+`?$NATI=TL<6!;mZ}}UWB_`nRqDNXDr<3E!;!!ohcOi;kyFA3>Za8XaOrb890_?4Su|K8_fu96l4_l z4G7tSkTr7MXcQQ;@Upzc*o^R0VG*MZu^Ygv(dfiKyd~bXpEU-G%Q2RU?h{8~lKst{ zr*AyTt5B8;riHM~F5T;NQ05}R*u4T@29j*5i_dIIUGNxqb+26jIGomj>jX8j@O}m^ zs$&|jVdkGp1c=Ip^Dy8Nm=hpj!PE)sA6R0J{=`k#crI`Q&n7CS$DXWRY4+R9UhJ*( z-f@L*N-ob&&Fo25j>tNhkk6F#u^&^}JPkfoD`+rLWs}`IM}TZLaP^lVaG4WFWD zgU?nBH##Yoj%1(;s{HclC-J)Z3?x~{?B`@NcY2DW{;Y$A{2Y*;A;M3GkJ`;O&Vf%U z_5#gVshIr=U79fgID9K0BGHNV%dH5jmu#C=7PioUQ`D5?bj3oAVPJSmx-tqc3}Ape zD^TAvK|NaVQ39h`CI}Tzj%$i1(;Eg4#r-_Z+O);J1o!5|nga-KuyN9YAI~6%TPTSc zet;8+;RiT#*vME((E-Y2{ZtPyN?VLQg%^jb6(%ALKCMi~C)dpt0u<&vl_VrjU3OJY zPTZAlzAWj~bv`0MPL)2q4PFrt8$537)x%TwFde!U6rc@i@4y?{gGzF^|E60&#YyYH z3ugS!TTQBggRKDzKJcy9fQINl_XpM;Xq~8r>;cX<#^gBnzee)IIZ!8j8S*I)Rher{ zN0_RTta?g8mGCJI)WN4F8|&eFpHOVF!n)w2)$d&6dic~(w;R58k+B!P4)O7+k>-*z zoV>6z($xHnI=Kfa;nq4);2zRG7&0@K}oW)*O)p zi}32Cfqgv_S0&Ul4?8Z}U2mNdzlm)?0p(DF{_qeJfGPF~eK#G3R}G>j#Y&_An+9c0 z9>0mLNN5vJ${(!LaYp=Bv=W^wCxXSr$1ZTM_%4S}4Sh@D`=Eq1TVXNyZj!KD z;iD!pjL*WiN5Z}g->u@a4>+)Wqa1ahx)Lf|`Ob##W?{yz zcua(J!wgK}KqL)oxA4irT}*sa;A5l95aqlxgYagzY>U+&xv+uAvd`EI!mHCT5yE)>lwMYAj0$m@qi64E8aJC%*4k8@QqvLRraBHG zHdXZMZ$DyFar#3?jGKz3U{ftU@$rQ=)oM*ejGKx>Mp}R$uhRYVsmIwCv}2v46O7^f zkd^gN$891@AH_~sdzDb9{|!9hc{N;4Iz9T2?~R7@!`X8ln|6>x^?cThr$mPHK9!Zrs@4W|Xp z#FZ&rdCTR~>=fRpsfbZ2`IHVpK$3LU3R@d))4}&^Dq`GeX5Z;&YQA4n5#y#hRjAI8 zaKmt$4*spCB1Wb8Ei27I9dd?Q)X;oOfYVG{&$w~bRnGS9d@=SUPbqU6tB!l14j;-~ zzRBh|Ps=)8N}2Rq9nx7A_D5aJkz3a39$73YKUp_x&SzS(p7xdXevd3agYfLBn6I<` z?Zdye^L0pbRtDh_ZDg^77e_ri^A$v>J70b#;+ZPS`svS4a_I0J&G~FAU!U-mb&f}t zpNV+(W^|{2Xhxxu%DZoA&gY6OXD+59)}0GKgYagByYPbx-n2QtqB&3VaOUj9&Dm?7 z`h3A~G^Bn`9C!4n&G`%l!=3NpJRPBK&gXk-)CGcJ&p^%}`sn;#oAXl5`2r8;3q71K z@Nm9JFzf@_zV>eV0cL!ZK}SRPbQgIzUyM+9nlJKj=43N1pn3+3+m9Z>pk{LZndW?n zhw}^%=Sw`CFBOcmX!tI=`$Ny#od2OYU#d7edh9%*3gJq3;@`h`p50O|;$#Gl7}d`- z>kz|}Le2x-dB4s^L&BaW_x^q$Fku^&&9K|T>%KSrruw{+Y6Vh3htOYv6tFhT0S$^i$IiI1d z%NI?E*|K(O&T}kT_xsA?LY6yUe&*Iq9p3quhyUG{bx3no=GMW?n9Rwexa2-_K0@8H z{0y+0UE!9OuXx&)71Eq9lYBY*F+QHTIbY@}9WKHH_7h_BEk9mt=lvE!sSaBqBHi%;{Tgsc3mn3gL(_*B*8a%W#)%wQ;MQ2VxLJp&d_}f)cD1zkG%J*F zcI0a*e<>@Denl8>VoU5`+A&5U^JPlI6C_XP0!kIz3b&6d@p zIX76c9`Kd5!6U1|Bdbv`J8)&`ls!CDYs-2~b8fU`UBv09IOdD4*%jiXFsrk+n%M=6LF!hc{}@n=D!X z?klU!BWsgK)@H$|6(_uNop=(ugaE?meyTZd_Gqjfv2KlR_HgbHOzQglcg?xO!@1ML zxx>Tx8o`+QnfUz$2kkUZMXyVDjfZm=LfvV;#>2T=FsakLM04);aPIMN?)Gr*70kW3 zGV5!fD*C0J=IxquuW+8axMn6G*sB0DT=-@1#`v86~Sn)7xK z=W9Kjw|h8WCz$(jWqo~h;mVmd=M9?kb&9jY>;rq|w7{jfvM%nr;;SpJ6CZAjdqBlU zo*kf4S{>AU?2yG%h@>-n?6@c7d!CSgdP4F}Ra|U7s}RC2+LrZs59U! zH&cGbsh6#_^Ysf*#CcHE^`NxhE^WN*yqGXE`al6g z&1IoT-rNP1)wPStmn;rho4JaomXzQOobE`pt1CjY({_~Yi!5GJ77FFn&Z6mf{4Wn( zSz^+3Y-qKCw$CIfSqi%0)x10Io*#Z?Pxs>3zQLuFkpVnMi}r=u$rDp-i4gz73H zwM(42_N0@jGFZjuuD3FLg;B<%ifoka)A#D8{+X&ldVlI|@{Wr7QVwlUJPu`AlpWT(gW>6ArkfD=pNc&jI0u+&AnnX^y`hWnFD zwO3+KA-4U)j)+3=0D-#g?Tt%1qg@R>BpL$~*y@ge3F&G(Fk=pd#0a}dS+-F^I(|TjG?7eqab$KfbXF-3l8P)V@{8bMOUZHSkc*VZ zLnTA)vo>6x3h8q;N<#Ylqm*O|l0$KJfN4k_ClHMg>ndD_R+7qAnNXL6N$pb>_}zRX z^4hl;r@i1<1$R`c>M|yl!puDQXLOz@WWIlPC@>;t1{uX_6Rff~-;K&O<^-0u^q>_- z8#cQRSE}pnYHnzZ<}(l(DN=uuYAz2cNJ>p|GSEVzJ*zspHr2IUJ3<#xRT5skko6L0 z2Pqa^RX97qZm+gawOkVL$PGnO-O<$B7DdCX>*=zQwolP4Dyc0k$A3*!raBhYU-!!hp2;ZQ?i$xoV!XNHW37l?Y*(mgi$ zR1-CeBfPqL?Bv-#tKiu5*i%CVAvrEVk<_&=cMT&7j}B}#yEc6uR9#O;r_Iv#rDm?= z2#uT%=49e8E}05-a#?h9LrXh95E``}FJx-HB);NIynPhS=pyWzPb$H`4gR*)Y+q{q zq2;rna6%5IPExq|EUIlg^v8}FaM+R|ijxP62{8%^I^gDg2D^%doz zbA9_|XTUp3SCl)XSQ?~&%`%oY;wi5Ts5=N zwoeJJlWt&P#OxcTf44!l&q^m$FJ*>aw4w`ry6)_1w&WLtIDuSIQ?;ZfRNK+fmQ0M6 z23o5ljMS_INoZ9Ov1J|Y%`I1#fv8Y8stnJrSx{QO7~?}of0?Cc;;8+Y!8Uho-hhfT z7NI~Ru|)gGt7_fx?b!V+WIwK@rY1xNP+N(bJZS>-B zRU1i{i_}L(q{hrbP48xuq#Kr8aA*)_C*pv+X;l3{5eu@cp{=pEt)V9>(`|JC*2uli zqLPJ@q;j0X*wwM!PJ->Ts-X1OCeXJnx==oebzxxeuYB=>WO+&BLq$t_OZUd*YTiGJ z?6#|GTRNj{E$uwO4^uj;>f1h*rxHB|;aj7T#~%VCHPTT=drG=-n5E!HPKOdck_HrF zWG*^w0(J8mB{z$r(atdwsJWTV(e}ADrTT~Rs!;8M%7qISEv^m~&$QIbF46jIi#M1< zst>o&A!0^V*A(SBp#I&s9xk+sktWz{904s)MzVNNRvKDR9j+*?KxH0Ff{Le>*CI{m z5=Kpv*#c!iR+Hzd_NM5z5Kh{{VRzPfkM_iR0qRL4(z3ZT5~*uLA%u!V5}I&$vnmmH zvACPCS#|kLl4lo#?XwDmT@ar*&7)OIlb*6`Vb!t@=TKP>0?Y8s9L3bkjHq9+a#dGL z4})Z|a~vL~M!tNQd{|gsv7i*)7Kec1S@v}qy-{9zcA}XF*R>8Y&37Rce9n>T@DiJ`)V=dN>@++2v%CS09RZ~-?(pe-xbuDoC9U;QL znQ_9kkv=;?lG0)!ZD5R`w^(QuW8ZINjG!fPBBq65n=N7w2`34i@YgAOw(Eljdga-l8H_KhT27S3c~ z?zRbR-$Vy+owc_Jz1`O*DW&N{S+PwnTK=YaJv*y*2;3Z})6T(?Z7 z;cd~zx@Z@cJnf>ieO7%^oXt9*PIC6uq&cI2(wBEMb@&fnRNe9=B(XOeQ^Wag+bemcIIOKoVj@l&odXVmNOThKL?w21M1~gsxuca z=36zV^Eq>IZ4xeI;0!Lu78I$=1!KfrGDckf7;!UG;T#|R zF?Y;IvXiqT9h-z0&pk79!EdqV$xSD6Hb9d8_=rzd>L!_2wwQ{9X%wCu$75;{48txEZ)lj>2y$ID7$^ zr!|hR&HeZt24-*+eteZa4)5(7Xmz_+M+J=w{7erh;Fdx>q zk;?b8z&xmNe)?m5{x&eb8Uw%AfO%^ae$&A(6Pr%*^v08s^j8DSI*s#7ANg$r=9V$= z`ww8gI|{!b_#Fi1@EG`IV4KHe{OJ7B*NeCyFt=+Qw~t7-<@QO=y=GZL6 zJOkVWy)}gWp)vlMm|k@4yU?f@408!(cOw0}h;(-xT#~E-+OZ=T{FXw@zb( zAufLPel>6#N8!ierE84*b^~|YDEzv>@6*8KFynAmJ4&jjMTjfa7y;s9*8?*Ia}s#B zcyOVRbBi9)tbfk}_eYKO(;wT>5n!^I6r=yfVs|r3#B-duNM6F0P{c|tbC-<%SmUWPr#3EBz~6wbD74C z#IF{Z^%@rd&s62c4+mO-c}C;d?)~b)Md#po20uDKer!i!U>Y=T9Pa)2^#Zd;<3{55 z5n#TmapOkd_dQ^KqH!iatT4Q@v)#T4LEHY-XS;1~>27=v4tHavO?9GM;lA41T7LAQ z&4xXZbAX%dS@apQO`9E7uAvsZ=FP)S;0}(r>M375`odm%f&n9BtA@9nahQSlo48&X zZLhCS^ush>CPMktkSl8h=Zg;)!|oJml2Mt#7G4fk{S{e!U=hys_3Olrv*N|ag_OKl z;9~tWnOCeiD-|PlFg7DS>p+;Y=2ZZni%|@gSOZ95_HFz6D{`o{y%o7;`e40o0zy;@ zsZEv22~!D>InO1(&fsh6n1{6T6|S)sSw^`UpB{C|N6p%wHslu>jSMQr8W_f z*aA9*CpcPcf&Q}Ta9bA_?mI$H@>-IKUif>Ok2}JuBD{J+ALU2t>5$OEtfMz zb#{_sPvpdQ4jDbuhI@yY56PaS+RAJiGdty?wL`rJF4~z%J@?-k$e6TJnVgdrd6hfy z%z{e%}cxdlFzP$bb*0u9*14|~><0<=t5&3CuWAUM#OHGd`i?pncAUT?BW zst@kwncQbw<>6&3i(Hk4ptdBgoRu};mn$}{?OH}%D5q-Kdfd3v>Z%d%nm;Q9zNO^esxvh zuWJ*p$Jf5vA07+<2y=g=m7+`xD$C{d_3?_0^AGeMXWE85dlg#BtF|@WinjR&dR~mL z%ZjhdiLaXyUzbU9#%L86g4I_1GK@=c?ZGeCU}x7Yz6H2)(8v|*xg1m+*5f&l^i>2~ zE0vhqc!e5Mpad8>g$Z|FC7GsrQ1LS5TcGQN6DtdgFjv0Sx<-6lAh8uS3wLzmbhpVa z%clS~nv!D88;w|Vn^KS|89hpJ!NkBz70iv|qf{lCn%E^_xEOPI5vL042KZfRFndXK z*~eL?H%-Cyw5mG+Br2n<5o`sjCbMnj8tg0WEK>o>DRFyoBjO}~JX0cG0W0=|JXw)x zC?l+#Ioyh0t}zMMTksPA{(9YQ2vSF$JSe_QTptl%7OvkBAG`I(#fOW>5qAfE88SWp zck!7Z9*B}^M@_2teM0kb7r9I=5JC~3cE#XE9qypgevcK&HbIx_*c6q@DTsBa(urrs zX}T}M17q8`enos{xL>Y9AwjtFU?zxp_!@qWqPX9Ei@Q{*PL&G%d}ejaeW0CSJXw;d zPSxPx?{tsgMrutWW4JaQ6(xXrh+dzLy(yj9!?VbV#Zf$~690qqLdL`R_rRJPK9Fhj zp1yHDva^wJxkx2M18*IK9om|UVRLjcEHT62dfGwTc6Y4#Vk1$Jm#8Va=wQ!@OJU$0 zv56(BF9=lR(F8Nn!j9!B{4&I<@sr|XJK*Fb*C@wziTIjuka7xA&p{!@Ic zWP{>kn;nP3O3j71=PcZ>#fOVHt9Fn0W?!K0n(l0^zeRkK=-*2aQ~k0PX*P~j^bk*4YqqMreqG zf_)OkE@Xb5+@@LJ>Ug1D+w!k!K2akA^#RCg6#ANXC zBK;DCO%&f8_>L1_7`_|vQ)#P(PdPQnWdbt+rutJp=jI~P`JAgZuZ;AZJ4x6%X29k{ zLVdkuGaCam9^R;9JhieStFG-l%pKC1u?Yy8j$baH$n`9a&va_c&V!GAmCDW)@F}OV zbE?Si#}$J#x@gfJW!!?F%F0=YRK#TObhINs!7zz)Y+}_#91rX?U*f4kd^hgY7jF?4m!eUMsXXuA2&Lmkq{?z)qDrZdMrpQm%4$P$D73t`}GckauFX%I5 zxTbQH8TLyhd8goB*#&2tQ1i(d@Ud{z9P<+KRU+(S@vVmMBJsgvT+IvIINhmUh#0$5 zg)REbK$0nX_B6^0KW9P8zCSr|af{9z@E(AFbWT*I>YM#Jy)K;ocWpy6*K}^{%w}jB zV%(Nx7-N5D?zYZcL`HDLxT#o=Y$~^P<_JmPh;dV~OSP%o)|q#c1dbRt6`P(-<+jeu zc^MrsZmLX#*i>%o%)cTD95JABY??U^AvP5;w#z^bpd$uUjx7fh5t0_*^9x(`);nk1 z%G#wI&x@d&Xapq|7U;|<32|;wVq;DVaAkrndu88!iX-oKYbs(O-Lde@vD|GTVxs8Y znZox8h7aIOVOrM%6dfyH|5Q*^}nU9?mCwN|}9ZT7XZ*bj34%u*T;6 znC5(nhcjnP?lhm`;mr5{X@RM{;y3GzWlc8c0nPbT4`+@6ZqBEAIJ4~10y}YK8$R;* z6T58AXHXcNZB@BUhuAf9g(oEH3ZX5+#?I}Ek))8`tuBnSrEqje3v9)e{ny!(Cm?qL z_~<^Usm@S2b@Tvycu5Ncaiua=-nMj)P4$qbI#W?OY71M0TR(o*na#Fy`)R+QZ*w-S zU@Pm)&bGspxHAh@$7&GhB#5T$vitaA|SmgQ%Q*_8F$ zCxYLyWra28b3OW*>f!8Xi#bRnemDO3VkF1RMX%$)(`u|RYc;K)MfKI!4_nu-|r zNOS>0(gIv3BjmWJf8?mWr!moR%E~i+B|5}grWYdCtqniB&z#ef&CIp=m9{pPXwDZ| zIqh}HiZtV6ZBQv^YGbzxUIjUKT z>Uj$R#%rKrk3`Hk1{hQLs39(BSCQycF7r%F>1~9!0Q&0adghMT#I{mTQ2w1 z`K5v}dx_$vXMSnt=WklpQdQ?2{m(KFXFvPVW}B!#@tarKoagY-8BW=ccBXkbLfvWh zvjmM!M>PMtt&e@(=DbmJUSVnM2_2$z=#;h6Bg@Y=G&RYb{PN^V5Sitj&c}2(WgD8l z3w4NHULjA&3QtJ86(Y68q36}$>DGpyjp>tsWSw!ZlkC)->s1Ll=22G)XH)R*zy25j zW~;ti2NT2gWp5Wm5hkUl-czIScnr)HxU%OPzweWG*%~{jIj`~5sI?x>YdoCS2?m|A zr1WRAzW$ia`Blw%omKAdCs154DHjohy0yB_BWt~2Oj*~xeB*1jtSdC<^_HwwUs(+v zS?fKrHVEcwT-mqwe&X7%*|K(P&KoRQ`(3g?VEo1t@}?&Q-}h-pZO~od3UQV)pQqgV z+2BcYlVHq#?5<^J+^0%~obhr+T$7dNt-i9NK)Pi$d1N&UCbg{Hnsc+ra^`~ibaQSN z&JTg&n6=H~&5=g=B0JL31S^{`FWKnx#d6+4SSOYJjy_+Jo8Owh9aB@ve#??jRcZCY znv(KL&6>tqL=??cgp^?vWi!C{OJmQs|HxNMS$AY{v|&rs&^O_BSQio7FJd%jOcq^W zC}!*ycCP7#-J(%!@g$pl)5hZ7hDD*PNBo*!+q!Um&HuJP|L2F}KE+JiPTK4mwOZF2 zS<#LJm2K>8-z0iQNNunCzOJ*a#T|kaDT?Ac%cR;!0!`CxW3Z588F+kqwsdGW(zkZe z>W=(4AwjdrZwz5%{5m{`(s1PSA^(mH)o#wMq}u$PipwxKzqK5*BGl>pNQmuVf- zG$ZG4;aKtTkx4^XmP|A-Ef9u5mBlV!9nw|=^9CA?HC1ZfI_kpPGq3mV>>j{I?O3-_ z%_>E2lv#D_sjpLJP~P!r=uAYyVGK>3WBzVRR=q;=VIy z_htc8bZk~!s=B9`IJ&eE(XPflBGTDsjRBa{=-&o~?x!pYvjejFXh%%ymdojmAMbF0tvC)a8sum@GP#T|;&_NxXeb z7r}ye3cHA;HzzIrMw;}br99dey&6W_BABK(v~lXksf-nB&R|@DRo!JBuy+{ki8jG( zklO&GdXP#j)_jmMAC4-+Rf}Nlw^~1#B|jX&+8GRCk2virF3uloPj6XtOG)9d_@?4V zD@ZjVO2XP)^h`6g9yrq+!A6!#*UP)MmqxE{X|HPE(y=M2aPS0&XVMOsmfY?xHOE}p zDoM*^tu+n~e`PO*g7dsM&MpDlBb6 z9WOSazM6(_Xt5|lmuwRXQN|Ag5@la}Y(o7c2^XSGD95%9GMI|rzhRx}VZElv#nV*Z zDD!R6D;fi@IKOX{Uk5J0gu*cislM5rjPT=uIa}lS$L|~4Vni;{I6r<&cReuc95_FI z8-dy8z@E47ukkqg**Li?8Hzv5!fuo8}tYNI33Q1r(1Fkm|~c zhW)4>f&7G)^-u99id86A?oSpUE)vGSsCdFH7rqH<*D&u%#vtb_K)IE~Ie-ME1_lu` z!FXr8Ty-5$66LDbLF;(K+@%GckZ|Y4*<{H$^;;dwn;}vvSN$5orOID03K|G50|` zU%L@Pmtp1NP8EQwnXfOqLY&ekAjT~{!y}#5A}zpl2JmyA-uNAa&}E7&CuhC`aC6S| zaAwW-mLywDXCjo9#Ln3nC-|Jrp^b^Fbu5a(PmdrNmG-) z*M}AO*zUJad5T~`t%~ciJO@TI)`x+(6M!MwCCYVT2#!VGTHCfgDd7^9#EfI;%mOti z%5~H+G_OdHxg0}h${5;miux>%3QitF^AWa&W$tu7V`yIzPR3Bj>p8MuBUsAX;Bcwz z^bogVjJWzS;?|B4*Dyw0G!@RVMVwh=K9XH3yNc%n)RM%{Zw$Q!xX)-T8)2$3nT_cy zz&zx@`SJTMFh6$SQt?9-F`m;Hc*Xhg`)}ZeN8z^~9F9XGTbNKdb|`-Q{vDXFYMftw z*%f|6W5|!rj~}qt-lN`ZSK6xF5f#fO&ol z{9XcPmfp@_@k?rN=Ri)EwY>s2aH-lGakr(yIbM{LmTxA%3EYz!>zCg`;C>2Bn%=0u zfzL0$rvP)l#*M@;ADE^w@Y@E=-ck5*v&Tn)d0FGwP9=Rw`eVDy;ylXXQt6Ml!c@2v z`nwXiR*m(`ZwdJI0P_uv8%cjp0rUJQ{EEQuC16g`FVRP8Z&kq5Yn)&D-Vc6_!0ghv zk=n;yz}z_@JY9TMxT-9zgl~p~;bN@kMVvCyatZts3~h^m{SBR&5%zDA5mU1H88W^~h3$)+ zSkQ=7rd#Qvy%lhp04kL*c0DRNtkHHN@^D9Iegev5yX4g48`n%*Uo&idjq5$7R!5kL zs=q%#v9_vgpPdx$dQ&>O7(NQjHJCk>s51DJwyG^3JlJ)poS9HQtGY{;DTQ&B!^9O1 z&+p$c#Y`)Tbw_$)a3FUh;|9jdAJagLm3G?JLEg1r2KyqN|0dHGl+ou>{cn^%FIziq*=SRbGVjm65IYLh8K>%g^2FwW?3?6pRD|TZ1z!x_~iW8fiWJ zP+{Sl@oO^U*QCeu?`G_(Q0v4yBYzu?%eYnev$@x-zy8$1eTnTk@uE4n#um>>A1;mU ztDL`d{f<{)W{&gD)9}lXtMZXi2`}O%NtI}VUrNj_a8>n(x8#V15FTsJF|GZm&d)N# zWOoYWqpbaG5+B>1swWr0*D7JSNDJj(u14_Mf}f9kZAVU-3P>f%u7{jvDW|x0;zo7w zv3=Qh#$L=$dpvQFwtZsz&bqTM_TpJ-kFQ*n7~KCq>HB}5p4flqMUOu-_}yXjEoo2Q zdG50SKevB)e4>Bk zSv)*M6=pxY`{2!p{MK8;pnbeK zvFeKEbAMj=>v;9i=J~(Mj`8bTpe}pn&#`Exftk+*iM2x)J)c;S`Jvp}y}8HJv%EGi z9M0T3N#RQ7uE^Z+yF~R-orAQRqO=2vb$NlckQ=#TI6U~wz}&Ti5U}IkS6)UFXQo+t zx*(+x_YbC{?wVz%%P3KknRw1Dn&uGfbd(#Y`0=%wW2ipx+W@tQeO2Gipe z7emT>QU>wrOsLo_fup09z|r2{AlE2ODV%2ptn#GNSyrgOEKsS7d-i32_-Cl>sE0m$ zFE&dSd|&w@pj4hx995`0lH?YU>23i>{aOHO6cnsmfb>MBVx#r9!-t`i z!hOy27hKUz+-0??YWW$^1xuARJv=x!Jh*{8>%L(t?P<&3GacVC%Y(FfmV zMZcI8eQIDWWU`_Uv7!%2MNfo}40r0`LhSA-TRm#b;NEc#s>%x9bn#W<+J|3;n7}HR zuno}Phs4KbqkNa4eJWoi`a|WLh(|~@^4ODsB98LzeF?7l0IgcqVZ?zwzbOuTe)>^j zXJ%qSmguu0E3p9f=hov`TKh( zt=dS$QVB#^4HWdPnQ~U_r9*RT*2gPyu0I)*gq1n*HRCeV)@GJ)f>5)5$A9VREleG< z(wIYkB0N;D)yK!OkKvbVoQkVbHQ~noF3b5=lk?v+`P!dszVPgcU$!~dXwF%N z`L3^1hftpTt0%5|y5E~+dEUsKAQ*Ga;HnG0IAF{AfaZLH$a21s%l2?S!NZx&P<`); zPRBUml1Y^|=esoL9N~;;;|U#NSRv22LY&ek31{**AvqrDCklqGgYLo)E_l;M|5lTo zD6*WKPXgAhu@gOs_izphhL6tdwa=Ws z@jq&lW1Px4C9-(H*u9zoDs!aclk@7uAZTg-30wS2YzeZq1)7RL=Gl z^yFfyU`m7*ua=+u53Du>a7TBp9*(9O!6eRHcynuhs)zG=f+@n4{l=bISD+|N&Zc#k z^Mo^^jTS9S)m5)05ohbB_T19X^GKgA7%6@Du6uL`I!IIcHZ5zqCtqAya&w;U;e4TB z+Hs}(R>p}B+MGY3IbZ1E%oPYX=Ln}fSr};CQbAfR7T7z=-b?jBr0xUJUPfffV!;bE(j6<4_>Uo@FH|uSh*w@H}??B@d zDDVIoz)jZKEfVPrsWKIya_VUBGZC8>m_`uX9rbhe*wRfqFT{+)Mv_#vgg)xx{2AOG z`*sxHjy7y)=#GX`ZM&AwMVnjNo8+L@lo0H5mJiAFSEZ@A=&jJnyQf>)8&h&DD^U!w zrO00_KVY;!MN9R4DD5Y;Z^22(eo5k~yGxcVUQtuEq=qLZs}F11qEN<&auLC429KRT2|P4DLL=1x&%Dt+qWC{{>(k~=EW zvC^JW6{s|+RAJ_!GPIqm>ljOXBOT?r2X+rra!#T3yWj>r2|BwQUXUsT(HSh*Tyhytc8i zqs@;UzrkSA)Pc`s0IH+GSy0kAtQO#t0ep2~9cvw-5#>-QnPZ_e9dIn`YH9A;yrH)_ zWH&5-wm?@Xv=2x3`iox<{l5#*)qPQDQF&=i4fJKV60YwQ7rF(ovY@8uuNi#O&GXD{ zeL|U@=9zD`vx-o~lF|h=3rniCWOKQsxDe|l#dCU!XUZs5JX4lTLekFdk8!!jaqcW^ zC@@_<_B_rknq4qwjv1o<=I7pSi^S0#};!b-Gl0965bI&YTTsaL5RSoJM^l7`(0m?kYXm=HvvpeasE=d@E96TxvMIIhUA4mNjm z1#8PLtu2Gl;L2#%jJz3n1;J8gXFkWQH_Z!H z*OleZ%*(sDdO7Eh#~hyl)VUg*eP_t#0M2`rWpBf413dFRTtlMG`Hu51<=#$~vkB))Q7 zPZS>(m*jkt3^|pF&#oEr0-O~n!&r~&3F2$QmFr>|I0;T2C6Zz6fbVz-y8&00dWNwV zSCwdDl^L_BCoIe5Iark8z2XW05-%oKx&xf#I$d$h5;8Qt&0X~)UL-47b zAB8UqzYIAYLgjo2_bTUD@9#%Xq#ToDtUd5UheNz86!(XT`W!EJ^HMAKcvUNehTye^PtwTf3SjdpA9+yh&ax3gg_&D(7%8L#~af20m z6MW>EYkUgV+2Z>;u5A&0x-XD1N2?G70T5nI0XNJ_60freO1BQf} zAs_Q#9`uAf=Lu1JHW+O3Igc3ilXKE_JNK^qr_QIz^oD(y)$g}{bX1VZv?&m*{enp6kYRzZ7 zXw^AQjj0A2$NDw~7he5X?gzcLl3jQ@sWtZTSo{(1%QtP6!R4OSX z=TnfyP8X(tnHFc(jcSD4f)HE!1`lSdCuA=|4!NlALr5s#S$}0i_m(D^ z1L|2~Nn7W}23eG-?PzJI`71XJ&t9WJ$~ro?+nCbc=H_Tuw+|cZJO8To=8hx`J{PNm z^^s^->NvGTQPI)c-c%QjZd%^3p-p|rZRZIbklt`xbaS*FU%hWHMXZ3q$sW0k+nKPEEOuz^}Sns)j5(T`3T;-S+A8O zB~HcFwlwzic15Y6r1<60uFbGv&=XaLw~}JDF*2GkONtRQ1Ib~VS~?{oN#RIYN0V9# zONt3^i#GOp6pA#1eNS(ST2zl%BEd>W+b(Lcc2Jtm|SmLl7O0mjuEe3>IjH*v_ z{Db4L`Y&1KcoKs4{;#fbG`wfa9Of!V!#h~!n0aiOgY_6N9ov?Ib?k!C%$433n+<7EYS@0tr%Q}r50-;gi9paimT8cs)+fs`zK@3mxhs9&=fPd}e~dNDCdDopDC?*3Vyhk$B~n zYUyupp<|P#vKKn8Lr4%T?S+m{AjG}UVIGcVYxPH(j~#LZA?}5aOxMB!Q+*af+zTD^ zJ(!gUaW8bVc`&;?As1(A~M8pN=hb99!u4|JOoCgJY$G z4?-!II?M?7T89ozvDhI`RAXB0Fp)mX9a==vvWC6XkQ6b-^$yL|y|N*zKYS8&2V-GD z!@bKI7Kt~?LH16TJhaGB*F1=O=ZhX#^O#d;E_mSYXlov`=a{yxxaN^AJ3GFQ{?%N2 zcfLAeU(a6nA$puH#ma=0EL{DU6Lwi$O)UtuW6u+~L7I-wmoc?pjoq9El`@7W*-$Q5Or}hCT z-#dFBs0LSZHJ$f;;2|^0`s;iTLk@oLVayR)Fs{>^8Iu-Z;j%z8_k5F?&~BRkn~s8J ztRZK*<>0RhiNL3qZY|Zf_in}p-E9%9Dq@A%^BMw;uexEIT7Gs$=CjSAb8|*sT9o&; zRu2mbiwcUQ<=Lx;!)1mckF`i@a!ca6$9uU)sv7)Kt{#rH#W`N-ftB$`l+8+|cixH% zrC4Qr3K_W!HE}%OV8fk?7OGq3|HVC0b~}C#ny%U-W!6sD_Ndu2{kKQ?tQ)FLhWUkg z`T5oOW)%Cdnu0CuLA+!rk(UDY$T|H2uCEbam{-6rDXZsUUtqAkLw`w$*E>PoM1s1X z3Qn(TZ^XFP9Su4fknY90gB{JmGHgq0Xm7w?GqvS&20z2lX%ZPMeSoZ?d|t4!eaVJa z8&g;$=`g?NWGYmzsS^?G*w7kn?9tzO&InGQ*5sB^z)G(96=2&~zUzJ#^68Fu;`5Ql zLPtFBi<0hVCf(0+-xnsw&vwV>%}KhS>%Px-rVsK_j&^!^pOoJGr1a(|r8hq*J^4xL z%}+{Sep34KlhRjUr!POhpkNN`O^SL}(!I%gWy6}L>VT?euKW}v<*y(qe+AC`&CZ{b zH_NW4S4Vq-&0P(fqb7e;dsq4L-pQZ$PX4@4=0AG`{?LCxl70)4^jnam--0Cl79{Dn zAW6T4wti{0r^t1$^lj-6nJseV59up(=67bEl+U^6o*Trl73@@Rbc5Y6J|Ar94z@LP zT^;QT_MmwO8yh+s8e!g?t=Ng1G11XBow}ner|y_m^f{D;Q8K9Cuy-|V55k~pSG2o3 z*o;?q6w5BAJK6)zW;-Qq!RWNj(w~72)0?HOFfY=IePPy0W)4j&>>M(Bvo}&h+W1K9 ziR9g8*f^)AOXd=&+7##5Pp3AxmG_6a;SVCdJ^teus#)k$^zq$gK=x7geOc6lwj`6Lox4-?c8hho|(9vY?gUh ztN@F?@Iw$y07UOKwVc%&*vPVEtky*qOvuD`9`;GiM6eQyMD<}a1)1Cwsj1WB;a6J& ziSVnnebo<{0I<9zw(}MrmJef!o4B2dN|a)grKl&dG<{iOkA!8SejPE{=k)K{0U!&% zf6p52Q^44^sYXvtU-c2EYBS@4(yaPOF~4&9mXwOV)RB&uX>+5t>JsAx_gsUcTZx)J@FMU zAR-<<@6*cGP*v^}Mh<1`l*O#Pz zAs*gMz3fiX%SOo+uRbgrP$DWI8l9byfPQD{iRb_p%K&{IzxQbhx8DE4;w}26OWz($c?6KO!Q-fTe@bf@PXF zgk_mG-0N+`9uFupX_TUSOpZUXotZ}OWKR$F%Kv}{tp$ToqIzi8eu_aU51B0*+nk5S zGl^(gLuLg+k1`Z{jF~oi&f?zZz4V*0(CARVsD$Z3bZlF$(Q_*36H9YVzUc_>5AkII z>eWzedlnIVSD0nhScLbNaF;n00CCiuDUN=(IEf{c;?j+t$s#Tjox)I}GTp>xCX|l; zZ0blU$kNZr9{m*V8$e~y>PeL3ib^fKw}L%_4%l#!OfgHr90^JseZ2S3Z8>Z8L` z`vh^1Lb&Cu8MkAil)x0~{goS1Va^Ejo&!v5`JB()aA^ z#qRkbG&L@$44gc0(!eB7Sx}LD;o@upjZbVl|!vvT(Teu|9%r;iF^84xE5VtGzr|BE@tKTVdmNE|#jh$jS)kyr*c<>SWf zKa_d=!BIG+9shK^`tZO6t$~5#$dn&I9PSUl3e6xZhvO@b^vNhZn6T?@W^6Ff`+mt4 zH51#9p=U7uA^IO7-9Y*PEYCVyiPgSN^3;KW4Ba%W$)K7atNtwozQk%uD0rg>M&*WL z*G@_688>h~nv1iuaU_|&lO5$0C5>3>TaI7*rRg-M(6n9@5{0JsX4@_Fl^Y0?W~!8z z-1jAQmWjRWg<-W$n)>)x_>CdhLap;<2;%4=S(-k7#bEEafpG&b!uS~a zS7J)inNH3t2It?((X96bva3E4-^)AnjKYoql^8|_`%BqjvOV;NBo&e>j(o8{ zV}dXgzlDA_ph@^rCxISp8-|J?dM_3iSyyJ6y$JXn?f-w+`xd~cs%!1ZgD^mZ08yh- z9W-JT#Jqs;XiY)}gC?3lBB;?MBte3K#5{OdP~xCw7-*ptFDSLB*kVf+6%~864U`&e zv5ktiT%|R(wC0$!rj^!c)AE07?ep5_oJo!;_V)g_qfEZ}&RT1){eGN%_Q@7K2G>Qz zk2)r;Ve=~c{!T-GTh{hh-p1)!*_Jhq(h(`D8H`p7t*$>{|KVc|E0z47 zBt1<;N!c6KLTQ4cKy``=C)-QBenFf6I3;GAzk~jSZx0V49vlS5A)TVk1dC4u)}BD? zl!X`(sjJ4wH?X#YE+*pQru=RUAv%ydou=H0MKjPC zzl1z9W@d_LJi8%#9F6DkzyX>Sc4`S62NQw)G=Aa%1Yh1%Oww?V=u@xLgqcR)9l`8a z7$BS-7i``Q74eg1n=ry7E9!JQAre&U3F3cTEtu(`^}=|Z(}h%m1!#{E7-3Q@MAKks zQ8L`kg|!vWcXbAN$kqjiPT+|z|M5`M@xUu_FHRs|*2aGHI61_gb@?eR8@~XHA};3f zlUL0~O3}u1?FotN9kA$0Yc0J+6hP#EbN3EVo77>k>A|qzJv6%wyiDJorf7_3&e^n; z2G0msA8UC-ETtA_QJxS?F9j367(L2YW5W#9*YnjlPm^O2uf`L5fs8O0^Z4mJv>|b! zNR$eFn1Dhknm_5hR+Iq53T-U42RK_bPHVZn+`VX#GKODjebJK{17pWwgAaKgSQ{>W zk$e^LbJV4-UX7yT^+R->odNZa~wX-ah1w#-Tu!&U@%;9*m93BSjpwf>s zV^O*a%YwzYwbnh;e_}-pCTzj{Zj`Z5b`c#sOUo>HbWm;OsRQo`v__z1M{7JY|764D zkf>VbBu9IV%GDW_U8Y)~AqpOv?CUyUq%OBV@%muIu;SaZd=5z>8X!M^h25`bao*d76A%7I!w( z<#po<%=d*@8S5iR7^GTZG*U9Kwwt;eI#q>$R>A%(N?2xoVwAR6rf%Or8jd~znY z6X^1&W9|-e$msIe91+=GbX;v&qRXSsioIa3xD`<_H0ld(;4Tjnnf*M^8V9o#~b zGZ9d*g)ViW(Si|SPNdBi;!A5cDQ;KU8O>gJdCwhZ43tjcf``!%xs0ax|uB$XJjVIiZrI0iY@Y1T*PIK^oc-U`a-sS!5aRA9giny z4FQ#bU|}Mc%(!4~k|{?0=_98_0YVLn4Q5Xwwf^KW@z7@P2yaUbvP})LrH-&VehTZa zML*7@A3q5FMw9+3H~MHv)r&Tq5+c*AsP>Ua&!xy1Qx4~2OoJLrPq8ynpJEr-$4{{f97j*FlT2K& zFhP52p6t;oicxy=y=@VwKgA?j(pxMLDA>Yh>1rS(HR zfgi7z%zIi_oU^I;&V`W9iKpLzD~g3zvx7 z#KTr>(2qvTL=AZ->EZU$sOR&$0-qp*4&yh{43pkSZNbAE*iV%Y&HH!py(#|?>0-p@ z4RJ-pFK_5>k~q~4OF@5YU~Q|X=`zC`Xd#zk3z55&eersz%6+)fwGf%me1Pjm@gW-Y zAEtvAijM?oMWtOWmRo!XAgcHXf(>pa%w@HGW?|f&2}>vdV`_rbz{Xoo*X5(0_jldX ziUos<97Bg3r3sRY^dW-eYCJEn_Gm=YnG{35>1QgZC`%ZJyo4(3Kc=>MoIkm4@<)WU z-v|jAa{y$&IdaddjSihLEq`q)K1$O7dq(oTx}(UGmnetyltyY{<(r&97PMtAWIw1l zW)N!2oW%qQWipYK!vtjS=4C|ug1Nw|1Qe02^dsLJc##*68Ygo86Gm6)4ID_O0ueZv z!6hVj68+L_!FvRHgle{NWh zVlXi`89##?xJZ!ojUYXZH!Y2)TQ6$yMyrM*N+k@Xlfzv{xcE?;{|KZhYM~ag7R*0P zqS={2f4h3?Ms)FTl?=GaZW<-!|P(Wm=RNE-y>;`F_7O zT7f;iM~NkAOQlk1Xt#-P zBDGWAgtky8%6Z&E8Z@7e#bU5ckMG)0nl9WBiZw=<}#%;79Rd~Mf9V*N~E=3hAoJUp)3pnKb_Nd(4Q1Q{R1$pxd zxrFFTN?0=&S-CI@fLi&59ChJElQ*=wVB(z_p}9rpU5i&G>o;M#4${2jO_IJ0<1 z{pBm+%+8tqZS|th^uErA>FCO`y`aa#Q|sR3y_)dbK8?q4#$MdLx^Po7Wz{e$M>N z#$f;jd0ClFvyn<|&18q;LJc5VI&()&ovBupF}g;bNrW^n3!?@Smh%9ms~sxBxrnBi zz}of*w8mwS(i$er#;9RJ;&H>o3+ns>ZPPk#U+4-s#;t}B3*CJJfG0t?XGa)SGMfL0 zo{!q;qvm#6OJh!7RA4^9Rvn*+h95J;%hg_)+kR`tL0BXUTF*%c3Q>*2G$)8+(x-L? zT7T`erknSk)|HW6lj(st3~?-p8ppIqIekbJ+x4H?__n#5G8s+AJsGqRgiqT&vvicK zA$2zFkBy?C!67s}6Z5-+o6>Q8Q}JQkb|r+0dq`^&QCU|GQGzH(G=_1wj-kbd;$O6E zodm^oFVnZDaf|>_qt@pmx0UJ8M*Ly6w{X+eOo(X3gN6Yi{GS_t+pEag)~KtIP_4n- zaj4p%LfpZKWPqC((UIGq&fwA+>Ir?yI((mml<6MF=!or4C-e0YJtIDasZchqdl}Gm zFZ7d)>sIqQkx|>9_8Hg7tZYAe`_l==b-Vo`+n0g3P8#nBPN;pJffSR%#6w&m5XNAS$XOD@}q@R?+;-ri!m6l(KL()7UJ%j+)Ie|YsoeQOEY{f zmb8wJ1wtg27~#;tWa1|ea(Gr3Se?YT>Cp`*R=0LiwaxdYz47twNvP#?XHae2FxTr1 zW}{(a1KEi|+&5QoQZOq47z0G=dZ=&l$DxU(tMR;We?QSQFc^pAL<&b0B;zVAVUa8i zRfD)MOCy2Av{%6evy*~XPogVODu^ESRACZsCXxoGrHK#-985+U#tzvC!)Ri#M-6+I zjIM*c3>?VeH7QJp*%>TN#AC8c=d>}T*)Ebpqd6${51TDuD!7?_rIiHnLHaH&FogkK zlsj~z7(eKk&wEpO%$kuxLMEP5NZ^EE7MeQ7#@zdEN}^y^o~9rUloJX_-lWjHNx?#- z2xlNtp}-fKn;6VRTA(5z0SkgxW9JDvpj;|#2rRsi$^BI03?Q}nN|Hm2r z8$M^}1)H^;N`NnSNSR$3{HbYDLYBTG6=t6rYGHEKn`v_eJH#!b;ZxUYEgb zPJ~*fh1yM_qBjG@jb(eW+CWatQr??8L>WnKEHyoSGb5X>pb`VGVrfN~N^f9>rwP|$ z)umoq>xY1LLw&Kf=qyaqf-|o$qc2exoOy+LW^tc(GhJOj)^4U_!TCb6Sll7YoyhaO9}1CS!P_d|D#wHxTXMT1M4KHGsM z+>nnImbllk-avm>U1?GqI`t2yAK!oG{R3)3YUAMi1Pc1NdZ&dJ-Mjg=Q#bmpnfb>@ zZF-QCH~~vKc*h>tgecVE;)G!KxR5_V8)pH~FwZi`fsz=;0XU6u60}hw0A05ZaV+L- zBOIH3%K*n_-!i_j*|!XDZ1%M(b3F>vkR^kAfR%7~$qO8Mqg8qdwqFg0Dp<{h}2^Ap_g#x2~FT^CRlC+A~l=KLhOLEM?@ z4MqQiE=G3k;z%zLMK@)w-GyXwhG$f;sk+@Rv!Ds*l$J@640F_w!aJ)gZPg04l*GQn55{9oM z-gF}JT>Ojo`0!0<>&AF4!FMkH#q;+yi~{(kdj;{Huj6|jqbKlP$cQ!o7BG4Z-y{+5 z`EPt*$LJ$`(`mEu9@^~uG@}_n`HXG^x`ojapb~l~gxpG?1#Ec(kT}2jEcz&;69Wg}9UmuXLG9BnVmdgYZR;q!D*vcB9aeOtP zUtJQT<^JtD+643kmb)KFSa}ZUS++t)<_XjZRLR^KX!R->T>-R+(E^}yMggEQMjL@d zS=*|k?*WN(%l83^(0&PY0W@MfCv@%tugBwKZUT^yqpf~*YXTSvM0%gpmidjJX1!8b(Dxw=r4>RL!UaXbGcQpbHtT z01{R{0eT)>yr&n>f7LVkB9h`FmdgPWa?5}cnQPR!9YAzoK)mO>KuwHZ0J@dYyFeGS z#_xcHm5CU8-N9F90IgPh|T z1!%UCn4173G_C}?lP%u`bSYoGSHJo)(A|9XZJ=gGr-0Tmibd0N8BmO8EKn|UX+Ym& zl!T^7_?!zQ;?V?j7hin{=t)Me08Ipn@w^5kygC6iiMcMFi$t?^Idj8+gxm!{lbM^K zbJ;-8fQ$Fc2fBi<-UuZ8yB%mRU;P$PGGF~3kg#_MD22J7>fEn^Qkhe9E^>@^%-t{` zp_>Hs3|pQKl+GHNKqB1dfbQk19|BF`tA7C!x?|C-igfuQn#-wt^%Wp-^&OyT%>7#D zJ^{*Ljv7uO_XVJ5z{Ptep}7<(o(Cjyp$X_dzWNZ5Nc$fHJ;mHHpcY1d1DXzm_colZ zS^gr>4CZolZW+)_<{EYGdqA_8+oyBC2l^s&Cw1=f1P`A(k9RZx3GcrTv=DOfp5bU# z1u6yF!Q34{4>9@<(1UF6KY_l%+}l8pF!~G7V~ob2`TZ87$w0dqWddCZ6yv!HNQAot zXghN?K-(DA0sRM~MxX~6tpeK0=+{6yf#N+2(R6>4(YJvzfnq#Q0*O5TFa7FJG~y4l zTqDpGX?bJc7x{ zpq|6bOi#Jr%B1bGGSl|U%+%!6UMn-z8zEVqnvzQMBU4yYQ>G?anAGG9E0a!Zyk@P` zjD;2^EtO^xW|_2Ut1L`7OzMXM=n2hN(lQZI;nwpYQ zWMR_NDy_`4Mk_OYug;j?*Aaty7!^Us|D1yo*EZ%FYGBn*hWeM@L4{1hr%+{Rej}JN z8`A_P6aNgYjW!wTOUopg@7rX4V`HM=q4;Q_)7~1H$+0oF+L!>C0{k;Pq?#?;p?WMc zuiBWmZ45osB5Ms1$pljKdAyC8X=ARjF*n(%sOPK5wCCAWcJyZpW7Jw+h%%f zGBGHpJBOOXqQg_$C1x6!IIkv?n0IX|rA<2KmsILvJYdp@N!1zprM)Faq!?tl7`Cw; zRV#&hp~obK`rU`kOe)FHjF?L}Fy_JVM|`xrxXZ@SN=q4QX)@on$@~aR@(8l5$-F~a z67!)=>lB!FN#-2XNZB9zyJhCuWato9S*r@n&NIyZ1i*Ai%wu5UMw(@QXtVPUm@-M` zQ=80aYKr)y#r;wnGY3proH?weVD?JPMlhR4Yclq?N>dPfA=81mqLI!&BRiM@8cYwE zGR)izW-Ky%uf)s%(<3p(V3IK`GPD}Nlu673V0KE(0WcjB^FA0~g4s?KYCxUDTm)vX z%7{X76&PAVqtFFY4<=b>w3;#=^DP8`e_Bl$VrF=Brm&VOGlf#^H8V4nm?zCl3JKBN zk1UJO=_R1zqvh#0ZOpS^*0Gl6^G|Iu@7S2%+nC{~qdv^>jJRJ4Mh>0U$_g-BGh}YD z$*iz38^P51%v#^E$-D}teY{!bcVLn)G&9kt{p%#=LNJDhrSy8wh9xxyLns3>n?{F8 z3qJ<4mSl8h3x4q{boit@>w9&y@@H*pCy53ZSv+3w%ywdA%a+lNjcQ{qckddy>Us}ApI?Odo zAUH)Um(K^43<$q<2l(Aa;ssFiajF-`*dijS8>wM>{f^0LKDGAR+WA%W)#WvsLDgyF zL|Zik3t>th4>DGOIs zEr|JnO}V+LN{K;rN95kaGQ=RHQ5mwW*dep;=EIir%7M1>WjdbH#Fvld2yHVk}naS z@!Qa~z9P&>C`xxx>P>E#UzWx+(wSdlZjy0$-I$R!O?7oOt1bQ`ZSVrL@Gm(N*O3BL z$4vq0JPwbo)UO$Fqw7_x8aXNTx73NG$TA&@C|k^GSiM}lECni{QT9kmEf z%wE#8T)g>E{4T0(EU(e~5~Co&faw*8kOd*>7B9cmY^}Iq@$6;GOW{jH6|m5q-&kq) z3sGyt%NQHxRO799d|A~c@6>DIweriWMbfFwjrmn@tR;BZqPE33Vp=E*%BzI~LT7G+ z@m9HcRTWj$E2{c&-@n{?QLPu6bxRzwmY3J8z60-2Tx2BU>_yAxHLjqe-J9wFQl?sT zw9?OS!mF=c#(vsmj7p>l(mV9@*2u_I*puI`M>gp#h7PjSPK15iBn+`HTsLWqgh(&0 zzSZIyX9CV^wa{ws$hvveY8fz`)CW6q?QW{WY1CB+2Lp*JdK;zinF^u7&BnVxMV1=& zMAw0{yY+MJefSJ?3VwR()F~wA^BHG%zlsUS3^7vw+|TZwhj51J3ne1ZOiyN}`8B)D zMqslEunr7ZXd&BdOrgx?2ptzkrtVVmz_< zrWJ-5-hqWlJP;Oa)LlAQ22uC*U_!q-F0mym`-+jks0-zjxQ&oxKyU|!;0?NZTmY;x1@Qtk+KxO#GVi!;)zOh&a zvKw!S1Vqd?;0j?g#x0g{n zzNyuS@f_uELdSqa%#QZ z;&&%WJw{)T(3kckfH=w-*JakQu5EY6gDLdv3O#5vPm+y;1oUxS!qT`+{vORRHr3*> z1nk|!Q9UQ+{n#WGqG;+56Il=NV0%fM_(U!|=Mbko7{!l|;J_?w1&(dY&ZGt#+fDhY zjANnvV{|+gwvz&SvEiGx3Nyq(I&_AXM$>NjKr7B85-OcylfP&C#DlN*!U#XJkB57r z4FbX8aS!7+_P*nx9z2k6jIEv|eG)2@zj)pcgY6LDzJzaqa)7Sjt3^6@BTy=H6*{+0NB07e&3N9mGL6yq@tuKxF&-+v z!tzgmXu&ex^Cx^yXY|j!3y%OzovF4KiiI}yqcPWN1iE9<-`Cri2W-qUHs+X(vESjE z5TOZaVcG9+mD*&QZOk`q%mEwIVPmv&q-fwFVybO2HkcXW0^HPOifjzsPZl3dW}S_B z(8lbwF?2s!wqw6n^)Y0kRVnO|uXTC=`1UCu8Es$N`* z`Hc2Ryn4N*N`#C zd~)*CsZ)KvDO0AUB{NH_978?lzp{1SWzS;LpmvQ;Zz!9DPDlDUyzB2M1a7v-WqRVW z%^fJ&pq4mA?}mx-crxRXGp%wo5t(9>!)iz)*4|l5d~M!=ZPJi??P2jd8kko(EOPO< z{AXhf#lpTgtcFz!^xa!O6 zSC=fit*)X(ZDdPVWlSwy(SUtv86~KP(54sQRn*p3ElQm-RbLK?KoSk^ErgUQ^!y!t zc+Qg;#KYnKj!;W3@^$g3=SMH*$HG;DPpIh#ZlH_06ol}A<)|0@-6IYz#(8QXSlB`m zc*c$%sNBrb^vroj=x)Nn<_vs~dI4vG7I#Ex#)2FqE7N6q@;twTCyjJGE4eg_=={!C z{O{wDwq8npdLpuyALYYSeg)z@3*HLQ16%(0b(dhA zg*%n=NtM!ueWSBednUe45gOitDWOfx7UN&#I>Z=?7GIR-!^l~Z>Z@VI298KEX~OUP z_t|kHd<)?+s>+Zso*0HX%PEcI+&*%Zs}$kF?5aR~nG8~4isaRZo(wdMr@YITh%n`ksk+$hv1kTnm;!dQfol-#2^459#)h zK;bFW7^Q+NnvP!<^k*o{Ze9P>Pp-Rn)K&(qo;l@xt$Q56M3YyC$f$bHE2sN3z+gqHW#NrYZUd+TE%uc)`9LU)#-sWUDgWaAu?#|F>OV~iLf;6O2Obw$!&}hGiXb0 z3+k>+MBAZTb6I%oEx$64EK-MH$r+a!VM|~of($z3jLRrGRYOayQy#ujO@%>si`K^2 zQi7FP6v98!OBI?<2>ZJQ7*P5~^fG(~d84^F~5);fXP&V#cwpf_&ITRFMl zuAz*wR7gu9IeXBS+!m7Oa39{OkPO&=*~fF1fr4`5=`-!NpuLZMIj1S}E#=B)Rr&Jg z7?#_T_Az!_aLYEN|8n&6Fmi57$yZ6A2CG9XEeDo8u?~v!-)!qbo!pUjDn(k**1ktB z>KqGcu&tcyT2nTqyoY^SY;T|--9~>i8FU!++0#R=Hp&9Gif#*d3>kFOlG?@!mVu!1 zQtDtWxhe~DdtgR}J6y>VNN=8{hi#YiqRP7=1I7;9TgC!9Db z4#KqCqWEPBl17Fx@}SgO(B_Acb6bqYl0J>zVk~Xk!0YVCuzk%{Z5goZA9%&E=5q|o zZBlh&)2dUUx2K(4$d#wuD!MJ|w~#?MMSZ{~G=9*Q+!o|#EBNyRf^|si4Wl%1OdL2bFb{#M5WmZDD;HJ3moa1Fb_XqZ_&PRDxmT+!nOCq)#p8 zP)mzB@VfX&5wz@(s|sdQ8L%&T^fFEko8lk{TUc(B>U{FSVVq-6JGnwBzrEC1Q5JL4 zZ#^_M{(O!^64G)!mxOay?eIhEbHoxVQ|^a9lHJOKz*XG7gcXLEH#Sb0{|e%7HL) zZYyFl=~G1xIVp8HQT zYODX}{%?dideD~Kws1o! z1Zv^%NlvT9n7&M^4oeMkk#mx;3@?<1f56i4{?jMn^qF>>q>qo~B$Z1u7kFzL z%OXlm7)4pkP1U(@(3afRrB)nFz%^xL|6RkjFmi6|!9vn^C}e>HBm2+z3&JScO6P!8 z>@7Ub$yISw{~^*VlAPq+mYZdyPd&z{&s-H#MbHj$8^GsJ;+&J$!O{Tf{nVf>xlNyZ z3W3rm&XPWI{ZK9rBj>hg{}v}7anX*m6zzd0@82O+htd3iKHnZjQI48p>5xT~ON6CB z>*)SdiC$60_AGL4Q|X7KPfHwld#!X^Vc=9+FM^gGck;zDrBSX4qv&91fHD%H#ePix zsr27C3W`0m$hl3W?WFH80T|tX z^Y>&JOMwGp`&VpotLV0&NF;;QP{jA2xqTy?<=kfOOQcU#Al{Nk16P4&5wxw~+K52w zSaT$lT=$BWB5SQof5&lcNF|352S~Ob3&lX|nP$&yrj&1lk#n28HMPT8u_XPIexvMmcE=QdF;Cw-bSo!x(XGepQav~XwjuXtpr8bCt-a=V0_LjVJK zcAFN!IsFGPJB*y$29jPpVymy*VkY!orRgoXEO&1Ia*u|Qb6fQnk-kIK4;(z#T!s{S zTZ^;YIc7PVh!Wve(QV2z4QB* zqj$k`xEJ&rQQonhqMwg6?M zPh+dg`>)6un%w06<>JD~xvk&r5%7mPmn-_O-}IJ8CpowEdkN`N{Z8&beKR$=l>X%s zG`ZCN<$647xE49L`L&nyDZkRq`Jimq=rl8JYmd7cS=S=uGH<%3af07u&X}%?n7h%; zfswmpyvrp!4k>CK1z! zTcHOjl@?~zb{Op^N#sPHk`J%zj6m0-+{|G(9S6YIjl=EIA*k@z6(Y=l>ZG zwbSb~!dA;Hr9z1wv?VviNqIbr3s0a^KdFu?t-Io{EFop;IP`;*)U+MA?Y~?LS3lBB zgljJb*5dwArt0xPnrVo03}*C2r7`Toulz>EJYnKFUpj zvA5*PA~Ht}yd^{2q`xg)m3Xq|kRfhj=2YV>6-?R3XSWTyceA##mh!3;^TBO{?d^<5 zs?^TcO{|so=zz09cYn4RSu5P#WPY&yp)E!hLP;d++Cg;vcAHMQtFLH$hAvcjdKN{< zl5>M1+!S#on}V}NNiTXKnY9+LkjhhE;$yM3-I~|qg zP&RCxw~eq3%Pjq#^4RG!?W%mGQFy1Pd|8T<&8pIt{`rOFs({TQ2dEv>kC$^UKIey# zb5%I_v^E-m>u1ZU?S#X#7V4shcDCHN=rlB^K1MFyEFvujDK)M&Wm8I;TSZrK|7|KF z;7~E_i6PevWsh4$SB3f(vgW2x2dqN@>v%YR(3V^k$mdcx!{t12)dUVg#o85T{1XFr zReHXi>|A=}vf^C6EDI*qW;O5hnRZnIk6*zhFz|tXn4I%E*S;`vu1e2JQl{oYKS|E@ zkaU&^_wIenKo%eg9FKO|+E59{Z~xn8JVFT%A|nL!Y?MRseSk?=W&j>$re<}A|Rp5$CxMB{f zK3FF#vJu65`b@hj{@W&~&4hmLknb;o#vsJ1=5P=W$ zgW@QT$~R7@Y0GM-b&8YnIfmsb3-%^*7TD^%Jx^p2Wn~yeS&Va6KmEyh!hgA2OE%O0 z9KzZ#t-Z)O$^JRs3>b>5mg>a|5eGNJVYwON(TRRUob%}9meXh2RZI1U@!S#wKG2U$ za&Da+NqW zWPVTsiGVUd+c5g{nRZn#9ua4*1v>R(;hYQk>M(MyO6)9BrXjd~T$t-2c!UVoRxAHy z3Cn#*CDU>yoVN4qUo`@*GW0gfX>8hdL3<9%HBLzlqbQ4USs9>p>!h>L9HuJ+TXI#! zgJhoCKm9Z~=f1o=jGU{=mq^Mq|J9FzbG>-4(BWx=Y=W$VPq~LxzH<6ZyGn)gDZD{- z&HpNO$Xe&~Ea$-etJitUT7)e#lrNw2zdVavwQ5@v5KD(9CGdfMCYJL^t0at~LtA9+ z0c8YH=X>=CD$+2mYh%Cn?QMN>bH%yrRRCBl_Um8$|}8AB+O{{c(-k#Ek4^ClgB zHpoJ5G3_cnD=0k2LT*i9OCi53jG`>&*ow#^O2-&y7i2LfORnlqGnuEUi+&2{y&p4O(tbU=q&=lEyaag`EZo8oU7ve z3@KA_)(?1dJriFk!j-*oM_&NmN714uguo2l~-&&aGsc zPz-#apIYTCHzJIjtJd^qmP6IFroy4d>*u;TH+Jj8SPCfm(NfNe*SJ-5)iV4|9DEk& z)K4dK&eONT$hpeXZKO=aUO&;zb+Nx$glj9THX_iepXf$0P!ioM4p5xm9?r$yA;baF z>=B_D=+sYib57gUVdPw;?JQDus4otKaH(R*$GK^XYz|sdo++=<5ov=6&ZeUT25rez zO-&^84&xq&nrf|Z4rjTk^}Lf`a@47`d7V=s@PU4on{(sy6`>gTKtIckIaet%hLmX*q#u{&+`xP=)H&q>ihhurv*Oc2F`(!NxjD-P!v-*bX9ZdS`ay2a z0VIWybJZet#UT2Q^A7zKH|J{nj8F`8>ZiCl%WViF=c>Brld?no3w)p-;l?HE;;?f1 z5pK>!tb0hf04$2G%G|?bjmn&Uew%ZStq3FMD#xaiGL3Ha!`qw_ezYd1AKvCHr$npv z^uybny^a{A$I&T`F~oPKzlv)m1uoPKzlvs{WMryt(tEH_M((+_WRmU}N! zO&9&}HfOmPH97t8HfOmlVdPv@{324OF_eCCn{)l0q{-is2hmmttt=l5t3{`9W z*f!^C{mn3PuB!DSQl@IHpV{V|tTQw@{meFJxiOlYeioav+y@>tT#KBmZ2BH4Q#R=b zwsCX(fJWHXrLjCyg<>6Vu7L<#Q{Y!iU*2dlmO&mG!Ez#e#CfuK!0bH2=q5bNkDy! zCIS7GQ8Lh{jM9NVVUz*X%V-wR$BZ(8{=z5+=+BIDfle~Y1Nw+j0nncq6#@N`(L$ge zMkPQWGAaZ51EWfy-!obQ)Xk^{sEbh@&v$}1O1qh7w8b9SfC#luLK;LCl z2lO3AjX+N@S_QP5(Hfv{Gg=4qEk^5s9%s}7w2RS3pvM?(26~jy{XmZ}+6J_f(GH+* zGTI6BFr!^S-(a*GXa}P`Ko2q63-lnPeL&k8?FZV%=p~^4VAKjkqpcXvAs}keVmya| z?q_ra=>llp#x{Hwy=uSq7Kx-K# z0j*&)3Fym=l7a4Eln%6-Q3lW|MzercGRg#6!6*l)iBT?4BcnW^21W%y^^A&uZfCR* zsE$zyP%Wb}pyiAzftE2^0#w7O2Iw|MbwEoQH3C&LS_QO((Hfvz8Lb0a%xFDO6{8lQ zN=6%jDj01BTEysnpmIjrfXW!{04im)6X+I3yMS(Hv>T{|(H@|i80`hRk;@IT6P zC;p&70d)hRX#?s3x|-2Rpt+2CfpQu30bRw2jLl&b4diF!1 zpd?0XfG%OQ4rl_S^*|RhY5_`Qv=QhcMw@{yWOP5!ct+cRe2jJgUBGB3(D{sZ0eykd zZlH0D_5hv7XfM#YjP?PY!)QNH0;89J&SumKbQYsSKxZ;K3>44k2+&wY?LcD~9R(WA z=onBOqvJrM7&W07o*ha0uL8vb#dtPvgB3>i1C3#{4QMo@9YAz0e2ix&&?rW`fJQRf z4Ri*hJwUOH_5zJyv=3-Fqy0d`7`+7KWz-5Zl+hue7)FPIhA=t;M5`Jxo_3%pMn{1n z865+PV00YF!>9x3R0L_90Qx(lPN2Ur>IUj#)C2TaMkj$jWz-Aw38OxsUPja{eat8t z=r4@CK!0Ww3v`lE9MDIM;(`9eC;{k?jK%@=F!BL?$S4u$4~&w4e$QwUP&cDwpe{z~ zKp!y508$vu0_tRx3G_ar9H8GZ$_4r@qdcG!j0%8$!>9=8*Nhedy~n5osDn`%(7TK( zfqunk3D7SY)c_r5R0s49qeh^&8La~PZ$@i?jxkyX^b1Dof&Pn83(#APHUb@Gv>E74 zM)w1~!Dt)M>x^~)(R&3@{(yeYXcy4W80`jnjnN*UBaHR}{glx@pr0_>5A-Udmw*m4 zY6YUDFN`gKUSV_?=*NtX03Bk~4)h~NM}ZD9ItFxr(Q%+wMjb#uWOM@P2aGy_US`w{ z^b(^Up#Nla66pJkdVyYK)CaVm5e<-DU=$7XJR>jAbBtnv_A!bBdX`Z<&@+q@fSzVF z4rnhUAJ9{b5`ms%lmzrWMw5W{FiHmcE~9jy?=Z>$dViJ;-Pk z&~`>^fVMGO2lO9|)&o7js0C;%qm4lKGujOFbw>9CeT~sJpe>Ac0BvTp6X>gqb^(2b z(QcqkjP?L+WV9D3#AqMT21fgVf{b1QYGKq0bRVNbK=(2_40I2pBS7mJwF3nh9R<3Z z(J`QAM#q8HG3o%ii_r<7I~jEXt!2~=w1!a+(3csV1iFJ!FVJd6eL$-i(NKLQqiCQN zjJ!ZijADTr8N~rLFp3ANXOsYRJEL(xb&PyKwTu#hmNQBMTE=J+Pz|GGpxYRw11)8g z0aVRs7SIw#nLxKP$^lx;C>N-TQ65kwqXM7`Mnyo27%c=UXH)`I#;6Ralu;$nEsT}` z-OQ*4sDx1+&`pdQfo^293g`w#Yk(FqS_ia%(R!fk8MOcvGujAL#Aq|nd`9;J&119; zsF2YPpaMoafv#h;3+P%#yMgiTjG zf&7e)0Oc@h2b#_3C{Q+|V?bGqjss;f>HxZu(Fve0G3o^RBBO4gS&VvsW->YnG=otu z&~!$9KpBi^(m0J#G|*H=UZ5$AVu8{b#Q~);iU&$%lmL{%XdF;7BOlNej1qw+GfD!w zoY5qpNsN+#CNfF~x{Of<(4~xK0VOfY1iFM#4$uTfxj+{)$^%MdQ~-1lqavUS87%}F z&!_~*$EXbG0!EcU=QCOY^aVyWK;szI0iDOF5$Ie-tANg7v<4`F(K?{B8LbC8i%|>E znT$39#WTWt9SVc_eIb8eXdS=#2`_swaV^Xh_l53`jYeaa6TxqT$*ibdRyVo2a@eZ% zo>QkVK=WiSt}1VwoJ?u0GLtLot122-(5%iwY*Yjd?B&no%Bn?8wb#Or)emSE3@kB!o|sXK{|9MUw;ikPNgMt5!Ag zZwy57H!5N?5{d?*6aH}Hx6}*xYD#!OYP7$@4qR0d>nXxAOeJ%w!PrfSH+2%yKi6LX)Y<62lWMi6N(7!7Nh` zD}|h<7hf0*IlV$+$myvPLr#yB7;^e|n6(;q$mt(Q3_1OPnMoy|mrD%!JV#>4=kq0o zeEtjO#d=t&uX41*$H?dZrTTUmRzb-N4 z^KBACKBr0y`8-@=$miFy&6dgMCnSb^u9g_`IZI;5=gZ8@6!Q6xStiR<$mjbdhI~$y z81lI@)2u~4KP55b&uWPwf2KQ!YS0sk~DV7-W=Uj;)f8NF_ zjA4h;@EM7rG%S}G@;OOj$md^S4acxUK0j<`rjgGpB!+zcqQsETf172pGmU(HOJd09 zki?MB^CX6RK3ihQ=U>b;TPB~Mk{I&2%FJYt&yysEeE#DMlbsCm`DuwEpMw%ZK3^g+ z}<}of1Pne@SA<=d&b+eBK8a z3_IlWQi&m-QzV9b{sCx13r0N^5<@VET_Wfkj%j6 zESZ7NUYQ}Ev07@f1D|WLYHDKObGppH=aZM2WvG)oA~W#$2AP4+f4@}Hg3mi-20qV| z8TfpT%)sYgB}sPR^TRR&pI68Xe2$VB>g0A`Vzxt_+)=NS!)`6UMe$Gp3jwJ;Pa1U20jO520q^;Gw`|d9LWxR z-Xt^d`I7`m20pKm80rYml^OWlezsYQI>NhT20qV`8TkC?vm`C}{F2PT=euPFK3^p> z@Oh}rz~^_*G+U;Q@Ftmo&mYE1GVpng%)saIG6SD~I9Aev&rLD|pZ_#Ql7Y|n$_#v- zA~W#0Z?s7(mD>0RWd=SM$P9cQA~W!LUz}tIK7Uze;B%JDz~>m5fzPkt?v36)rzXSa z`7#5adqp9^FLKK~+C(t^(`WClLR%M5&eaD=1< zpED$e`oXt`n`Khr^Lm+qv4pWBB?TJZT^nSswUWd=Tf;FYxC^In;O&rLD|pQlI+ z^@DE?HQS-d9z7Fb^5RC1s>AUw26U-v?OX`;2|xnnHYE&BQx;uLyV6N8S3MHFEj9& zw%3tNl(de7OvE};Jih5OW^xcE5s~B1GWBnaht`qk^Hu!oxR&ggSC-1RnL{VJd^3Z* z!A)EAVvd??W)O4KN;89)V~lNP5ObuMnL#|UjA>?gW$CvMn8Hdy=6GI~ z7-WuToy3sS3nhk}PL>#Q`lGF8%TvMpRAR{K$0UZF{<6f7)AP*?uPjZJ81gwvV#w!r z?l*-_gKp2W5<@t(`O__CJLK~lW`vhWxoiV#uHFjb=OK&r=dZX?UN+ zP#R8`81k8R$m!`bm3)3aWM;_c)nc^sK~?&(#t`J|{~I z`TXag*$(- z2@*q{+)ta#c4%d3sLa6U1&xvnm1miO&qo_18TdS3W~O32s$Pg2j_H`}2R^%|K;MSYhU_`JMM(t^)Fuay}1TqiT|d4kNq=ie`vwBU1%%)n>bZLIe@ zDbx}Ec$vh&=N6fP&t)}uX5jNjw@EVaxk_f>bBxTu=a-gBTJU+f#85{# zMP}ghzG}19H29n=Gw}HgnSsykOC&A$yjy1AbB4^o=U?6`X~E|_nSswgUu>44j<8N< z;PV8TfzQXPBrW*-O__nug)#%56J!QH|Ef~51D_w08Th;wBYljG6SEBWClL}X}+WdpLa`)2bqD-H_8k=ERY#^c!|uw!@ldJ zu;AhEWCkAoTw=oI z{ByF3^NLEd^5$N3ZNC57qRiR#)mb$)wH4)!we^{qsaI!vuAF=A^|+o>I)Cnse!4!V zVQwuhmD07Gs)~Zf)pb?bsZ*xT$;@xMt$JBCxZ299*|qgmnVE%I{)G!~^jvvWRbxSU zO?7s8Lse#e@ilYv=OWBJzFq(kNSH0n8`x4&ZJo2BE7DV@PWKs~l(dW~Q_`oUPER*D zLYQ()ojTR$%b1dmZ~BxC&x;uDIscWd^R65#9v`9vGw)fW-zW;ajhV3i86F2YW8WI_ z?fCargf77#(-W6%-n&L*H2ysv$(Qx7%(&!CtDF~CpRmbgW}5e>k%9GRVEzTUDRIKw zZ2a+g3d*culeH?ZUO`@agaksU7;4+ zyt&ykE^KP5uAE#`z39SlG$rsK@$Vr1t@lJwd^~kCN*2`C-&Q(%-rSM}^Gg>sRo7IO zmesOa7 zyRELGWL{NG6^eN2s*I_nD;m(7XOzrc-Uw}~5f!KrlWP|(#dA`#M$@w@L-`q;VXGqa zzxmY_^|cMPiyM7O^DgyWSJ#N@bVv2_TYa;!xw5*Zsvf>mK{%y;Xjf*)?~U@uj(XlZ zGe53zNZ|0PuA4%|-l$?w*%34SDtA>V-y4+=t}t?DvC5@ss<~0R?ghGTw5~Daz^}bg z2ZPuSivO_}^oagJ_#uC68zm_Y42f&w@(v3KIwsJ2R%2w>jj)11hXy{SUwH^|)bqLC zz$f(UOG0v(kW3bm!-dF*1MhjGUWf5uoZw>xe}>A(1>@id#eeCUOL2~fx1f`p2pq!6 z(S6Np`)CVl(@;u{Aze|r-;iH=-cp}g+#DUUxAg3#Bm2F6?$UGny?)Np`2Mc*&RQ)I z$$#2uo8QOY%ZZCrR9i+_cpKXrTw{U7lrbBL&bfsp;sjP z;!)3!UL1r~jldCjh@x;pCn1D3VAKo#z7Yo(Q$qj?Y&md{@>irhCqS=oFW5W_4vcyM zJ{9*yag0cg%daVeME*#{vA50NrxnLOE{+K8B;q}D3&m;eSlHQ+-`C=WVT2wm?(O<7 z-J&_YC>7y1GAp<_L8OMsXON;8tBE%1`N#tuUZmKFW)?2)3*OB@t96_%eOkKoHSedZ z+{&B*tv1%8R$2E&Eq~fhdXBp0PyA=`hlR->29Exi^4BrEq|Xu_3sZOu9K+K{Ek2Vz zi+vU*`wTQwmh=s^&{a|1$q&7}b1|oqFb~MuYKF^y-)HfUg~>k#j{Xgl-ie8?LQb!SN?vWBRc9Zs(cH^2Wl_X^;M~@ zH`h0lzmEOwZ*M*r?a}&&al!n~kiS#whH!Q>{8fK)sqEBhy;-Kmg$$xLpdB>D4l-y2 zX)Hy3vf2m+*7il+<)hMHw5fY$ad+bwR!m2lVnEQznbGxnsJJ^=d?K*+#JExSy#WIu z|A|r0w*YufC2pcWny9kR{Nvl^9}k*;kdm&m&h(>eg+_PP=m-M_)suxfx>iRyI+~%Q zWF1Y=(KsEA(Gi+vVL9aQrY1Io@!e_sj2SZ~V$7Jxs4>xF#taz~Gt@g~%&_4jV$T>k zDsD6tEcK)HSKNQ*#|K*|`B5q{;0yAw3w@wkEoe}OjxDhEWc*4Ds!xu3{%-R3RN_7K zr)y+aY?l}R#dJk?MRpwy<;Rj4wh_e0Ar8NS)OR7S2i2Jz>1m%R%<`k6P-*Z5On)Qc zqpAJN_XbqOqm!xG&U9{HUiiD%i|}1q9@!I${18_S)7_??WHN%hcNy_qB1m z#aA$vTt|&2{~$36h<}h6Re%0rZ@0BDjqpMop46E_$b6l9XRV^E2F%yFb?fIkx9|a1XhP8vD}?r?dk|LuUNT4xR(Is z0mXPG16{*tDv*z_&IY=GQ324|jBW1c`Xi+8J^DNK=MlS62Q-tB4+!gZ(52JIvl%4;TjzvGFQKvw&tZ$^^QaQ4SE+24Q(C5Y`P5k0*iVGxr?OJVu>Bg^ap^3K;bO zVRaC?CxNbI^kS?yxhCFYsu5@ra-*p|i8ir;RxedDlh`^hijIY&#w1qIl6Kp=IIt+h ztnm3g0@{ucmB*r-RS3IEpNpTT?! zzbL^B<{c39jI6=X^SA{PLr+`RNlXC0HcJd`ecUTC@8Vah#L%fJ9XeCGtZG?B-D>g( zA6gVPFA}2uAXRCZkUn?s+<}S)b^g#PwDb|16wO*_VxYx~Y(QTdwW7k%TBvG?1!&U0 z157gh8FAl@Up{20!TbVDht8P8LL-K-XyK7Q@;1s-(4vo*<3(sZY*0sMSk490DlyB! z#0@daJOpN^#Jol_NE~6u?9VWS5*0xUob=f3Px2P-Ey zEpK5bhWar|lqi05oV0S$z6%CFJnevW%&4i#F>O<2#KXWO_aigIsro}R!zuQnnMom^ zsi)CHPa(Blogu5|q6WmFmoduNEHGs{W3Cs72-60Ko8Po(eq(uK zb%n#NtNB@17i9adz9!Rjn`=RCKjI4^o|ScVidmtkwz0fsPJQ{Zs(utH9J5k>`Km>$ z8>{N7>KA`T%{g@qpCKIF+pD14fc>aknYAFjAS-Wn(G3Ou%uI`)*H_gyRM#$F-n6VA z3)aZZ%}-8oNNw$wqjp1awhI~ZKV@n^g7f+QCCAZv+i{^eUX=LaUT1}idz}<)Mn=XR zRrR&~gsnwHmCjh)R8!+lyt=#}Irq0@iz}8?_hU%&Z+_M7E~Jcd>_XU5eqCrR$n8f+ zN{+Ap%-3lt~V(C{g}}rY?N9T!dew^Av*uIYTVoodoNuJz6du2U5NRYSGtgz z*U(>?T8!gXaQCqudjjl!W#I;XK~`}N-T%(3y)`q_oRSXmsG!$;mOK7hdE2OT$$1<|ED?anwE!M(ll<*+;BD6U?tjX_k&%rLt%KC#M$*`4t>n;dp$ zm`*C9VCLfA5Ope`2J6Z6K+ZVOh-n|buZ0{*PfZ4NRzC#9Ke>NX~R> z5nVq4-)O<;QFXXQlO~_Tu8=Q)UyAg-5C7;xN$IpZ<6`hzR2h<^kCPmQ^Slc=nlS#v zK@J%|xZNH9UsGC{d%%~MZs+BGV!4gnw&g2E!me% zdst>%Tf4%SI?b1woRa2CnLZ;Wea4jJ;hwCzx~k=sGkp2;XQxa_PM(xsL__j{KeW&o zuoec;g5RLSS*i=BV-ZVDBOmoTU{r$C2g{I{eqA` zPEUuK{@4}KX{}v1zyfUwX^MLhlNC>BZQn8^#}+vfL%NuTEKS?s(wc+Zi) z;?DLa`i8mSro#Z6wjRTGaO)wu3<2L1=EZoGu5qvD}*v5uN&kM1z@W6n0sOH7e+WWs?s8q)hbc`;8Dq+#(ta;Y(RT7sI_SED-a$u_&i}GN2GQ2|27RtIN-y z-^%e(cq)I)T{3z^tV|&P`13ie9Gkj-UQLOh0RVm8c>b@{hpHdH`j=%esL@Y1L?Iv# zefZ{DioeEZfeJ|mYqzGM0To2!ctb;j&|UaPF=iQQ#g{^eilCta6}1ILBi_It_476L zud$x`gm%fJt*;!kG4Fz*yF7;0Uu`mUN+sRNFl6WyPx=TC3DLQub@*$@l!4hSF?WF3 zD>1vlv`S1nm=1}dY7z%lST+xvhCwbWf~qMldtN;7dXKScH49qw5v#doEwR?6W$paU zw_amtRjFFWT2~7gTE#cwwF?Zb;tR&ULQkP~s&=R|7Vr!z$o$cmREaTrh-Ey)i*lGg z@~Zh7Rci!WHfvFbA8uX$VO1-ZwOaA(A6{20)dx{4s_IJ{8tXk*8cgG&n#|0!;@KDp zRaRBdM)SFgi^>;aHk_H|F*GZdHgjVT^8(X=R8&{GH=M@z4Y1$uyjuK@-SEC zHe{_Rudbmq$*EpZU0GE*cX?e?DlM<8|0 zHN0dg$!RH0+oyFoOrTAfF}tpQnOFocH0yB`EXSZA3u^`bYr<*J3QePMz`oExD|^uA z3AkBMex5)V(L>LvLb}$j<^+U3El-%P(bjCb1fOUb0})Y^DJ4brQY6vb<%{w31KHqN z`~dS^L#V%*^XXf;7Dumo3>Sggc z8~-3@n^S8yDp*MUa+*_*JQufQ(Dz>N6GB_?hvw8sox#mn55d5_|8sNJ@`e?a^pJ!8 zi~@BogLy`Q=cr`OG)GOFoSrs0CHyoseahgcsUrD5zi%`N*Hd(6_)t-EmtTiRI6VI3 zjFjZmjO3Jj-wYobqoz83ZX~ySd1Xx%HI7M_`c{@V_$u&JNmZqxNfuGvWqZ)b*YCG0hz3-DDp_!^ef);CV}k z<>p`QTU=Z3tEP^}M}1JOi0`zNl$3Pg&-KLmDyUcTEvvqDNuzIhZKH2dm9MgDS<@;c zTU~uE?p@Wao=jVk)UdF&!C}?bt@d$Co#I=JzOJfLk`aFEGO127!e?DZwuAgl#pC51 zmhf{~Rb#m;XW3U(pZ#zjPg2$6$^LP2`{&KOZr%*v#SN5%+KLJd;%Vj zv|TEOU-Xm7h=zI7T$i|-mn)Iu*~RDkbVMkV;ZolzOSS2H5}#K-UkC1Z7`6P(As#G`Kd zqd%Bs+E!~c1zG}$R?oB7_VdxKG(fw=@Idc5kI1H_OGP3sq4#E)$_y6GXsLpHhhHc zoA8}4;R&ze6Iwj6%6NjxQf@3F$tj1YhKl!NKX}mp5=Dhlu_su3sLkI_@!|9e`uDc^ zJLu;o{~mqKF_eEIm{p*}^a)fOdz1QQHNOePp8XkdtC9H)g=wzg}x*t&h)t-I2ecCo8%qO^l9 zZKI{TY)iMPrQO72_m|yY+R}H^`hLIXxzBU&ojU%|W zigOTAscpLm;j!lj+_8_0izX4rO>W0DicUedqwf(#hulK=3IzR*$usnWKvxE+xD^?TZLY+m zMNx8PrKw!tQ{|NsDKr-ADz&2Pobqu7oWvOrx@w{Eh2*dT}qa16+A&Y|$hu zdPN#C5rFJ3azeLM?(jDy(NYf*s90A$Glb5+yj~NdPmHBXIiaJ{$6}kZt!SPkm2DbR z@HJNSLc!Od-<{CK!B`xF4B31mkUOeoFskuLX*}mf6ss&hy+%1dn()}Bf=Qj%vz0eb zozyvHsE?Tnjk_{3Zdz$PRbC*O#w^;EKPh@PCFq;-CwHQ&kGl#dp`GU-6j3>A2z$`o z4bHKy!bzQXQCAVNcvB_0J-wYvb!eW1WxF{hDzkO@vtuW+Ixl0tD|hM((e3omxzi@8 z%>4&yhHTw>T~g#=@nCjhn&lNclxTZ5k7ydAuZo1P$Y znfKrm2uM~R%9NjE^$}l264m>&st+e3M`O?DE_|uu-M%Szh;E{iJr5vT7*hMeV4v<~ zfn-ltMs(<)k2D_YO@#Kx2BEK=B(E8LT$Ce+pm3S@cfux7eR#$pnN<#EapUvs{j-yy zLt%D%EZwHt2a>2pAChg;&Pkdd%nr_|oEfhMcQjdVR{2b(U40Na??oG+S!rGsR z^e>DYjGpf+IEOUn5N~rM$`gs|Cl*$ZXNZzS-JsKZx=tV&IpjwUUnaC^-3&AKfuXNp z_zykCCXXCMe)l62rsV?rCn!G|IpV8!4BxEC;Y8>t zJ}@op@9=k)ljM>Y@`u+;$(hATowLxRQrjN}%m=B*4jd;GEo3F{X5Lk`5c~Se81RS? z`xYZ-bzTX2J&R!01U;uM(VNbV?;`wA^(S{G+c3nspX0B!@goYz+L%3j>u@!BZEm!9 zEO-jk*6>+2z;;exFDCunOk#o9)B-PhaOA#Q z;+eAzda*iFoR^3k!@PqcEeL0K=HQHU*6PL8uroCkO49>g}XHDw`D8r-qh($4>xsNFXmc`P5G97Y*R7gP&E&FcRyiZ=VsO* z?j%%Z#~Tu*` zr8*0{dz0v)PvCfw#?cd=Dl3%IxoAA$iL%BF@o}34-H&%!uq$_EUe4<$VqLdeYV)Xe z-slT1_H3VRBdlOv0m1!>Eg1NTB!69-201={14M~E42f+9%PSM#AiV8+UC8n??`7cD z0Pct2{8?Ht#LAW3i$rkO4K|OwTe3d!oJ3EZ0Od15l6Q6^x+J}=k4%@V)bx~`J3)df z%RK*9#KX5IzZUil?A9>&b1E*o&HW6y*W zKp<6KDmz`9klzgA;R+pZ9CYz;rGDjC+IYB1zjEss$63~n8<1BVWOEZc8S&*IPD;ye z7X+i)h*dfQzX`{~wfdDEE*`E=kKdRczgb6MkBW!e^sD4OAJnm~VmT}2Cd!JMdet#C zcg`!nySEtqhEw}EBBEoXKE~zx3C3PeX3aB;j$7M|rrxOGw;h%cWWFPrJ< zU1t2p4#-S$KjLCmM{aVnb`gWCNjUZjPHcamCB~^77zxClFT&g(n8J~XwE)d4Yk^+D z@);>Ko>jJm*;-coyI(K|Wx@FJX`URQf5%2xUf=XQir)LWGsAjjX{>e5EPW-WTUqsF zA{j=?IKQ4qRJ^3r|Hp=TT$RZ)u(0B#?2hy7*X);YhQ{3fgv{+I8AfM`obREG4UW*N z#sUzSvGWKkqIwjZB~{|8`mr#KLJ)+LN*p#?3MfZ8-%~O*A<6iC3=Hh?TaQ8|lKgd# zUyiudi9JMf@OEC9>}dqdHCB`5x`Ihwl=ue8edD`FQmAa>mQ5JOm!UZW2}=z#_k0C0 z0S~K^;^g7$xD4&Q9lZ+s0q=Clv+M0BgUtQ3#R$lrq`(i=gxg`L6(fwmfDDib0zK2d zxOWA)-8PYxKs;fu!bX&qDwp*RCLR)%MRQ(BgbL!h@o=^XR$&}!f`0HGcEs1P&*K8R zpr8*cHtbbI*sA|1t%`A?mQPAc&?oxPbw};)m>-`MUrs$&mz^r_ddQ)_yhym`$196T z>Z(79=)6mxVav=x{}M?8U*3xh=@}A-^~q5p(X(*r&Ky>NGPwZ1Z6kY8cdEazVB@+A z;CLu=^9J2$7bSaY)4R#=yJ2q0)hm+Ekwh*AN<%aKndlJVWRd}FYn{JcNH8$2R6*(-@Bo3eSpo^#J2Q!i&q1qsRwsTvU&OpA5Xw zg^{t2>mkX+7#Z*sg3+r7vMR$i2TVegvyKnB`l{1sU5#xE~5<;b_F^8{+auY#h0)V<1&0osDU z0_zj_&BtGk^(cPHDaU#WztizoV7-9f3k3HPepQU008%l22}s5Gt%1(MfKs9F1*FpD zCAMNv6o^Z0DvuV3Quk~?_`ZeES%O;)=zhV~11b_6U7_C~IQpvLh07dq!G67jb^})+ zxE?_2W@i!*zbNI1yZV_z_c`EHUcP9c{RVp0KraBAFEI`QqGm;bbu|v=3kA9X(2WA! z0f;)L1=cHoSnD~~0H6;F?zez=qaw$m9)zm3i?MxErKB!{;#UVq@w*pLp~Tn*NO5@_ z5REbvSlr2@SMs8YoRbhAL`;&8V_AS#_I zx_ba|dt4w&-cm{6)etGms$CbScfD(^!EdK{2S<9R?T-B%6n5)5dS+Vy~x9>QEeDz#;R6u*A} zq`3SCAXOXZ1axg&14z}z0zj(%Rsy<0a{m!Pir>9}6qkNLcS$LW&(&!xH&8904@=y7 zK+6Sc1azxF&49uJ?F6J!`yHl=THp$->oGyB5okXk)i?N=w@Yx#Fhw;Av;$C+K>r13 zy+EJ35Pp^gdKLp;#rP$ly9IYA27Ze`U&f%U5a`>0q5}OIkcx2*hNp@_Z+{yl^j(FP zb)P`n4MZ=43O5%6Q1N>N(8q*szk&V;=t|&ntSOi3nshF5$E>&33w%FP@;?5H+*LNg zpH2C%UWXQwfjpQfAa8VEu4V`>wITo&Vx`Vr^eG{fA5@z>r14&^#sq;_sH6d2>l|@q)RJf=2RV31)85tbsJltOYz&x@l$?1=BIJrl(=% zmK3F7=FKTh$IRQ2me%~Dt~8qYbN6~N^X3=#r(sIw1SWfOIImeqAhq6Z#ST)Zd&*w{9`}s?0+3kYFl-XrLRdp zZeyfP1^z02i}2^f`aa%DJ(yv<)p{`Jpe9B=nD+z2)^YfJ5O3As-LTIT(Dk9?Udgx;>auVD@@2w*xca!E^xQ&ChmV`msB3O7S^hO0i3D zF#CY%^R9Lyhp@uo#nN8KKpnZWGzV5)!#W5IOztOcgcgSn4< zJeVXf-n5OEaS?bFQsnaO>dub#)x6zHr4J__u^Z~T zR&QwA*w`X?xqs}}Qjt5yWlVfYYiIjf7^82w2O7b&r9wRgiR#uXVG@Q_CiN64$YSV& zq}^tAWg^pMXIC)v3t-vcmd*`p8rpANr|v^{xWXNU7Hc){wyqAfP)((}wZ5|%Iyr(u z5)}>WJgBnzdi{P|g?;%stv+1`hG=Np0o&NJ|s*wW8tP&ZhQ;`f9mP&F~L5MH?5lwybNq z+vcVtQ(wkLA)>3`PBNlCV<)hBvAiK2Dh$=3gGs>^R%j|4>e^O|7mp=PU4l_3W{cUy+K8rF73b*mxsXm;wdw6^M80jFcB=ILx}Yu-eq z8JH!}1p<*+w=lJ+Qd}8rZKL0V<_0E#T&`TddPM{GI`&K0)@ai2;3F5pt<@cpOt@)n zw6nc|so7;-X_D7*A}x2DSV$t$vCdWpLsLZ?TB54B4mw;{Uk`^2CaX>e>abqvP6=;2 zAY9kp(E!*EjiS&}5y&g++flf(RyTE2wYIjE*R8$BE`@1-jE7rVqfP5JVU)MjD^`+- zT~Rt1b*ck9+n_`WCoCED7sGau;6t!vjq04+q=B*(rBl_}Q0om&sa(4h>XRR|K$< zOaEwoF!VA**sbf&{o&ppzFlN2fcA+L&H7c)()s9wyO1M zqbwY)Yu9$RFTrqYmN{7B09vg&Z@7I!S$likCPBL*L^>MU9eNcIZLezqdqHyoQ5B)W z1S#`7G}SzAeNLsRHhW%4NxG(5Z;fSr-rfnk-I{8ZNau7k)jo&)OEoqw|B8JwpSk!e z&7i3kWMJCUox%Fc_aRdKJ!EU&TdIhuavikZgr?dH;M4QYX{upg^p+^9S)!>1ZXQLo zxw9rTrcw-p$Y*LyC9R#_^4Cz&+@b|qBP~tSYaM5yU>nwD=wq#G4c2iS8eOlqJS(To zP;0-5mKEle|Jz!0)LvUK8#ZyMQC1zkEoko(sc1)4G)&UhvoMRXZALe_F=({^AdnwYJaWZ zXXyQ!doJpg%cT4&-?NJRw9!UrC33ZdDmv8mxEvWh$LXliYp)O9(b^f@fbQ1P0FAzA zE6AxK*wGMVTpV+nHgs+Xw#b1Y*t$+vU3)`^9BD-5EmZU-vk`p4 zga)UW9>8`~{C&x)YVQlCUyB-Jzoz!!8EO9&&10`realV{6}ft4LtXpY#)^jKrVVx) zicZo{8j$S5-1(ppu+1uqwv#Yq^OLqC0hV+plzCNriX9EkyBngmq9Znub-{J*tsC&e zDP)Zp2neoR@9>?=cy>OUT39t3IX|mx+}gsNa2LL`g&i1Lu^(L;zHZi?YKqWl&pQJi zv+M3Od7pnK@z*%+)h`0HXxb7x26iUycg zXlPlRULmZBMJpo};gzfT_VeyX@xAV{3#6Ic#DRcU2Se&YDBgz|IW?E(ey`+z{x z@O!^N)A7p>RXJi(h##tQM1PRh z^OIv8#;>ZEen2Y)cLcv11UiaeRWHW?sd^azr0V53AXP7efKK;OwrCp#;!Vabfq02=lR)`^RLOZUQI(t@hg8X@0#YRp0#YTP21u2h zS3w*_R_0M(c;90;M^(QLAWa(gfA`L@ZpWA{})wn zQQQQ?%D6t5`#AqeziMV{7I)saKHych4d@W~EM)(5-EtYeWB6KOhKl?WgH#H!zO2|U z#^dK^1CyGPi(iV!rPbsoaS=mSNKAc6)6N|4R7oy9*<*VObxf=3<~iI1@{*Gt<^57F zlF?UxVk4!g5c@f95am)M_NZJ^Rrkbj(G(i71BuXp&JXa164g)@g5oUHmh$>u%kFzM zJNEnoeXpI>_v%@R(6LzW6@7zK`Ua-tJ>8$EJ{s%G>l@1M`$hK4L$SUG`i9Qx`-O+< z<-xqC4ODLO*@+y_iuB?F8}63j73eYklMIc9z1qJAp_!RgeK1Z% z(*C@sBZIN$p=*335jvg~Is&a+|HVYyU0N6!?09z~ba)D{Ajx$%@W9=(Utyk4puW_ku4$CD@zpYu5DoR_}x6Xy~{B_}J+d7T5xHBvzz z8wv7y92x?b>y&Epaka|eF{TsxUAYK+5)0Y}?0~NXpx$$z`ARWXFvg4?b0bJ^%M(LQonOG1z zF$wCQp)s8p?y?Qt$-D%~%v_QsGq@|0jE%((5Xh)0>?BV{1z;q(7>Jio6-A5VqB1;a zQUfwxHVrhYrpu=Tkt&-hYQ)q!ERy@#qLG_eJ}n+DMphG*Q%(1DIw#dEgRWkDhzXZZ zjrHdB4Q9i4*~^2m-Us>y&*~dEiyLyHUrnD-i+aYpAPRhWzyjU*!L49|T zZW(Bnb1iZ^Ad?8=3zrw?#S#c<tZP*UZ5n{l&sEWYgtkPV-U!lbqnY7EfqOvq?jap6N!`cg!Af-mit31>A-&h{Hf;2s1_DAS25{E;q23 z*PsK&x@xS>D}3u0hHI*fK7uUVM=e>OwH_C6oh!&NP{HfmdgSS45jAEe49Rs`-t7H{ zQMKWO6@3@4d@rw|4g>Wim__72yq8 zRWaqskKh@8CRx4LJv`isO0vIFsuEiDpLOVMyF?|XcBmzwo7c#?GZuSBx=8f>L`rwT z+zNNI#3m-gRDi99=x$ zWR6~phq72&y|l#&F{~XDd8On?asE{7dix`6Nu%u99F4 z+=3o;B2~)EQ`Yc>LWPUnxGs$Z1&LrJIJpzP6u|*uAq*$_3v^c*bYwfP13_Z= zEVsN+2c<%H7%GeygBhc#(khbJ+AGvZ7!!>I&a&uf3(Jc;BEac2Z8U4yB5@iDj-}9o zXnYirv15sh>5+keMai1;9V;hE*$$$t(3jIgFEIQW43bo7Ez_2&=P6LtK{p{hLZH?p zX&V+svaY%$rgCXNXmIzFTq#HIWVg^IMYo_Sg#MvsG`U-a+Cv4~2Rz_{;4uu+!x&qK zGy~W^hxZNR8cz%0P{MfZ zAEJ@h;lhb{qU4F)>}Xn*o3J3+;WUykng+kt&{jpD>Wdg;DE6&K2t}7dxgNF?B>tno zp!BE{hH)at;@lhC+Dqm7ptK;?(zGg*96tp5p?Bj4oKxG`ESyou*xf8~;LuN)fA$mI zWauXwmnTCpBfdsi$!Jxj0YStmYvts2jbDONdqT65MY z_dfRYRpYshb$Gbex!ku~HJ**9Rpa*qwjQ{M8wRBsALkg0Q#*dDv^rnW9$DK+NwPEr zd6_TYT2lvl|3+1C_gZ$sy_TJDuVo-BWi*5TkkzOgSuxq1P%-U}ibMv*JrE?&V;?3&$;5k;r0g;y7^vS*0F$DH-E`lcMUcw%#bjI>$|Eu-~JBxj1r| z#D-EWrLfdyHaYp+Hwz8#m7^0;f3x#w?0dN$%K@0a3{#x*ASFURkBI;&Ad)=D=WIEK zkz%Zihkl!=K4wHAE=k=wTN@J+;88b;OIk8u#2>JJ%&v<^{!?t|_@!8Ae>5%}e24)>nAu71Aky-7 z!%4G^K&l8hN`NWb?azW)K}asCd#)OpZ95W&JcsRbG`_r2n*CV35{=9}qV3R& z5e5+-gcL{Zw!0mw$9CJHk$Hqh+to_k!FXjoSlOYCPRBqaOVQ$GZLH|+JetTZVjwQZ z6d7uhQJb!T#ts*I{&pU?EtaeSGd>@Rx9Z7B5E3+7O7m)EBNp0sV zJ1|~DM^fE<<-<};a`z(7d?cq;YW!Xo+nR4hFCAh|m1H^;$+p~D!C)rVyj7>Gyu85v@1m;DWVfP8)u&lI82g`u&Ind(bnzi0Wv`2KZP zb$`6NpVur#+lVO<;{S$tXH${Qud|*F17wV(>rr%Yl!i=@#=X~FjO9GG8N%xl zN-431O$CuApp-Jm^&SBaam%%EC&j=WSY(~-h)q3xlEj+ru%|5FWt{GWs{+*cH6My> zK@QdjZnclNq+fXt{t=l@g%0BvLbHPugkfWJL}w9(CJ$c4-qZxLLM|9R9D?ciNv;zgX|>Sg_Y;QCQ~LYl{6doO^K}Vbr>Rm3@}Y;*^_qmgV;@9AdEmVV6B3yKI=c z0c0RmDsqU}bArq3c`{$*xeQH( zo>2eD?!sQ(*!*dtK=$l+C4}ivE21ZRYQW#_TxqnJ;UJ9c<>1NN@o^^7v&ha&GRbJV zFQWfNuTDme+C3{xI*FcoG`@#1S%*6ha-1dPeTAL6FdupxKr(%NeU-A;WMl||cuxgrV$bo{>Rg&sQ8)zBGK$d+IV}fzy1xWu z(EglkS6y))q}HWL*_Cr!;u7m%pUsrGKuN+gq=r>~X`%Qq#k5+yzP!fCdrzfglfMwb z>xS_+A%+ez&TRVcD&*o59XB#|Hk0Q`znQ`f7xtFulO{cwd3@{ByG*60_a^&Xdz1ar z$or6y_?}V}F&TPRj}wz8lpHEOaOaZ<)z=Q$|gzm#0 z1WaXi-{g#v{)xr+mB!bwAH^Ltj_N(DkVjOsOcU4w?K}Ct3WAh%@iLeSOQ-X0cGSrS z$MbdZ@|ireCncHlG5S@PRXFx zYZbQsn7Alp*5A1Z4+Ze!uMktIc2h{ZUGAszR-C)taC{y>xe_pR87}lkGzm;x**Hc@ zJtH>i8MExkJI%z5Jgo*k;8q|#I*j_0!4WzkBFORhvZ|p!pJKNG8{}bpP(p-Q7aC;8 z1M-rd3sVwzRpAanI^D!oh4HMas!%MfrbjdhOk6@;Rcw6tL^(y;6Z3J`6s{bgqVV}) z!u+@k{Qp?rK*ys%9YScX29=4jsyMEwh7RI`?wg%DY3U=WjO3quXfkO`u@sxaWpvfh zWC$Klvo-#w`we7IJl_8FrzX?=d>d~ZPCAmIUhYKGw#ks;O5e11su?y!{$-teW%ovC z2j;$Hb+4R3+*<|+oZjkTa0!z-lVR|6&e^zSun97HNT6j|9Qq5H$YtS#0dG#&aO8BA zUNpJ97FwP8vb55}lf8Bh%O25Qq{5JaPl{e7yGB_hVYD}r8-IxKaM?-rnWwJS>#)~k z4es7Ai!JOqQ!q*IPcCF)CsRt+;I8K`$cud0wZ9 z%Vjy7KqqxxBta~$W=0rDbNU+kbFAN~o?>pvSYpqah$WaMCn=F1AaQqbv1vFO4?T(R zP4Vidl94Cld&p%NwfPiTr9w~gAN0F$vKoRP3Dt)eoqmD$B=LbHuGeQeUHQ8c?ge>{ zEC0fR>B9}Kyh%6ZK}Q{DC@+wctJ*f>nom3#Ms^c>J9VI{p# zy{5{7h-jtCrtu$km-3l&UQ~?Y<=E2BRJn3_Ik4IE$CZN)*)3;v;@;BuE> zli5Qb`v1^Ks^!c@0wvB-_g|;6(W~ssZ(sb}!p|mj+&4b_AumUKU5J(VBVNPOMDl0AW_Ku% z1&tMOa1f9;&v*$^)!5cSD|&rw>qyqd>5bjero2KwsP{b(L>!B4Jq9DgoDZ#`f5VU5 z8qT4xQ-qU05fm7}lM3y}TEj|Ud>j;l9I%nJH9jB-2Klw|{!5{*gFY}aqZ*>&!R1M4 z_t=vaWNo<8e|c={fOS957NDa4q2tMli_GO`EO>}E5c_@B{W|ARQW`)fa!7RM&yvg! z&k?pWBwyF4(n8kh{z{b=VY1iMcxA+^tHzlqXG<;{@rQOvmSG#4>xWBJsiay(pwYJv32Tvb znmiOA%DJP++wlsx@iW-ix_J0J%vBKp%P>_!(g}?jb)HjjZX7i%AjB9LHK=<~z^;B6 zXvp5dNS0aqurVT%)e)=nGXHvDq-?{tB}FI2bH-1VRSGZak>nDRr9IPj5u-o}Tvfv6 zCP4;)tEx|kIk|(e?pMn*CH^Q#)-EDBcSwhni|o38j%V#ueFRrHI90@Yi_lF1+xi{` z8*~Tiy#Zmm7q)0PzK&;Ym%R+8l;uUgdleDlWnOO;(jKVL+$mK|o8OD&LnZb#Scm>J zTva^GoSnI=3KWjc4CR^#+!&ZDGN$4$=P1EwGlD$|t$EGFZA0E!Kg{zipy9$pF;>Y^~}vRbZK=11uH{* zGR`Lxg%&`M65lm=p$_^#1&Q-zH&+0TIJI~_Q8^q7!4bV}g7l_>qkGMi{!wVJijT8Q z7*7dN$i)ZGhc4p4*oj38b=;c`M*#3`QMi?Lw^T2UP$#e*aH2MHJK)`75DxS5zReuw zeY@t|(S^^8|A@ljf5g<9_wC9HW4~X_lf?+DkTY*ueoXyiLc;xFju{pQOZ84JARcmC zze{c&qC!aD>!LrHi5_JUN%324`d^(7-Gx!#Uyz=1H3ClozB$S$YB~K6^j~5_D9-?M z0Hu2dpp{X#XMp*54+!0Z_{FCL#Q21P9szWr;Qk!HpT%E+^|$ziiA~TQz;C`lhw(cX ze+AYr<(Hwa0a7vkHy{;*Zf;c!UdC6@`v9p>-UCw5ttOQBGgYqWg6{+1lw)lKbd#j> zfT81E&x<6K*MmMIp^pJl{J6BMxPJ{urTa~Td)7eT1++-wz65BYK>a549}RR2(2WxM zD?loL|8AgcoPiXMI!X$<5Ky_qCTt+TPN3T_La6#|`oj`ka{0Z>G6+YPkWgnkE5 zjfDQtgie2#_G{1%=q?G318NoMM}Y1SXbuLdf|diKrI-S%3D7DP1JFkWvhd+ZL9KvP zo9_Um=w1V)xa8v#nc^}7P=mx>3aB1XjUi zKzY-2XeA)UB@RfHM;_6-Hr7q8QFPXPjR z(0v_{qB{!c6T*3Nk*=%D0I4)S07#`#2?)#)_f|kE?j}I0#{bIDeI3xXLia60_j5oh zjXkq8zb^nn7Qye!fKj;0`!o?SPw{zg&sgEFOL9HX*_FiKLgY)G5Y7}{<37g z9*ye_lmxU>=)P?r2$`&;;JymzVS!dH(5d|q&`jXqwd6*f(<=d~nydn3_X9vGf3E`C zEnKE7(qsP$Kz9i43kG`5K>uN&yqh%L2LPc{Al;h{6gE)t2Q2YLRbbT^=!<}^ml%Hq z=rfX93eW|DduKhZR3Z<22Cv+ApMv1>-6|6F8)j6GRk z&IP^rQ<&@5baV(BKU46RH7ST+|AP)7dtRZD;HCJ*;-z8<<}Unl*XPi5;%%zI(D%x$ zdByW7@Mr2-;*Dk2yt#9_(=hXkc+_&y%r7n)NXN__O~cHcGaW^A$C_Jmdm3im>>Wti zO*3ynTN=&$IXluZCHuXYlA`$oUd)2x1+{1z7v}}@iXZb}X3ttM`cz~P zHwy#J%?I`)OVcp(i^B%v_bEf0xwMn}^-n!`6|!SLkJ|sz*8nOP&)?b@?$;FNpKT1X zgi`Ps!XGAUWJ%LxgLBw}xe}Oe4~G6?^6}@yx(jcm9t_WjwH^$0z}2JEdc=p>>%nC9 zAVX0u+rcTtbBu)|I{EpbhYwTznGZAU!_Z$0y#hIWcxo*5V6MZPdUPp149s3sCu6Bv z?Et3V#whZbFV=1!=1CvsTfpS!x;ZOh7Sq?M|C2A)aUW(Bn0+=M6?hJEH|oJ$4op7g zKBw&SRAF3cEdgeihvvgRntC6m-G`x9y#buQoU|Sx4bE8(<}ZD*o&hEwXDp|lf9Rv( z451!fKO;WOI57R^YChT%&8~c6_(u$ucI!A!L=^3%Zd zW0`Sk^&n%(qtp5^F<9svnjv6<9?WD6wNek}GGJ;wm||e|c`&yCqdlak{M=2NOWbMk zE(XOEPU?>XGvLAW0<-HqnkKWS75a-Qy-d@vfbcLRvQF^(X=0;#@J(xRy$;V;Z z$xkaVMK(s&{0?CDUFoLz3^1b}%u~c%rD#;FKJuC7#`FWz=D`dClYfnyMvOkOIA*+G ze3rbrFz@wYN_?1QKFmjbn08{&@mY42=QuC}=+qA8FMP3{_FGohI zWA5q3?$x0w1SWr>8$+qls0YJOJ*C*eGM4I5tAHuOUe)2V0hnGJqi7x^9}nh>zyz_1 zI(+^f81-n*uK-i(p?M9MS`TIl=E7YzM%7p$FujK6M!eB^g_s?N;{(SD5A6_dG(LFv zR@dCtSeJ(Ly5%92&nu5cx}5UdZIWzjZ*6Q^(-ft539*vAdP8S(v`O+rtKn&GYLHWL zuA>Yjw=ZsOZ+Ii#du)bfEXYzC-df?Sd;Xe?k$w_BKsX)Lf{>QFD~{{Wgrf>x2|pI=xA-PuIq5M2|_BG@22w+rz(JB z(-^$X-n{GTG_HS0U|w|ICv*~IcMT#;W%Jv|1woqdpCp(N;lgY;p13;X~#f}q% zNrz_GonFBhUI#m_gzY}>@`giBnf=Jv!#IOQd|zTRcL{IDDUoLEggGv1Y}UxC6KcHh z=UD7XbW3Xs1~t7) zEpF^=!LV)WptmUFaH_tkV{Kh~{nD0=b7IJcO*de|MR?<%t4BBHzEQZSgYc*y} zaYwWv(m@|t>)Y4ZJarXppsOe~qq`8~Sg^+tY-; zjqHA4l2(1Qy&>A()UdH(amU&v&2@0yW*Rz!7bHC^qqyyx+M-x|n%BUcmqe06yb%XU z%#YBg`9~st0{2J^a=atCvx;>>_9$pYDPXniP;MxmGiPqlc~0d&Y5tt~HgWAaRg+cAD2%}Ay4>mVk-@0Z!KFcpUpS$z3fU6ahe)lF;LTRU3UMT65< zTpPT#E!wo9X*1nK(3c+kMzo_WxYL3=6e$sx9>6Mj80v6}9glZMtoQ$o}aDzcU_fFMvtU zJ2%>}ioJ#2#lX$$U99L0dly@*ybU?tr)C$;f-ffVKgFT!c=HhZ*f4sRi*I1jvv`mC z{MTRcUZCQ2Hd@h!VIy1$%%%+~-i^%GbUOSx2?rsxQXT8rLYpf}<6_Sv*7siC&^yOT zgYidl({CSx4|HjeU_jZU>qZmX7Vg*Ms%Jpo3C0C;WufV!^?zt&UvgY1;6`0F(&8Or zUh_;W56ER+eTf(r2F7_GRCCG&{bh1r_XJ%n;O1LyoL9_oO)fxFP5|U0nlA4WWRJ#8 zHsPZ5jl2vwS*4PlD9?YrpQc7}S5`(L0=2FK?#Zbd(HFvVor-X-t1Y){L+br%olb!j zz1W*hfuxgW{}1`g9KX;Pzi@*1l5S9^JJpK9PL;cSQzf3A^9j=n`qB%YR(jKY=}k{d z&zrxQKKhv_rH39#T6v1n=rh+}v9CPE6O<=&e2lQP_A5D^_%I5m`WXzZ<0dHW@!x<^Ixr&y5?cwfZr%J}X9%x8k z`p-07juPOsOnq>D(J-i(K7zWy^Ut^WxBnVLV$iUudH_Zq2pojFxM62Dl-zuk&X zPei7ocB$szom!nj-p)c6y7D_+$6rOgsf_KkO4`Ylw%tCGzKLHuVf@X4`HVH)NvcJo*o&%)L0fzt;;;+E^ zDSq)u5NCr|@q4l0F2Gv&Zh>|h=a1ZQ#u6ONz)ybjKCU_xu_17F)y*njMraLLz z4fC1&$BvYOa0g_5$-LqczNwRg!pxn;Q>DVV&n>LQtV!H0w7I1!k`Y!}b{PV15Zq5Q#Xk#()WXFlQsiE)S*`%rjsE4Kq2noj{U;GyB2_##xeL&N=Cw+F*A^?ERW00vQ9v3Rq+$b*>y zOsxmA44AzhOg%6I9?WK7f@oqVKc6Na59X`nhfVnNh5@a1Rc@#)om0sQbI-==ZlWU z$k!MIdA`O7txFmxpGeGS28gq4_u)4;v^2Cg!L>WM`97nl6y0Adge^|_9^pB&WuN>z z>HOTzsrw^^#H+9cnQ(dPP(fbMZo7*oAD^_I$c&PCJJn2*c_*mCEt%J7zhvGH5h0$E zkUJTiP%!U~g(D!Q9$hx>S`)iZkXemx;4%2j?)lDhlOKg z=W~Z$9gNQpz)ROzHx%Pqof03(@2R9sv*s>XFk2`oZJHv|rmqyKo7|YOGD@3{F~I#y zAZ?UIpbS59CEPk-K3Zun zeq3`XZ9);xOlJE67`($$q_rDb-U4AQYv&z)7ON47??6Tf^^WC8`%us5dmZBmm9Bk= zLr~tZHtOH-m5QSw$soKkjSgi+)g#%*vMQNp}W*+c~sZUumw}h1Y`F zo-{N0X>Wq7_h4Ond)=lC`FHW;CRI1r->Z7hK?B=P!PX00!_p3 zN`c6sT%eiwT`Ul(Ljo1!cZonex7;ic?r@1}V2-4;OmLO>T`Eu&etC$j zsy3biq-tXyAXOXt0kM2a0hc+;vA8Ix+UNzOYU3avRU3x@soFRUNYzF^AXOVj0I|$D z)=~Uc3p9Y=TLe0e-&+M5#IGvv2q0D7Q9!D^v+$=vdnY+@nIO_r0oud!#kMc$O%SfV zD4K3IAfQR43>`V6a$piK-2s1 z@C9)4ocDC~vA$nSzURfPmxq)i=e9kX9Iz5~U?Xq@FLO~uuIbfG;r*h7nsLZFZ z1{MOImBKwMt`+d@<2bA=YMc1xlZ5sF%{GC&h8~~^LdH9h2WXT>Y?O>DOBmuz6ozPMh$}%bodCmB93>V^2a7qF zT)KJY2V@J*DPhWlgU+d*ydAxKryN&kkSPkj@Ihq+wg|z1g5LXK)EolzquvaFm@qvS#4btF+f)zq!}Dh8r>SqXwt z<)wR3`*y2K!myj2$(uAHERy0VZ_<*EO_;&!dy__8C~wj` znZHt}@iVxRW)WD<6~>jcU|18zl{6|NgDdF~-HX@=zatwuEOTNrUX@0o94$6U{9t>Ki2y%> z89yv^8O%f%d5}QGy6^$y60vx+%CxQ6Jz6ChvZtX!7$jm2U_eUGI)!T1AqzG1VKj+D z-+1W7&>!8OE8>72xxIlzc-@S;1oq)JN#Kbr#E)YkJ3&b%!qaYyN1>%SvSxaJ6{)a_%fkY zcC1V%#4Oi8M1ej0LBL?6vQY1eCEvtqZ401u|A$Xx_4>75d+w!89t5Sfu{Ho>u7o{Q z9w@Bn5|`&*9xS+*NbF=7w|g*4*lT<4y-XS>tzIO5{CF`$nH$)qws#{cG7MX5hxAaA z8Ydpr${d=Bk2QXa+h?y6bcPOlC(h+7NZ%dBW`y*mK&LB?Xw93y0V>m2}yO&aWg z5^K-BF#Fbxw@lu8cLJ~Nvy>;16pt@l>k0OBR0+Ecjdbw)=({PbSz_S5TB5i6fF z8WQt7-ua#uv)G(G+R?%m8`-^@rh5b>Jxi?V2QtxX54{f~&~0*V9Pi?(%w;g_^gZ+* zMr3Cp*8W^+bnNZ+(8~tX9(s?n3=hE5JJx@(<+-$8-1E{xDwY& z8#%Sdne&vd9Q23<;p|SI-xd@{HLU<6}<@YArX(;WNhXk@G#;W7&Qb)7O7Rh=% znkeUSRj)eEo(chrl2y6JtY3hh7I|8MXEkF{kE@Qy<$ZUzYDDdeAMa%@7|~2A+b$_X`4CD;-6#{0?lzSA#vvEY2k&b#9ZYDA5w;Yy!C{|=(R)tjVRRNx(6m20 zNWq7A7`0G5nd8ISqe0F*sCuLRrZ|!l?b>3VamHp^=JRGG| zV0o8*?b2gT#v9H6oG$HEMP@E~(c@^};i$+7@78 zBKkzCocDA{;M$RPPQ{EXN5}IqNAt93cHOyf)Q1zEJ}MZ&iVbt@Nc+V-U%wm-O$o6X z9mh;fVK3bCsiTS$II(*^CGS6-{nE)i^lck?0=1gzi9!a(`b~wng~dPI*x{d1_0Jgp zK?|iyD+#TKWHnj6OSeFPO@=L=(+`yEJ2D-jy^CaW3qa%9!6D3-(}N_Ew__VPr+V7# zoFw-!j_I%Ptq@GY(7I}T_gM%Bo`JYTlS2oyx*{R(VLM%BZaWj zbB;46rNG_bz~pte$0Rj)GEZpplduo(c8Y zz<)&LNLtNyC6+ZO_HYn@OI(0NXh*CU{s6mx)cg4)Uo@M5avh!s?TVL|rg|uvM(tR` zd5I)pcXdfCJ1<;$Fc&fhH`C0zdKDgt%F6h%TrZ}I7V6nKig?KxZC>hg=CKO==*)xv zN~f_|@;zRjpO9ipZOs&C9+EyAN;&i3YpN{B!uyBwB53h{C4$vRb_A2?F)ahSn>yInQD}_jnMf+;R%{ z0p)GF@3eWDsrjD!gV+HX`}Y?}?izu~+C>b_=fmVUa@_bPZ0FOQKA2>cMcFvZ#D8`m zUgou(Z_206*HdKU^(SdT|1c}&zq18>^;Jn*(2uc`qf2o^So`M8=VQ6@9EPyV)~5Fh zPtQ=k`#gfrR*-+mqF~F*xGs3Ru%DibGIK%s8W(OK{o_EY%L%IgbI5U6zHJujaTC#2 zh{pa^~g0`ZQF!ZjMG-9R4$r0CdS3VOsq+?y-h6Mz(#eFoxZBZV6W z#9S0u=S|YMs|?fu=)Ds9O9P!Sp;tnbd?iA2tdAOKoq_fN;s>)F>)U{43YQ~*&J)~E z0j(9>Zvf2@=q&736u*lNG{Znk0p&?tUM5%k9yFo6GMX=;H1J+0{8E74FVH_3=-&Zd zE4Z_=wQ2kF0I3+40=iB@Y5rZ+OBj&K)yEC=Wk45z4k|5xR9;>MbfMt59bGG2egjDH zd(RYI$|Zmbgzh##D(=I8c#$Q?`ZORF_X~hj+Wni`xd&ldrUWPRG8{FK0#(fl!N-YXV0-_R5j&%soe1Q%F zDiNp=onEDO13I{>(}w`fKxl#W1we}P-RJ9^ZZ^=@0j(0cR{*KpPe#Z6h~O>;q;k3# zkfK`yNYQ=D(0vn-O5?fQNady5;Jyz?rEwh4?UKeHP3R@ak_x>V(0e3*?+2vv7Y3yG-2+Iau>;VRLf31c zI}q_k;e0P3RgP{zD(;^HQgQd0(448do~r?=68-gM+Tir_fE1UP0Vyu88Qhf1b=;+Z z6y0G!AC(;Z<_g`?c|l!64;$#O4Rpvrzcx@k3Z}}o1OKeC*k7J7(En8xL6^z`mJ};% z5?3IW_4EI^`yu>eKUe_dAq^HfJQv~bQT!>4Tcv@tS(7k*WO!x*hpAWY04u}MMf2v& z*#V5CE~cb`DWOqcH>P-gRT^gQoK~qn$IWNn0vg6~W9HAJYZf=Aq-a_? zW^Roa1LenVF9w&@pY>p76&1~=;}(bWtfF~yi}32g%$hr|*%QWw&HRpFfUuPv zGrvpS7%}tvt9NM{a=gpKS)2L&C*f@K5i`GBk){7gHrhO~h)M!Ov%^l=|CTh^&^nm! z15;#URBh0ha~Ny5Q$O7C?zJ&w082|C?Z-;)@VNq*Q4fa3ob$1YJ2WeRDe_>bSQ++U z9s*{s2lKxe3oE+A=LKN;J(yntlYgO`CJWtvz=OF4n6?5p&CS5<^I#f*DaC~6q?H7w z)`R&9Fx?)^_kk(G+V8~rH85chW}LA+m;y9iDOPUALiX`o3rsgwW(QLOOs@y?Q8u_d zy05ka6U1ue#M%Q)n+Nk1#=<)0(DVW`;KBSDn4+MfQLW6~JC`rUQke5F{)#-9>wu~C zU~UGc&4XDBjCwSm&A{yP(Ch(bpTT?`Z(89NI!rDjwMwbUXS>!$d(790+LE%?mu4JR zsUuPQRZJvi4uxW+s3W$x?aFSn6Y`jBwb{9izuJm9PD)UW++otx0`s#)at?ipu!V=nto1%>{O1Q2GcKN{Nq}Ez>Dz?E^WcFkxT8;j3 zW=&%j$E|D(R_<3be`Zdj!Ndxo}AbvhpXYBJ8G zVof{>pRU$T^hC@k;W=Rptl2{U>Zx?)abeiR%rtw{cBnl?0)wbU<#HRij;80uQsZf?Qf z;?~X<4AcoNi#qjaH$-c*uQ5?c8Fk(53Pd)17DZjNjDSjy+`WXn5p$!+uN(@2GU=>it+k$+ zX zB%EDMbx5%|HIW@c9ezH)VZ8+w2rq~F-2Yf0)HfuYYg6juoVw0ut_8sm*_B11V6vI`-8FA2R*Jcu}Ekv2$oK0L9kRToypxVUv?(W&l|HK z2(y89dx+UUpJl}=HXuhwdijk-MQFO6#G+z_SenaF248=e=Iaj`EecN8`Gq#x)XWzB z!cuRxnzm~^doB9GBH;w_YfdZv?GwfqD};dw(l_-Djjcj__7%++XTYp-)wkr=^xN8# zTJ)3k4VL7TyGXcP&URb8HT_Jl3{MYxaB%~aVEAR;i3NpOYruoK1DJeNsYAnF5cXg`4a{B-=9}c>!5jsKM)4dz{~MS#4WJA@H+$#Mtb9#ZokgpJvQqMmZB;B;*m{hq}w&mnc1&1oZNCGgG>{6xbZFl zlR>*BOa_Vlx^u2}*M(!(&d{a{UQ9qH5sL{#E;Gnj(t?o<CzN&=9w!xd7%K3QJh;s3nJ}->I|rRE;&6xf&h_p z_Ut_P3<3jpI0|_ZyLN6$R}Q_l?c78z`*!e~Ft^Bdgb?I&Dob_?<}DDqV31OQEU{#F z4F)~F(8!ZXD&S1eHc^`=hy{b2B^ckHyk zVIxGpwkw|Y)f+q3wQbrs`%NGGxycTRGuIX64h zVa8ctp0ZD=2KT9E0l3}v%>sjyRM%h)oarnufVihK3tR`f&m+B;@W+RZ{ibGtm%-rE ze?qfBpgPH5b3&cL zc0=*JS=uuf2hpj<+Wca@K07P!KcnBXrTCobSUcSnm-2qDxZlMeA5NHWYOJyScKxZ0 zwYJ%F=e-33&5SdgV$3+R<#x#o!%PjXD?$8r53bW$CE3Jm*4%gP9>PEN;~!i>9fS@* zddFRsS~shKNnh{6sNmBWM{Ec6saW4;z&J5`&C?ktv*woApSPTGG7D1%Zo5G0!M3a!7y>wBUF?bCuZB3Hc)KwHzcoSnW9A3)+2$i zoJx^;qnhs$%4%F7U79YR14ghOoSG&g906~Bwc8lw@(LPS`twggru<25 zC@*15MeV*PUY5DM;p!Xq+?1Yir(PfiA#&@iT^Xd-r(A6~bxu6ZzI~^k)0rUI+HBzi$G-hp{9`}<3GxyhgubA* zAvgFiAM#+<;4OXnDMRi1kS+lOTW6waM~6A{4o24eHzHe@Gi#15TyX9k&CiwF!IJY# zBWu4YlMQ5$Fb*K-S7~%2VRU^OV=zDQ=(CO{FSXz+BMPCnM&Msw#r`oW`6lim@UZUR z)Cl}jkU^~DIb0_-!aEnmcC}{5IUUxUQw8H5y!t%aFlnV?%Hw zuIshJOg|D0suY9K)?jBxL;L$WY{d2Om$0B{7JM)iSKoL?=SCad5p3!JZELV&0~|73 z&j!$RNaqxEB}FB(-%Nf~{JH+})bZZdsmg;{Y1_yEdKsNT%5G2WYnz>HHVmE78c-`p z)<2!d&IEC?&&y$A3$vz zi(T7BN~C>q=e!s@AoF#55yx! zB$Sk}0z%XIN2RSu4wDft55_~sgtQAoF9+j--C(6U|oA_uM`Y}tS726u3^rA8LQK@0zbgL7l<5o!jos4=vm0Z5zkn_5 z{6xj%+W3xhgADO;s|UAf2pQg<+{28a{~T1Emfc!+S{N3BnSNLsEc6)*LfN(<_tGrr zZGl)9nq?_GhbGRC@1Y5!q&9NICQ<{J{Y#HH!}_8OtcR}!U$~h--5T>MfmHc)))&%B zl~Ru5bYyO5ps6qfiG|Ze?yV5Zw{RZRSl%OK;#f#e#w)Gu% zmAsCB?1y1|vMs$ayiy_Xt1+cM%pE=qdx&~;tj9FM@agkme(A%EdoY+*%sy@W@lFx$*$jrZw0iNn912;Xc0k z?taqi3{(l2P|3tex_YBYd`Wxj1_%iJS1+_UKq!6w19j=#0gC_H=7zd<$*oDlU%;l0 zNDEx!X)aLbs&9%mwYIqGK=@>2p-%6Ps*SgTO+`(3cf?i4OQ0py3~!UIE)SLt5R{ro;`TRJDsz~`#{%cIww=KtV}u&-vJH3w^H?# z52xTab@uo^7`)T6=5_k)Q9S$2Ux7e*^m$+&&I6I#z*HYGye9|Qjz5aZOo=sEM1*9w zP;X(eWiaAey)o|rF&u)!?Z(T$NJI+ro?aGMP+ib*x!y84n@ron?9fWYu=mokE%WTv z<6;Xg_MF&_%iFdZ)1(51FfnOw#R0HwkIKyPq z65nHSyCl}q;yu~2b;^$?a{;7!xPxS+CHD|okrXD_bh8Ay7GZaeo9_TmGs>(X>dm(s zkBr4-D{dchWXI~>cjc-Uk_<{)QGCwbjM|G#1Els7)qvElr#U0Xc6sI9rBrd7b%ZB1P+wtBhpFM1gkY_-aq@j{0cXTFvUpN<^47@lECr|#1! z&#;HF+m)?6DlOBBk`UM$=SRj zx1{RshNuY6+FF}h@VSQ4GQSMXmWEMEHMeNCky2%d>z7xlxJYtVQ86WUVQdRK8iH#f zWD7R6V6#`(+_brld%obh&X%#jpx^E z$aB8LEQp#7-Us;-yNSP(I;Y5+``fKn15*FWR)Y?1QavN~s(Fg7#=l_LsjUXQFP?I* zL8e1rL6l_m0loBQiwJSg;2*FytIQsR6mb-ke!&KP0EmboqhMo&o~Wd14Q<;guIM7kw)c0$R>0XI6JBfx2+U9eous(Pm` zKIEJSkOFyzlRzgT1z?hovIm%R9aHS#ioxsnPD%q2qy?9k*i2c)GMQGXfZ_9R>f>kS4w@8)1*4@U58a1u~v-1Cb z&w1{Bo|&ZB-Jkp0@L~FW&V4`k+;h)8_dfR#A@Cmo5cvpzL3g?m)q3GDH&C(-UrW0v z*%l47;&yWUj!L$L&f9U8LVYlSud(P;sH#5HI%01hff7fo z9$ISTdQhA#mQ$R0=*XE#oL@bTOOEb2bW(;rV|0fa7*3QrUZ?)6%C?3t_MI;PX6!bQ*dDr8IlX{?+FVCktY2nkp z6iz$cV&oe?w9`pbUk1Qz3=U^oh>x-Ya=OFB=!Dvk(-|?*#Ct8y>TPuDiWi(o)eGLO z9$Tb|IGyT=ElD+&INRuZ&GDFbiw~DIk@Vsb@0=jzAWhWSRwikp^d(miHbqmlxUIWV zqD1M1-!|Qi0`GcvHE=q{^&Z3<9{L@r*jV|1;!cV%8WG#Yn{DH})1Au@716AEAKSf+ zBshh)LtBwyM$3dUwHzx??_%`C*ltM*eX||vjPZ=h2xZ=O_ORqZ)<4i%pXwxV7h2tH zh_1C#(h%joSG%)kDBUX`*5MXq5dV+D0>`+0=@eGl)j;Y1E(Jm_A>Ie^doBKt1e)d9ne@w@pT||MxOxUVkr^`Vm@VCA^~2Xt8VUFfi#z8K-!`; zKwJQh3bX-f?Y{uT<>9Enmw}>^3op{;GICUaFSBVpUJk3gx)}EDc!^g9biJSt0KHSt zZXojT|M4=?XVY^C7v!<7!~Y6h662t0_#;%Hm*lbYPuO4NM8;8BDZQnYK@=Z{x@xPbq*swUg!zjh5ul|{w-#d)5WEiD;7-i2e z$`6K7==1Z+8rf~0r_Dn&Q=e;xQQkX@GJhDQ1C+V=-{Z!vVR4=wM)}z=${(^Q7emzM zw9Hx3GUx8q^HwchvS7}_6>H`su(DWZk7>=BxBBk+TxreWio@qOz)>@C0Nf&WI(~84 z7}ME>gLlK3#52o>z?>W}0W-%9Uh|hQ!LZO8w|EV-nHx8Pmn(wa)Nf&Z+HdOoSC2zt z6-M7e@sZ>7g6qJhmtQi${(yD$YkY1+j1Zgk86l=*B0OQ>aL4{xH#Te&(0VVEvv^WQ za?2a84Nr1TI}U$)4~-`+XIW+rmj|3p$05QT88T8*yRLR#%M!eMb(Zj90kiI&KaT=f zyG}%qXAh^9PZA%H{@6D{rum3~^af1D*{B=K%iYt5+@%NxE_-&{tR76dh3-fj$!9d% zY7SR{jNmgmj-bw*c;Yi!?VA`7=QjM`WJk5;R~@LX_FuhADs_AA-+G>;%FZrOjy>nk z56^Gdi7N*-^^dS;{o!wGu77|op>JtoPW?E0oTL%r`>PI@RgVKp1}x70Mv zoIUfl+MBLUB$hN!#D$7ipN-4{e~15%;QxpJmwi>J=l`{XYP8XLH#FS5wsLCp&V{Qd zmQS2g7OhPzS=M~h`&O=rVp|Q@NR>w?O}lAQ#Z48JqXRXoRxMo7d{Z=j$IX+bl$A}0 z&mN5}m>bI`<3BilaP;dsocxj-9qH+5T>_s{v}K{XkQU1!-zXd{Q8a+(kE8dkTzwDS zM>o6gPu>*0Wy#uw&9fHHYle1I=h&1<$UT0OsjmBGfAqe2E#k3)W9hynt#J6XM(xZX zzANU-KRKF)Jj&tdavf32c$9frbh+GH8AW|u)PgH4>2Av@3&+!VybXEac$&5muCkT9 zZ7%9IYUTW;Xr-Hv7hjK$fhRWpf)4wrr8+s(6Xi^f;3S+Wp~ zGj+Prq_bs++i(RMxOm~bRm193Y2v&6lpR~!L*AMEr%8Ms>9Ym6>|%|UtbhkFddCd1 zZ63;82M(fGY#>J$EKaOI@4ER+Qu&ahfhr(>J*i3SJ61SS9asTCQPCHGEs2(CW;$h<}U(VJ}b#;!|Q1*qEIYoKpje$2$CE|%T;%_nzPo6WMS1p^j z4hIldF8B4V=An*YuY5m?ho^e8aaUdj*Rs#CJQCk!thy2~U(S-M+-O>iH**wJ``aJ= zjv2!L*ral}d7(dS+>y!|{w9EwgCnEmlPWo`bH?kr=?081v8~LVc}8xuAN*r>s5m8-+7{Bel7YQbm;3Gq z;C+~67UAyJW_01Y=)5&cmd%^L3>#Ct_dr_johR3wo{3R?0Vq1pjkJ7aa{?*mFGP1@ zD#yl=H3}Bm%`DDIlTj+Zq7c7Hc7;~0T)9k)5#Kf)cd=B@$b2$M^_izzX}!ou}%DI+ymR9Ye0H;a#_Rn6Fus{D~cc4Mp%^_y#5RKbv(* zWgD0|xUbpVG zi+!sbrLh&QtCyf5%ELuVICkc(h|;D3_ZO^OVJ=8kn>k8Fw*)=Un3CV}B`ct?0)csJ z=C7ifz{?lQT9&K;B@kH1o#5pQ1B;fou35M`5NK&#zN8s+6W9E^eAPm{iYHf<1VjLM z&GeiVKHQ9aakg)ciU;$)Z%K3OV*I;!;gY)-w*~@B*3uNmwP&jr&RI3Dxfzwr!q~x` zW6}_tbS(>3uP^~pkLCr)VnKkiKzT*Icrti=SHm$a-h=>)qOE?Bv2mytDTE7wU_@C-iKi{CA%W&FLtoYMh@Rn;t*@P;}$cL7B83wndB-6eU2jt z=z@S%jKDIG@b7}eLRV4(ft8C|Fd}qJ`7wDhS#<)txMktOd*);Dc@K-lL5I~me~}em z?Sjd6?&X;fYlz|OM9#!z<`6qK?HxjK_c1FQcPP&XzY)N^<~II`h061-$`_9LqR(OafptSt-W4EKU-7Pc(q>QpNL z)k(VmT5;Ku`}te**R_AqfA512Wz9U->UAwkvPa)%r-gz=3JnxJ4>rtpG)d0U3TE$m zcB_-wS`Ly2Pu=!tWzm|Wl>yN)d`*8*+*%w;$7+J6g zFPhO@fxQk>FE+bil+enI^is66muLr6Qw_Q{GRMXHsFNAo0Vx!Q4 ziDHS43rfseb%&5<@Sa2RIrR&j&5Y)w;PdmF>C5($g3e~{Cd&uc!)~?k>f)j=GOhpc zl6%w*^*0xmr(zMDv(m5r@;nzVOfd&0BHkgnoIIGGH&7??Go^AAWH%ZpuU_)NxIe=o z^U_?_H7ZPhr<=j5rS9#7$%$rH&|KGCqPD<%~ut?tI#0?$tX! zBnQ(_Z@$qOnASAZb{AMj+3#W%jU?g)kFz!=-Oi-^(@1G)u{=vo>GjNsf0<8lfXYym z2Fs7z!qzKOm$0cAhUhBGuXK^L9|2i?ChaRr$9fQe!&p5<<1R+hSWhb6lRP}riT9+M zdfJ~UEMVyW?kU(|MZ`<)^26W*BGm zdX@&Y-bV`g3UkwOUr31Wp`S4Qih_6m2U(xQFa9}IjeojhCv58qVm+wzQYMR^Fa-`z z7G^Rp-$G3$H_(3&;}QoB*EC2Yy;|oqlH(GuWcRU^(%2DNi8rcGdu;&&lh4eQ7p{A< zST6%t_&?VjCl8HyG;$UOs#H;qUbc-GXCmTs$NHf2vd)=?mKH9KqC*+v@){@3_9ol* z1`=y53y-p2|a_&vuU&1_MdreT`u*0or?H{45qz$EP1A25RM(EyD z2On{wF1v0W6F_D4_7MaU*ZFI>n5l-U;k zM;V{B=E!V1W^#ql9@7DH3gN7Bs*6#b_;Cy+k}#C2@sBSJ24N2xAM43#wt4sbT2#;E zE|G?}^sA5#s0|!C9>kf&V}|XR{P#NTgBW_!LV|N>;YTGi$QD1M8AKA{AssP7Y~ zZ~TeI?xsFdHAwfqWZS+#;#z;lGt%(-zFxpwpTIP~590>?!rW~}QtLiYq}BxIP;0&* zsY>X873y^CfOf?pWC6Y(sm4FuO$SU#Xvb;t{d5lB^=Nz!-%mFTZ^vY|BYqlu9|GSG z82%{VhfE6y&Y=ar#K8zOJ>5RQ`1q6Nc(sLO5ub$5&+s=?vzNRtK@Q$CxCdH0Ic+Y^@-rz?{r#-+bQ>74`L&x{A z8{<10m%ahL&vr7Mk)^OSey6i#1Bl(Rov`Fc*}^zRj|Boc!6WSkUR<+|O4+Fz?5Q((QKM=hZc!IPEg;zm1uQQNWskS?Tqp^Utj< zCUWoYmoTD>B`_qGKq)fvzsnLF$r>1s+9MO#nDr4OK(IWJ58l{7KClL=kWZ?SZ{*l} zc`*OxWIe(hew-SXb@q$|<*;fBdzF$@+cgq~d`5!hB|4^bBqL#^OhrSk*}+=o8VO*e z8VN%_Bf&07N7Q|9lX(Gs5=9qz>prAF?_OO>)|GHbn#MZ2IO6_z?15%IbQRq%b-iGO4kWW>WhrmE>o3kTBh0 zC$;d>Jf9F?szmi7Pn)>~H@=>sgyO!ekxWP4%8G>PcB}K4SO!4i5{leD5%D$W zW3507fZtu~m;BoL@siUkfb41Zg-k;2G6^xm^=^kTjO>(2XroL*E`>3ijhuu;5SLa< zHl(6UAw5jt7js-lgcb%sMMU46@a8S#YKtFd&^ZD1WCn&Om=jQWyhE>Z!hp;PD4KDM zF2X|Z0#?w>1->rul4+BDYnIGplw;}z+rt}gXl{e|b@yIk@OIW<{8^fl6|6BKR- z6lO2HMnn;H-*dzl`Le1OOiQQ~hQ;ST85UT+^Xe>OQvjx`V0yiTYQ0ihI6ASw=e1DC z)wj$?;`WvSaV2;xf}J?NAKDja zEkzlwl;C@9OiYQP%1L!Fo)HG9ca%tBb4yH%y}<{`hu`;e6*a!^N5)S;Y6zw^$TSC1 z`NslkOPtsMZ*gwLOM}65O^F5!_`3^p5N=kJA|PC+1Fe_Z5XiG`^n zm|d)u&qmbo#WOE%--=d9b9S&f)l!*s$4)#n;~A0C>ldS%bmlGQOGu(PlZT^*r7+z` zaPj50Kz@dn99l06u3&mY9ufaCC#m6>@giq)6d6k4;{f=__H^*wRe50HGYyZ(@&-Ie zYDPN)X|>Tp?z}I#b(u7bw#hs&x6S5(xotHMjJDl8Fxn3Dz-T+o1EcLR4~(|kJTTf` z^T23Nm*94F_!EX~G7pTl-8?Yb4)eg=cA5wDEDW|l z;Kl8`KoXYhF=33j*E}%4C(Hx$+h-ma?SOe;v_s~B(T3I;zSzNG_~M74lab{qzVF$9=|pj%(|{RIanNbNJ%YF; zk1wg>WmZ@&r&6_Hr@c(fGJTBDRTV##JdAr7`*^M5Gh>~merO+fB8wmX16dmHPvHW_ zd?(LEwS`U%W*MR4#nT$-C&eMB1||2WYhhO|7XQbG^@)!PeZ^Vh6 zpfMtjpcKnHL1Wv^CoFZ+JW;=~hF;>-L=7J6)L`kYaiUI5slnr%nh6G%IyLA}jWfZi zsW5oDQ&VYhwNo?Q;5w(Ky0=}MoTlo)i0ZcskN$MEwu>!PHOf%cy)lH26>Y=Ns7*Ug z5JO7^F?50rEwiB&Hgvj%f_G(sHMm?dlwQy82QqK?E^!fJJ0JO%j-6)5nw>7l&VXFn z&zT`woO}*ZFPs%cm;EPOCsEt*{Rc!EMhU~R~Tx(ppmt_v3?E=3KJ z_lE-sxMT&HF(nNZU#GR%tMI_M9@z=jm?=`EIIJN zO&ntT870~_Q5r&g&!H^lC^L#B2Q-y2oSJ5^ul+EES2pENC7(Xc4p;;K-cYhKPj08A z?F){zpP~82s^Sp?jn_P~w(WfYZiUqtOu-ylTb7@=$X!<_aIrwh$Q(xSsZU(@C(VXb?2rAW4BBebz(d_L*YsGsQYEPbSyNaAZt798bE#@i>R$ap@Rd z%zE6Zg*~jPF&rT>id9`G#&87p6k|AIXey4%&{SL|LsM~u3{AzA9Gcd?K;LjsfYjgi!jFP)i7c6VeP?$T`Y0D8G`#3r?49!BDV*Elb3)l^i?4dPPGNw z(|ZxL|NBV%hc8L%LQY2o=5movS;ZB1CNS0!W)^ZZ`prTvl@}IZxHF&3!*9yG&b^g9AukOG2bq2a`@5j!dCoqJo8pAE;OA)wK;0*Vc zan~&r{+V_-6`=)NAZP+$u(uzkXZ>*R1&3d`0FilVn%jk#ru)!v#BsWG*$GkTb2_G@ zLBe}1IAOt}JlL#uj)j~C%_0*F6gxk0t-Eyg^=MYtpy#fJ36z<_df_h}>*GJ@f^^3@ zt|6r75_g&kvj?PiQDOD~cLa3>3$4OR8R5kkgXEtuE7%jVf<+fHj^PBfL72Xy;)koC zcg!G-hm(iL%3Z+&soFA=AGmfr*>)VhThnGw1fi8Ydj@Tu2!(U8N0&_qgW|MoS#C|XZ4DHE@?k_py5xSb<**2A+KT>w;L(E9#SlaI z(QNc3`i90FS<^w_#Exay6{#&W>zt-z$+ly@x_g5>x4%|{6RD=E(q z3G8~J^i!zxfWOia-d_Rz3fggxtE^2uT8r8wpC&k`lBs)DL&V9PVVPa04WG!D5qmxz^Hn-{TZ1J)G1Rx z&J+(p=t{PA`I_YQAq2|Po^;qE-|p_&7|Ezq4;VOz3eqJxz^*jaE3r}dDfKQxX04s} zwT6!bzCyj^xjncStvDMWnTctLNUd^(VwDvHdx&FH$|N^z1doBJoi8W7k};bG2l8yz zo=TR$SNp8Ab_f)LWxto=Ff5w`540`C2neSdo52?7)n>V`JKSA2da)~WTvem$%-qza z#OdUnG|7Yf4J0n694R-BF#As?IY_O^QkEH`ln+QN;8i_<;Mo)49%cD zLo?Wh5(ecA4I&2cO{oN~EgF>bGtfgA`$L)hOd2MYH&J`%t9<8&cu)!xh+CfVCcqNQ zJ+p)I^q7mUJny^?Y+o%;K4RrxzHz-sew*&_NlT%>oBZ}jvJb-=U0eaSIkcn=>s_}J zyTNolGf8(y$Dn3N=87GiKZB|j*ukcJYRz;zDg2Y1Mc&<<{o_G%_Kk+*K2d9~Kabdm zjr#K>l(|xY%lf;uN=lFwcPl+psV-uz7F9Y#8WPC3Z@fU2p0hqr?l%rRvcNjxGnU+sN#ewpcgLSjQbm?6dZc1Xz?S+3azm=}gm9)?tw zi6_I0E_>5`q94rSJBXz@m$4ZN91dX82bift1=1ah(N&n1=v6}`J);?Xwq5*d8SX{o zMqv$*iyMXVLCTx`nZD+~|1Ew~^Vlu|zu~`=O9FE|dPTjzLN&?uoTcuIat&h$y|{cn|YhRQer>bMC5(0yt61XnMtNrFQLZ6r(5xt%Ct_+FcoE` zx;RnftZ31DVmtkhTo4tLRWaE#Gt=y|vj^7`xtV zo@r?A=2@zX`(?IrsF=IS3*Rp}9P)D*p}I^oyF5^#zVFjB)W4^PQ2%x#au##J&DpQO zsR7_gLRsSb!wGEuiFb}hn9i(OTP0?@8cj~O+kF$NfG*@BX*h4%eG^8r`zDOG)gNuU zd0@01=7G_6ng^MM%>$$TzuGF9=`XYa464)&T3)Y%Fu54w4dubW4 z=Is)RrAq~UkuqbDm(_Ck+G}>@Tk|v5qvpzeE-wAC**H$!wzZ7u&K^GNNc4BI4@YJp z#guw+l0pW}ti_RGXRSWgkh7L}Sg`Gwm-raUNNo{$Zt7o(G1zY^9PB)_rqtd1$9<{& z#+(ZC`_f!=*^T5-=2_@U6Hc{e@+i!;Rz{j{blZ-zp|nwMmGTr2_351-@UwEEGAv&=o)pF!|a33T7@9>0!-AqKj_y#}`)`<&7<9gd})*;SjQ~?l6-5 zn$eb6=r?59zy99!%ltXcmsp?D_m|wqCg7T4e->bCs^bC3LlIq_2yxnXAr{CO@LXM#ZFx}f@H*bVMIHN7&z@>X$ z(31*ol7da)-4s;hvXP|B_gzC?`0CmW!Bjt27$}-jV#Zalpx;RhqBW^4Oj*@5*d|kS zd{FDn<3Mh0RoJN8C~PK!FuwW6@p6OYksFGk4}ZB&`5>n9Urcf5 zOH))2x-H-~Lp{UnA5;wIHUI(%`^`76Ui9NXjV7WF2mR)eO z8*ef8DPsNII0Wq$DC-OergZK;XmhpqsMp0CYL2zP)huJY)}js>>`^i8AWo~=ENQ>u zv?|*Gi6N`G>+Y9j*PezvB1Uqb2+noK=6>5Pt_@lB;7I)M#6z|huOBTcFqzMgmi_bcn2IE;+ zxS85BadUgy-n!dn-OT;r6X`seA8)|vZ|lA{wFpV+{<5LidV2FwvdQ8y8X(AqBidG> zw-tF7KN~p$GFtRg6y?5Y)4G;r&eVyzpb@vLzIlQ|bk98&Z|ES0;%DS&QKdW7Mo5kW z188NS73YG_r09I;0q4)8>I+@PgQFM0Kr1qkEpd~9XN{vRr!WYa0XAwcL}Ko*#A(7{3>ArJ#7_H6cTSV;{yVpd2jv9IASS*lyn&nSM)yn3I>p!} z04meR?cmtS_O_E|cnK)pK#2!chu1&qgAT82kX!E*{2s#@_zYKa9DXLkl@?tY_@5k^-5r5D5 z{UcGM++z`l6r?M1mhmuX1;xG?48GuqiL#7iVbJPS$oL4+WkTXf1E&!Sl`w34r#@oh z`BF=^C1(l9I}5$0aD)I1V|IGHzpB1)4Wty>q2H<1n3T*jWE&>o&O;BreT3vvk;)9@ zD4edXtVUcD$vZZ!Ou)pAGa6$9n5EdTFg~K&F!pSbqY^n9pt6$4P>>DLv&9}~0&+Pt z;cNkAXA7t}TLA1AR3AHZzUo_5mfKdSGDOCgT>RA!nXG-WIgw+u;C1k}o_zQ$m@r*C zT?X1{G(BBCo&1-S=h_?9Zf{h(j_y>K=v4P?H~io@e}^}Us`QNALnGGebUV(yz469F z)QEke5#>}h4rID}V^+emybxj^!3z5;17*mTX_w+6Bc9;e<*dq%C%8EQwgv)dX3!fogBUegYjX9kiGTIK$q(Ov^@=Wk4l?54aOw;S z7Y}Yiftk8{J^@T4*sMjA!KzvgY^c4aL8lQ84s7k?SmgB_x%?jY0HxtR>}wAs*9HS? z;NuPB$YOxHAZ!lw*>1|}ZP!1BGX9qB6OD4#ejTa%T#ke>VHrMnJ|5wNG`^~le2`wl z{U9tg`7o@$v%1`aphto@Dp^SLcHXt_GS=ZFCon z#GKl4K1kJ$Ra@`8``!kF>y2^UWI^Vt%$1qTGjGpamU(ODl8oI9^{q$@t8z27Q$+4e zaMmfJ)MS;L;(u1*U5G8m{lo`}m6U7$aM5b5R9VpeJ2Vdu(#e9>b6I0Sdj<>IhZ)**h^Bah ze?ihM-k)q5loeJ+KkR%VaV<(C2P9t}%QqGX)J$J5G*_VaGW;-h^7Vq^&VJaFT+npw zfr)3ZB4zw^@jDP*sa#F#GXeURnR zu``G>y;2MoQ*i7&K`brf5wqcoCF+xgGbn;DJR*YAzE4tkr$Tz);WkCQUlNF^6fa~R zB8FzC`6x~0I?S?#CWQZN39~+uoApsF@v)FSmK=;0cXQ{a_{sROd!C~+C3#@bcJK)wp*&Dkllx_3M&AZTBYP|5Cd*o7A{9i@2(bKD3tn%wM$nUa6@5cBOgU z0@{w@&Fp*t(vyzu1k>a;shzTn+bI>^S=Gg2ij#LiR=S(kgBv`Jxf3k3{R-{96OKob z3A(0mK+>6+Uzlv$6li^Gs%hsvFO*8BN?5GRDIASGgZR#So-37pAUR#g5fMnqHw}^Z zPLyMX3A$P$CxWRb8QG~DgZJadV7kxAI+)tq1#UR47lu>oHxbocsB=k9jZKbNjz6L~ zjxOnrtw+Olylun2)oC^b2yZ2i9=oja=%6V=Zf|Ed-|s+#y-o3r7yHJ%_g(;D%JEND2F= z>Gb$5VdPf8w@GkUn(H7b_%qdN-*ERl^<}cJQo2w5fdeeYcD*Rc?W`2ucvL0n4HKNV z$JLkJxO;-@Xdd`JgP70`I9^Nlcs5NHg_aM z)^c;iK3CQRJ{GTZc?4s&N`GNMV!ELA#oQ(v1rP@qym(O#UlA|r<&4Rp7mHMNFjm`T zBWz>93n1^3y$Mr1E||?Kw5qD9zwKJBv#V{rCPI&cQINy|C$u>OGv8WeS@oYT_1FFA zGomBv*%sNjO>J3A+=MkfL|ac_74?1&6Q&Fm-PptjL*Z!SRweq%J*3W!NHKcP7^Pnb zmv!frI@=}p>nK?&DH+$sLcZ;XIcP)@k*_}#4re;9LFG_tfDCeGWDMg6!G`xK^Jajb zj@h1m=rd+eU~nQA4l-Nv(l-{<>n&L_0At2;4ufjnV;O#C&jfj^DyDTs$!@DcEQWBm z%{HhN%A?y+5O6Wx64oyDiiPGx`|8*}>7;7%MNjT~RqMtjHE4~=FUZ@RIL*2FqorP1 z%mrC)?m|Z6w`{T*6Co2D5$uAOYcZ(&NX!*B z$R1HZTdeJcHp|=aUYou8v*=V89c$ooFn5a10W?xzCX=J%k z+T69-W=w=kY^7Lha~_Dh>?|Pr>=N@y?rTOmT%dwMOmC`0A}LE;D4Bj)J7a2&^|Ci2 z$jxp~Ya(-}C?1;^>XV2qOqt+ukuGUj zKRQ}S+<9M%nF^Z*(bY?JE`?K@j$2%sV=7L!0Bqo}*uedGqoEnPuv?5@z8aD>`NALD zpXy-l$unG$IPJt-453aY!{A6eveKRq7E__*KDjiLcWQ-_`gOT^o~N-(+_aaxJd zSzRJQ=*h?!5FS8J!YwY%L*P9sGNxc2<}B{~44FXrX9`i|!Q!X7$UUry+FwDE_3Mgm zOFs9P8a=yfcq$s}i3@pr$Jxu(Rch;nJi&uYyZ8_rw09R^H!cdL%&obZ`OD-e)KK{$ zG^b#Tq;r_y;-hGXvzY{^iv(DEd`Xl9{-xVVvNHfcZY&2GwrWxlV>EK|4VIF1Z-oGE0WCFOiaE(Hu#dO?7_K@*sM5; zf#^5;(4UR$O?XvO4P&bs$KvDL?o&xsV~Lzz`YP+kffke_R8h2_o{pLcRkafk-F+&p zsx6g6RS%+c)6dIU4fwlf%&n@QE1`2eBf>MKQ2Y=gw7dr@L5{uPB2>J%8A>I>so57c zSIr*PoWNlirQ*F1tnwtRE`M=V-I&Fa@p+kVh`{<==h}aweY-@Ca5b&oYQd{e9>69d zUUNatSTlyVf^lMX4}sBWu$;F2Z;fB>V`0RZ5yBz8nnG?xa_&YCjVE+l?mIB?Oq~d$kyl6miwOlmNpX%a}P4?35;cO(% z(F?R0_GK3AXq;-|+kuyCY>Lqk;B*Zl2&^slymp#5+m(qfWO7W6gH z{-=U+Cni4&;Ldkh(8q0Omj%F<1;7=;f`L>Q>m)1~a5fUFS!U7=kQvL!aPPbkR?nh8rF-kyy{#YM#Il9h z)C+TU0XpLg2$gthi}9SGX(f!sToa3FI8Ez2DEXOY_PR&}%_@^n%qp71`c^<8PDJ|+ zQ}@KP=24J|`Xq;EUSWyh1%J+j8ly$Mme6kTn2QBQ@GQTbCH-nRdg^7!E zD-q08ORdRlcO8S-z}sX2%e{p*bGT4*@YokLwX*u%cYfKk%9-}kVQG7hVCbQ(ut)P@ z@IT2XE?neYgyPN{_>7Udwh&g_)o#@Nau`%U*`8`=@ULt zqlk9VlTzZH!XR}!2NMQv;KCwhu(0JaIj8P-{)c+|(a#w;j0cLJ3?^T@nRk`}*5)M# zXCM431{RLA5+5=!ia<~YlAza;BCA+k53kHr(V z?yLsHARGC8Bt6e+^~JiHi$W?+uZm3k)VQ1MCEg2N(Z zxcG~{0Q{MwTlC)01UJ>D21$2_xFOcrCkA zhs1FpxK15lFAYz+d#hdOAFq!`zI#n7%|#;rQ0esg0L@eU?Pom^yvW(e#gK&AOV%iT z_L4QWdpqoX{zSXvcN{O*M1>dO-RUyQ!6g}+%+Ne2eS4g$|o+Uqn#z} zp;fE@xMiP^;i8A@GOG|Dw`rXRqG)fHoB4wT$vj>IQ}RSkKY(X6nYn+8EKnR z7C?u(aylpq%!U_oQWCP}1K7JE^R}5e{OGGqQSV{0o+>`XcdFQAzBn1cvnPB|&=k613lDMwP$3K%Sg44g~z$$DVwc zZIz;4Zf7IMB5sFJePWY^b}hhqO@}I?mRmlr(#193silhjeX)jmztpa4r+&R11x@ zsI#FBM4p4h?6N?!6}H_Bw%+psU5Qw9&sLw8VKc67a~puq^SBxtSGT#7q`BBF^NryQ zb@|D1wfP=%G)FQ=b7ZA8M^<_y=0urGx@H{z5&o8vGwIq1LSRm1w)w&mdH-3~vzQ4= z9C2E~Wg$1GyPl)2O-Ss_sB|CeaZ1ca!+~B5XGq{!rxq#z80T+rI#pap#JB)0YUsEC zjjl?GgGU2%3MzAEOgDAdEOn@6+78yI{Du8gGJpCV zHv*f6jO&p-19vX8A19hreUt}|T|Ca20dqp=T~X*IXGWa~nvEB_kehidb2jcakGSKd z3)tDXM=9yr*#N5C77OC(^alh%^L4PI@}NGvMmT;N+{H65dKr+5SFk(<8wRQx8`@ex zlba}b$KY()Wg9r$LuUlrT9;qPdn5-Azk(G7rjc-JX0So{KXCX}*nj=>8qU73UR^8x zbTe_$pk&gYstFc9&fe+A)@JWI8F}CW8nzV`b!OCakFt2f7CevvwGHm!=^D)U(5;K* zcxotlXfYff8N4$N9rplf2z=%N&VD$(8Y+?wVtr6=9A}zGOWw{+hKxeHRu(!as4-h$?CwO@$*))nTs;q5bWB6wh?$UFb{U z4HsVSVixVOHlJ^T!p^I_Ke)ELdoEJR!ubr-@}0BJ4}z3D$lpL~L#lHzKtrmV&zNeu zw=o6gpsdSQN-Wtxru~YZkdYc(8jLTZj@}wwVav1e=;X$X{||+bW4C zRO~2scQYMo!5P`wt0gExtT;Bi+hv~5$E5XAPOyfS6Fz_92h%a?m)x2s_shyrdTySt z@uoN9`f?X6aKl31>b%w0 zQ}{80>g)K44H;N78j2sUp9wm?v_XDi2sAe608Fl}&R;!Vm;si`)yK#q!h;T4m@H(GK0 zR%WVvGx4D8Fv>=QP?l6BgC_mZPY~{gZ(+X`fOp+5|r_;29{OYQQ^f~dJY*fcg;@B<>8N5-~jkor? zV>>W_a^wUS|DI&q9@y-zOT_3msEV)Jle69Wj@&%AoYqMr2aile zBAiz-THh^9`P<${LzN22RbjcKocleT(9ha$j_8WyLD3kkYto$|j(BG3X`N}^oncU+ z2$$)o_jHfb83ZYLkiP*Loo-}DGQ#NTX3mYNZOnI;PbnaOGfYcTQi8ZK{^Tb_wMI1(ksbIF$gG4IdyQWC{c#Zc4oe${--E<6p||BY+;M2b#BpeMJ?Xo#T1Q{Zg%D(2^#G?sRXn@~ zGY?+*7|M*oLWF%JTWdU@;6G(MgiR`*4RIak#t@+$32K(X1)A$c<#cU)mSEPQsHqU= zHGGQ(Ya9MaeB-m!(TXDuPP_OlnV0ohVqLi2`Yf|o;No)38c>i2^rwhS_B~A8{Tthj z4Ptc-p-CYKlW9^ob4(_yL8uq7gU4bZRvbZ$XnS{w$JvETlh}x#=BSJ-dYwZNUj(?uT1- z9)!OT1?EsgGDA_NqCTEch|a{)sIV$VIpHil#J71#vZA84v9;51f>#8^R3&@=i2fY+ z`byEGdP@+O1ZFTx#?~ll<^As28oqE^Y^V+S3}KGpE3LV~^eL(&XKPrI2Q6O&isw<> z4FEPvtStHLh;PY`_4#1VlHDpX%}@K!PVh8AN9e!&3{Q`m&dbl-NlzyrR+Y}i-JdR@P%5F1*MCw<^ieQJA z9nN#C^hy4i+R|r3y8d34JRs-s2Dq2_6V<8suo-MfUzhcvxZOcf`E(Zr8|T`uqYzNYwt|o+7wWrfR=GVg`Sf<77xn%H@x6$xE#2KLoHCrfUkWj3 zy%X$9ZDU=kwy+?aRpbmMMIf8Z)Xe0wCO>OHrW?7My0u6nq;9QukG%XqJ>n=9?-x~d zxs~9YDQQ@Vvdn~$6OK&HJnG|rvTv17fB4ohsy}Glk0)b26+%)8N#qx`3glZh0_4Dq zJ!*h~f^UXF%MCp3LhQlXmltd%^B)_Ngt4Q6qEWg4pa)*or|DxmQkSW_HInV_wZxX_y16 z;@evi094l?p^=z8(;eUY6Q*=obhG8 z=8P{fdjf)GhFQ*OH(Bqe+`oL)^X=6O!( z$D%#PJ;zm{yMC+pr7y{`z-0c3-r0>UD|S?4AzI5VE~7taM{sWv3=H#_B(7|L@*GH2 z7d}c$s3wfJk2 zLHKvN@oDRBnHR93Q94}LAU?mr+=B|jVPnqfGn0EGccyL&H_lQXfl^RYb}_2K`jt41 zWBn&wrMZgz8u9kWek95M1|`2S47-fy zA@n?UN<5tNVWM%gfK8{F57ZVT1d{wtp*rD)w*s zZIoEgi_3dnZaewn@_$RkPEsaNwWh(UEr*ar3k{c47oqO5RW%K*!8%GzQ@qrT>T%Hk z7PxBE9vQ(M6c8p@i$e~!dT~UTt1z0aysTC=u=JPbU%}j^2cd37zW&}x&~i;atz6{A zpyq7TAWk|_%678~;5JuXrce09m{PsCT6r~+4-3glj2mg)#N0M=oiqL@_1uMA7g^0o z4^EbXL;YC<*FPUb8oq3XYnC}T-GxVPis3sCoGV3&}i;{f-7=@o~vJ0J$9_3SS)}WZw413yfxs}_$0;K*r67E2{>@N-VAP2KrLdW5TI?+w&b~chm13xdM%GA~KDDD(S zc0ueEZk@`E$$9aU8w&hHPZa5qck&s0MemsTR!{6$s=my09f~_HpXhnJIk)F6dqT;h zZ}iSa7Tx$rjGWfUehm&EvN?)n-4V9A3b=4J;*m?+z-Xj2nKuF56c%~ z;+yc^ajJHlNmJ-_@{=#ggZvF7Y;8QHA+>py{MhzE#K9Gd9PFDgvmE2xWB6CnE#IVS z=uBg)IZEAetOe4C-C2B4<(=$l_d6;f_d6<9lR9@TE`6Jn6GnMK(Ct;I`xRNO3CR4zKL3*W$g{3^rwS?qxJL2s)CZ z(#gxxK%zf_ODo8n64Nk^Jjw~yf?HOqz={>N&^X8 zQ^?Vn>e|4En8N9GkfUgtR$KQIf9aXonn>q-)%hCWsFHPIqQRB`NO7 z!Imwui8zg=v~pY{(QnjgWpOnQ^a?nJ3%AVI+tj}6bK5`G*Z#4bsigga-1Y;@*k${H z(f$LR71@4$oGXuLzdlNv`TaS4ls5B=mHH@c=HU!H;&8?U*+2tEQ{Vyty~L?6<$E!D zc22B4Be$4F5n<4&pO9)A%elB#+a&s!{Kqjs_66eUlWaoqRSwMUSE+vmRA8Z1avLt^E=i8nmm#^W2ay&2WY#t)uBpY$M0(j*L z9q()|1VC!!$N5v{0T=@K#x|2dPM?U#tS@_Wc)$?@BW z4bVhJ1;U1LNnt-J`AjKf4$CUK=7;1$E$c6Xv|!mpn-?$3^JM>!++pZ@v%+qyx%{aw zF?pL0dwA;!R_{&2-@+prZ<7A6g=0Acb>Pn4RwG4B|A{k8jT*T_Tn1=R7DHjQEri7G ztb-(Ij~k!Pa1-C_c5Uw$b(Dvkx6nkwAoCC3EFoimKgQS>6fvsWN&q}2=YLPlWf$c` z?F))w43pYGHDXKsaQ>jE_ZsA)ubzRae1kNY{RU}w{J0QB27BO8xPOQ5t_NixaETQ~4C;oLO{!J(T9Vfoui63<0hn@I8FLL6~ zb;ZB;tlBH(FF4y`%wXGX@*9`mM)_@$-w(;}NAbJJ*~V90y0$IAZ#uReRYV1X4gce-g3wIAd!OJ?4h(mJbB4K=>UNM^{8 zw$a8iiVY0J2F+%w>G;-E)8+#B7MeB-d-Zgt6W_(+Wf~|%CE~kj&+L-Q#&+``q;j^g z0q(aQWn(wpN!v_HJUOEO}6#WjniYLS5^hjDh9La>4;*?+s;=#pK zH-D?-P(pEXC!&mWi_Fd{>H8ME2fDpVShhMpvnJKFy{c*JYAls^>Gn55$H%v#TG*p% z+Aik^b{0Q5vuICh8@r&OX-Dys`Q?XoFS{VVqbtuJfLmIMpWONua7} z8^~$e-n#7;KcG@uNPS1ZpsCd5KtJvLdRx#8j zc^I2sgPfjz#a&Vvg18h+oG4tS3`nOAz`299KRF^2( zzwo{yz5bp*Mlyy%30@=V*&5DjO`&fFrP9Su9&dkDf@1w$4JIt?h8=Bx#VxjL20RIp zuEY&Hlsr>mGp#9bL!&m=XI?`+e0j?;DU@4k@=pHlVqf+}ZU$vG`$O}*>@iT;B~wfz zYR(fvEqtP&H|7;!B=&c~I%Kq3?yrD)-gu?5+d=iE#wjj|=jDfEoupvp&6MZ6`N7U1 z6$TNh1#W)$oFu7l@lsIRM(wJB8<@|9$upDX8TLJ&i;8|t!C(x$fov?smdIjiv^;G>TO0 zb&`6X+g4ci5_kVqNIm{2p1NjG{)(ThcZ+&!xl-|ADN^0cFD+0iK2JgFTa$Ec3J4nR`ukcUprEWP_C>19jNWIuC=StVhf^h+l3P0RPze*INBHmvR$CVQo zw*Ov5cc>sX*oC)kUGJNhjsp%(bWK-{Z0yb+uEzt12MU@7VMieO#vq0j>dY8HaNtkB z`_ZqU5fB0`urYEWvj1k*pp)?yc89Jz?C25DjqohH3ignCgo?0mr{8Prtik@R^#mM9H66(E1jIHZ+cpHe4=wn70N6gL>u&0D7yk#4 zeb!bp^f-?QtVi)(usAmuWgn(aj_At-ISU2wgNrME@B0)M7@i@UZJ*O0c#O*ycl~pm znCT+UmJ|MT%nurj@p+rXNcoBVj9nyn7I~Yb8=E)&BDVH7h(*V^V4)W{B;QtsHpe?P zyW!`QQ|#uu>q88OvuDj*sahzt@hH+&)t9tzQ|sI8VeSPCre>5?)tAY27oYbLr&rZa zZ(~fyBaW^Lu7;}7RE4-yw1wL?_kc&qr^T7G=EGX))aG5NPSq9?CC;rFU|cLUjH_xK zC+DlD7|MjI#tCiA=N&EuFYBNbH$Gq1ksQ1eY8)NK_yR+97X~sfwZ)r13fLYUs_tmqCWyb%+Qu0px>hfkpREDsA)qMU1!k^7Tp9y9!3Ip z0BKE|fwZPefu5Dnb(Z!J&_4_9la}^*i@sseK_JcV8K5JQA`SFUg1!%=_4}zsuL31v_Dze+lx#t6M!O!H!5&DkmlC~q;+`& z=n@Hi6o`J>NZ?7JONDmO(oO>XL`us5oe-1-FyC3MsQrhQiye|R0 zUE=Mr@s0y&O$#wZl`oe8X&DoNw2Yg8=;9j{r~%S4?gDy2%D@(?8}Ac9mrJ})+IUX@ zX}>)Oq&fcrNOS%b&=r#6cR-r+Mdt?sKa!lwfi&K`fv%KzbwC>LBS2bvegx||NwEb; z%lI;oru`OBRMPGT(zGXlj!TL^+IVjOT_y2GVc=`L>w&b4+ku{w6mx;Jj0BLD(GGOA zr0oLIv|j|$GLG1IKLC1%#QTYj7rVfeaVO9?2~7ZLe{2NO(!KzsrF{+P8j1HUAT90t zK-wR_vGE3hu9bLi*m%)UAn-%bB7r)f9|&3lq-A^-NXz&N&~=h_FOZgT2M# zB9NB*9iV9vdH_gsp@pWhb`nTs?YBTGYZaLKZju!52GSI_0sUD@YXX`oGT8$3iqJj} z)FbFQOB=8#9x?GA0eV^Dy$GbT@peoPisC>zTRmWDk683eAeGJ}CWT)jmr;QwQ1+vx zE{_2Hlc3K79TD_Zpnn$hBv4Awt3aAd6cfNt{4d`Ym^^M;_Cf&L&B$F>_6_E0(6G%C<4M;h(3rIQiGaz0m8VO9tWE4ZrqXID?<7D1lm_RQT6b8~Ri13jt}o zaX>FfXa~>?3H>~f+8e(Dx?O000MZoKR0aYwg*FjLX?Fl=Y3qQr<()t`O6|7-Y0IAn zdPPcG0^>#PgGYfHC0+r{6Yc3Mf!v-3s*=z~pqm7(2kMp@I6zv1&jI~Fay|q!UEm*$w}4`TdVy{gbUr5YTLj$>q;k~;r1|{>s769FK-$Xx1bUy;Ac#r7T0$=c zdcV-Fva}|k2BFOb;%A~GfzJRn3hgmVO9Rak+6zFM-yqO?B*j%Q4(^c9i9j0qQ=r*G z`&Ubg!#HRX+J}KO-nW3>ExG&>NZZj5bf?7ovyFFtbs+Eop+$f+?Ug_u6x#Kcb}P__ zgf`34<^p|KX!ls!TA+^zEoo_6fbJ674omw-ppOde2+++^)8jxN6WU8aT9-cp%@G<+ z45eKSG*@Wvva|-Ec|!Y$r7Z!PFSJ%m>i}9Hv~ElL98j~+zHDhv04)^ScP;G|phZIK zv$SHEF?S2?Z9rPT+kh4eZ5EKW?PEYogto-S`x4Mnq3yM_p95*Xje+r^{dO79JrZvm zkd`qCXqnKaTiOhuLb`zbv9#4d_Y1Af(oO-nyoa&j@*e2p5^o%kmU{!x146sW z(mnvxCbapMwhHJ$p?%!ax_}-M+NUk;F`)HA+hb|p18NuA2_TiB9-t1PWo*16ObSV% zg@LqwlYtuYXz|M2ihdG58HTafwUJk0KH$@(FOEAL7RZ$f;I!q z6torSc0t>LW(e8=beo`^K=p!70O>r_52W+V7)*>h&s+_p^UN(kItS!qVpKV}5JHniP_9=4&!fIca${0We@{5L?eQL9Mc3QV+`UlWj))(oVjrGP#qX}1Dt z+AjcY7TRu0`!>)Pp&hWazW`|&AH&3bhm`h3phqO$UZ7b*dkIM6y)SO+@*t4Th>rj% zH(mo${$27u!@nDVlz%q^DgTxN{QzY|0uKVYxmemSfV7pr2GUkugbDQ1QmZS0v{to1 zTIXh~wqC*BF9DO!LYlC%#2tpXYq_$1H@q5U0DtI)m(v|MP91FaF- zKA>en`vK5Bf?fgotkn5eKssv2z)a9Gt^j&P;!OlvD(EJlC4v?JEf(|$Py%RF;4z@P zh4yuz`-Ju+&?2Ed1GG@kPk^>dxxWC?a`Rz;Xt@^wy(;mp25J^G5om#+4*<;8Xo)z=m!Xm1TLFr&`lQA0ewNz#(`9Z?gr8k&;q1o zYy{en$6R&;B?UbT)FG%BNLN{Z1bSF#h4alSs|skRlu-wyWh?`FOlS#9+XM6@Xpz8w z0;x8;WPw4GfRvN(1=3M_JCKgrc|e-Bq}kME98j0kr3~mdg1!v2QP2?}N6hc;3vC&Y_T|I(n!0=+=u4UlkmgdiIuQ5=p?v^omvHD~Ksxf) z0BO#9fV8yl0ckF;SlXBt)1tQlY0mEf`l{sI2J|&S{{*CM`wyV63+=jAlk+V=n)524 zJrer7MVBN3fyaf`1oTZo+br!TmUjLcoO_VaX%;mD?GxGti*^D1qtLzw^d)Ke2_Ti1 z*MYt)w1WE#trF--&?15N0Zo#$OM!Gmtp(B%wE;*+)ZYQAK0N}Y8uJ%Gsxf~LbWn1+ z1j`!D`O`o;X1)pZLn-ZFfK(=LSZCs`0ZL2SM}VFev>WLAg7yOaNziwJH0R#|X$|u3 z#~!YPP6E=ob{5cwg?6t+zXj5?Wgj=C%>>fY<^ySIt1ay_K$_wJ&}hl;&p=w!F%Ouu zwLlvB6p*I)5zzIL;@3dh@(bFG1$rgWO%nQ1py`4pJ!tqcALv=3t+VJP&{u`_)`!g4 zDg)ASITuJJ>`@?GG`Eth6 z9&9(Y-vtztw9f(ED`<3wNjn2b^V60K*t5G0Q#YzLqN*Yk98XK zJs{<2uSK^#jPo0k;)_79N$n2<{ZwcZKVkNT?(Z^tV~+v-TtfMoD@`#3^bbfoDo}(4 zqK=tsfL@k(?*=+0=w6`LrHqY0yCub^fi%U_Ks^%g7eFrw`VXL=2`b%ab}427y(qLF z0%^~DK4tc@eh8$r)td~huN%jfCB+*+zY=uiC-EUqLGJ}RBj_VQzZUdypx+AG26Ud( z^m8`!JC^p3Hr{EVKS+wVe#)R*fxaSX8!Y-L(4Qq5tARc)xl921n$V_L+IubSc1wHp(x6i7?^KbE%N(%!kvlv@U* zrQHamxy%9@lDe$0Xro2DEqdOfUW=~V4$Uuh`3}%uB$vELja)^5z9FHP1F4iu2U5A3 z4Wx4QaUhkePXawIDLxCNDV_pSx%wfH%GLLe&3rF>G4HKjuyXmTiA$Q#Uz-f@ZHoff z9}DNTPAsDucPSH_S1(-9x@I8=0a6R{CJ|=+O>AB`KXLcCJ4npO{{?x+v%<|oAwa$R zz<7H8sKHVuu5O;!I!_-9@J~VBZEo1duN}PIh4|-PE@Yhiz{L42m_hZAB^2cKo5!qw z(c}Qb`M;KaCs5F(Ffa9muE)QU4+-M!+Tc=9mRG?*5vT=u<(DuPxcRR8KBH*d9k*6a z#(#X0I02rA%9!Lzz5fcMhd| z(#c%P)F>F^&$(jKUAdGSH|J2MOg@xLxsm4%{rOC-sLrKK+mJ)Kams;Q%Cr+Xl*)=Q zy2hXLw6f`0l=8B&3Vz+ri&I`UY0|!2%G9Gdl*y9^b1655kcmH^@+p zPMH!2WmBe>1#>8sW#L@Pq_Me_$)&lJ@`_wa1r|FiclfN@>b+2}}qL?lY3 zBqA7MU;++tNCZajbk}_Rhm)k{C1+zSfJyvK&EzUz~wh3 zZv9`(#ied>@*Aq8206u06aYK&1**@%_HF&pv0LbH;HVyzcFP5|8#- zXYIAuUVH7e*M6_`Ll&;}Ll&>|K^B*8@kd!d*rjY;*Pm~$fDc)ki~cUAeE)u+HJ^rab?+B zKct-d+&wrI9e&7y9v@`E;(i}wVc9-Eq~a+bv${gB1nbZ@4W7ry>4z*>?t_#sUh9KYlqUR; zvK~LAoU2t``BauxR2=X_7993N?l|UyR4zE-hb-j!R+I9=#p7N`S@}Y)ay4+uDl5W% zNacJ#WI?45vY_HlFQmM5(Q+T8tZc0hQcpbv7#!XYoDqM~xb4_UmZ z*psh{g$sB1AfV%eEGpyOXNEK?7A@l0LI$L=w6fF(DX-*NLMBf6LLL@jKo*qUG3tYq zSCn4s!MUS!!4@xM(Sn7?{E$VX9>{|7vdZe~Ogan7%NGtg5V(#q*U^u^aBtw@^Z8@^ z8^k{s@;u&-cp(3Pw-EB6 zhhSpi+jjrEfaT{UJ2*QOwmtJAc&0;ux)9D9umj>kHsXzbFCjBR4XyFkuDDK3)9Jx? zjt;o7zKFL`8=|Da9(FxESQm$VU-f7@v+&&ud0POoFaWtb09hY^blVWOEItZI7_7Pc zd@2y@Pyli~02v8Deh`50xE^o5iYOE?sSEiy8*~(0P+*kDODV*)UUoO z6dFP?Dm%vf%>zU|I;ZasKvo4HjR6RE*L6T2T*@B<P>}0G;mzAU_E} zu0&tZ%QJW2^+3~H%H@Czc_7OHsa|N}JOoJn9VX;4Ksum}E}cF=j(8y4&o{W(#Q8EH zBOb^wAYKk%2tfW5kRx}Rbc(L_$9hKqvLpam9e}h3AWs4^gyCB^UwZ;Le+su z;?$Xt7XTUcKz_WKRHcC;<6-0CFY( z`AGnBRk1%8r2)w50OZjCG`k;`A0yCG40{j<=NN5YIz{n1LEd_ zJ-ZDZTMY<sLnr(g(=;c; zXvIcC_zw`8mQbAuDWlcm+9Kl25bIZg&>07Um(WpAo)C!U=M*67(U2DasotbgSGo8x zAU!rjNxrZII_81g2FOUWiluN?0fG|>!H=fg0SK4>yO2GA40#}5Ax@i#^BqFu(R6+o zfE1vIG~|i(9zcrQO*(f0GU9=31jI|ZACUDOW~?s*68>!y@&n>{AU_A>fCuvS>;04? zfQ))@9tz+*3CLilN=r$8kT_jt>R$-N`Z^$^Hjaw*LI5Z4P2ezLQl10Igbh*UbsHe+ z(Q>W>q%>)!{y+ey1CS06&MrWXcp!%Wneae{19bigkZ`w|){HsO9}i?6AYKkv0Mg;X z;STLV4`d(^>rVkW;=%bQAU#{m)Xy^(4412`d2a@X9>|*jDaPs|7pDS{K@Vg#Afp~g z2OvFIO~hELygmj?^<-dQ#(1F3*!r%7nZK$fyVM@5Jdfao+G2 z=(7z`nlKL#^=M6aKOhG@vDSES8X6i~T3VAW-dLR;9Ddsd$Y5HfuF~2KNOhkH`4VG& z)P#J4I5tE{>_tF&JdpolEO|7~B{$&pViSr z5gVd3YA8VGZvmO`;7kA#{)8#RLX1UKdmy(1(&2%u2IPPT(gw)H@0fIU0y4PAg#0f+ z!h20=d<_toKhOR`XCu(CN(YRq# zLu+}rfZLnm8ydP=+7qDkNJCq)wISIRZ)(`!g*ypj0>G1aS3^^LV`H)f(D;VVtsRNx z_O?gkTSE)Ke?y2X#%03Ct~HFQvoGy@IGn%g9Qn$x;CaN1Gqz_96fQ0x>v zFyYJtaq{4Sx>*i_8G7Mlx))}G(eZkcVStI z+>~REbk=MZ=3La}@x~5YTO_KF5t}6?8s9fXKGe|cXkRX!)fL2103FQ-pg5Mcw{2{G z#FnDX6|zP>vg@KQ0XG8>kD_=Fs&Lcl=C(&_lN&e2mC8x(mUYGz|MDg|LQW(VRUW3a z1;+%~DViW8>Abp`R~dCpNvHuvp|Pd9Vq@h7JWcNVqEbG1-`J9%$uwArbzl*rQD0fm zYZ9Q-ij0}G9qGZ0MdOLaIxNnl3OYJu5Y>gq?}l(xdl3A%qHU>a8{Fz6wo;5Vbid`{ z#tljlT?ADGHOZ#tc32WvTBFK~%`r;dsjHxh>_uAQt?{-5Y%cTQp>JY>EE|d3-woo?d+M49UQhsF5v4$>XqL}3yM6=sjO~+8cIwvh?k7^QrPqOvlc;~$vrKG!- zwRhHc#ygAzq=Ge~9>R%N2pS5*C?W=lVyl)HsMJAG zhbi>bP$RgN2Z!TmBaQ^Py}z+JL0z*I#^wp^EC)M@#z)|ti6f-N97Ld9 z2WDqNGU;fPAAp26b+#wllZiEtH77P~@?ggks^+XwV$(#Z>8MYH!l2XZh%+@->L5hv zl8Luwb8`^5G#Ovp_;5>Hec1?0=aMwv)c4%kg%m^V4?t7FsuInLwv9^30a@DGCcaNQ z>S-H09?&8ijMlNsjkG3#X0aJsGAdG0DIniQg z$wh|n>)XMGA75&o1}ed7cOgec*5t?tWWu~Nj|(e(ahAqgTJEE3*3{g!p|P{cLt5Dq zXy(3(@yR43V3UMh-PXoC;lH7dtx0yE z4=&tD9&MYYYqY}#+AT`PBQy7-V-j2t%%)gtr>;1kAY`YiL+ujUG+_IXe%IXG@2+>nmm!3?GJR-bT>A)5bD!V zm6%}%n3&B0yWlD@7buuc!MJcKLJxdHdxtpB%R1XzNrf%T*0t@dCXT-kl-2Rp#^yGs zKBz`al*8;x(!QENPn|?{L%Z&@rk+s+w*S5?LsL{$hpN=YTa#>c?PkX&YiClqH#Q9A zWTfC|Y_3`)I+5#xs}7g^+TgaWs_5ihwN5VM+JVz3?Hvw=!`bTiZznN~;W&H3l?RxV zew~O_m55VOm3(|Mcan#fVU`8pD77^mEzR2bXzp4G>lttIVJWJ)vaa&60e(=Y_;O?< z8mEt}T2te@Z zWVedmMIOkt!-V2gX^oVn7gxxe_^P~PZEQ+&v#q|leC1-?7O0D4GVds=``O!AEQN`2 zziIj#TasOyT(CrONI8Y-WL%e>?@QO#whb;3_F%LaIGgB5L}9PRqz04IC?xHEC1L$VCvJRQ zK^yH5^*B#bCboa&H{`WjSD1rTLPb*#5@}e`RkI<1QM=10r0_hAhA%C#$*@oDorc@g zP}8IgUf=^=65B&wx~Z|PEp86ss{#@C*^mjKIXpZ^MVBT!JJHopgK& zZp1WDw`4Y0HS#{7ZQ`Wj>Q9fDIgycH%NLS)a;X9W0uHFQd%gx8>+-t52w>;5*^1x zeMM2$Z)nAUO>3j-6JoH#^=KjxyY#f1U4N^txf?kCrch^$f0wp*#<9%CVhbUuR5E;q$rleHu~cY#WVS%Rcrb){ z#$~|sMUCWNmIEf#oiO$A0^tlDh4v*PPP%LWp z73ybCzJ8FCuTCkh=(;?P9aq%E?Lw%+w7-dMzr;6fRP4`>#M@*j-j1nCMQlmeCUfkQ z)j@Q+1NO_P6PEyMzYW>(#4_^g|74Gu+tPQGa}Au3Wi5?rg35uy62;-eHbuLe;Yu${ zwry}b(h6xs7tM(D6W?38_>PLO`;=8+>v!cH<%<@(Fow!XOBXI&h`(hO3rpqG`YTuF z%?`c!8+%tD!rBHb@sr0q0fc}u{F|94pWL4-i*YuFdkP3YoW{QeKD_EsajkiV2JyJt z?hR_$1z+W<4wVj>=Xwx0Q+@LM_7Kn5Wyp^oe5&mbURiryyH?}GWH|<`#S!8ER=T* z{)9S~tfSgAEM2`~-TiAC9!@s5G;tVo9cpE?y}KE6?;Y)lb*z$)t!s*R^IroJ>2eU( zb#-o77ezn9o{?YI`e?_7b+-H5uw~K0hVHKN($YoiR`j+s$SQOFP{5X2tVU9pFx4`1yA)8#-uq3QQ zY+~*OVI102dPgZvAt^13E?L^xc5@=EhiyH$VfaQ|wm|#^r3-Ni$3l&dX%3i*@S3~B z8{0d>%^W2TH*#L@_FU;U#W#4peI_jWhkN{w%)EA}D`RL&s+Pv>w+xCR5< z=u{XyFY?8;c?O=rw2NN>e7jQ~Z&G;*Z%|HRxJ_n>!p&XbM0h1 zvfKo-Zi~cD%g=6zhBnz1Zr>QLVSYg{vU>HstC15Y&*iU*kK04;#fHmqho{^EUpv>h z-Vonc@n%EZX;_JC78HnwH_ya!WL}Al%PgJSCEdF+)lJz*PhWaj zh^rN!kqEpeb6Q`oS%|wsxjO6Eo%q2G)k$2DJ>kCeeTNd8kjqFX(%UCONiaLX9P)O> z*o3tTHv$)@w@99%#hF#>pZ&pXE9T}2SBhdyG_Hnp_(0-TEw121F%*ZAH}jLhPr+t6 zryU}5uJHutSzNa}t;N``R1nzR3mb>Fk zS!8h;Gzvi9Q<}J**LO-Gr%%kpr{P-Jtw1IW)(Z^zR}V+dLkcM93tR-6iJYGiK`EUF zdS(@FIzEx!eqv@KKl_H^2+xC)TjWnM0xzuW=O%nBI+Wf%6jC^6_=$>eMr4c2-t(=< zh!C4;#ZC`IPU$kneW?k+6)QvW)kIm(RnGTc1G<7}W2!P{Xa z+Ei8T%&u~~G@*e^cpy5lYBK~tiH+(MA*GX&;z^{KeFj<8C82I6mGZbP6Pfeq&|Gkw zKAyLayZj#GWu85->RMAbWn#rz?LZT^dIB9qHffcl(%UCP$=d;eyo;d^1sbu?j%{c; zHF-YiZlYpM>T<)~#goIe>ya{KJUPsL3DnZb;hLE>%hpuOHKKDY-ffKArb{xlGp(9p zJDhLTz)UD`p;a>{6D^TKJd@sj#x6u2UnT`~PRK?Ibs?TkZ$E7pq9_mxk!RGQl9jL! zM}-&)@%%vKoaD~dGs$@^Ze5)edvtpyIu{u)hU8t%*OkGjKFIv7ATQY|$Sg0m?w;!w zaBNDh`^FW&xUF@nYI$){`uA*Bz_Fnw6I21On#d)?sMCyWtsLZz2$mi1%|%5ATg6%- zAS>JfJ89MJ4D&u$+~K_~6%HkD&BW#knpx9y4q}B)iK05UjIF|L>Ev=bGd-E9b!-?a z_7qd*<>2;Z#*$a4YjIatrJO;^5G8NiHKP`0Pf?*(6+j4(qE%mTObWtxm$~R`p>g-^ ztg$~pg2*6av#FRAb(}SZrOMPLmQMngFi&PyIk~{?-q5i^a_U;5=(OCv3?V|fr^)bp z#Y|3;Vf#+x#9PR?tpluTBvdyTCZ+6Gkq9#7q{7AxObyRW@v~j+!2c>_FTE&~c-!WS zaM%mn<0oeHcuazryUBgfo+`!m(x$9=jSpObj{b`zkU= zv;MSbMbXE1@SR$+A6k-^*aG*!iX0w}9HA6mY&{GWwxUlBM-Hj?r(Spo*x&DEY@VFN z8U^Dyil7zUKO8wg(2K46UwG+-voDVR^h8ba%|TAbKL7KJ7qeG`jp39ei#P+Z)2qSb z1zfW|1mQU?2AY=R>Fvk!lC#EsA86S+CAIwIEk%D8y?_h3hbSIhNQLU|aHD7nv)59R zY+H`$YEd}$4lv*;!GgY_B%FYgWS>sRNpV8ZP@)Q*q!WVcrR5Ec+vDr=aQV7^)ulW$ z`@GZw(SNypTlC&lQMjzn<-u`fX-223mKPKa`~^~TDlJ+IBvjP*zW}rwaHpyb*EWfU zpbCR+*W#c;2|c&UD;rb-BLL$iUrVgQL6?i5>9|9T0;)AE$IhzdC0%r2(IA5}I8`MO zghE(6b7v>~AMq@*`Pn~(rOVD8yGblR*n)r^Ls)oB;%oobuqVOf%N?5pUjb4{zTL@F zdTUc&ve}agS_?JG=tjJo{8q{ zitMn_()=puvwLGRZ<}f4+QXmjtw{ex%pW}WSaH|f z3>|2^LA7^UEBj6Zo{5~Y>h>PaemA}SaH!~`&r8M09lt33htz1&D9Ef$g{|130rX{r zVqvCk;Be8G#D9|Nbx0cu*!8JU_X99g@Ql!%`eX6RBTtF&p3+fND?gH{+k4uvLnOR* z;B+SP)Ieb^ShZH}#mh)$W#8djqlizyVRFEFVpvpTv{)*(yJ2f_kH={v2tTT-Mqn2N6M9dY0JW>^*{3(3A zm1If=Ey)^Wc?uq-io9LQNwTnz- zk9)=|w!?#-Z98EL&~OY_uSY`6UV7`?Q1ZGQ-2^r-?x@Vnpgqga&H;`%=S7k&$89!{ zwSH^=^8IeZ=J!;KyKc0bPpR%xtjcgeBU3uVGqc}h-JyMAVZB-9Lz-Di^%BX8e{5&{ zeJWEH8Z{0^-42=QqL`VUnwh*t3fLL{Daa!EX(xHR;)=a3_&nt&LJ@mu_Gj#d;mP#- zhy&$Ntz5fLqPjzZa)D1t{fM%JYfCD=^E5|;{^Li_j?RFB*;Whc1TA2pgtht=pb?Z} zpX|CCwNeIjNN1MO8cO>k{x=l>18+7rH6p`>KAzH3GelG0$yyCw!aDOziZbiIEPWzW zfNXjTd;vQ#lJhFQCTAn$R}493QRFH5!m%$^A4zlzNvO(*qR&wofwNXuNJhAeo`YRe zQ5(s>)W&I58|T}ts@c53U5D#YQWc#-MT(VJ?2S)3oEiO(xgtI#(fn+;h_L{Ah2nVh zJ8;bkGrNlC(&R@km>_8dIBw)(@rY3?Iu4M;8axR{-Qr*f-;2JotA067i$H&DAa-iW0fs4%;jd;uzVD5_$vbNdZE$Lp%}uW`W&|5QmCp%UvAr z64+gU-6SC@(L4$LEkg4p^bZJKiO_7h8{nM+yA!Tsg@hhN=-m?PLg*F=@zlWgNNDp6 zIn)YV{Ru)m>S%W8YX~V`{skdLCs z^dAVlQ@(DRrSF&i9|)BR><gNyn^8c^cM9GQ5sFD@E^6NW66!)omEdO(`jEgz z5c-IO{vILx4=U&J=OKap7@>6%y5c(AlPzCwbwV`=skl23Qe6Fw1N)%^dw+@kY9VyJ zQ28W6DsNvxXpN-tJ%mR)g`KVXC@WXE? zOu6BpvT_061V`O@P+7Tnt`D+c(Mm65LHWWhK1fCB9v`IgjuSq}g0gWxq%s6cW~9Do z;T^ol!h|eZu*nNqTwbx?ftWMSGfCY!851wY!*6^9N9A`|AsYl~{6t5ll=f?V(%KCed`Pwl?00mx?pkS_pIJ=>)GtpLso zgrNO!Q~z-Q=W1{_=)nmCGU9<$QQhRx`QpjErD$DT${PXcaUkXz2rvoF#3y-9FMkMA znVOA{*_4T+VE;3a)*lBT&jui80+4?XKxXOcMPt4cfe0X@XvJK} zMnE`w;O5-|d|HTM}Qnb`{m-C2;h8|5VTG%&JP1P{{@ITb6m@CE{eCu z6Kg38TppeJIzWziaC!nby91Cf1|UO(pbaF4N~8WBkYXF6%JjbgIpTrb0DUh;JLu+% zHJ(+v&HkF;T#CKi5S(TQxvaaU@|QcA4WGWH1R zb+A~iBa31*N?oq~;v_H2+Jbw@-N^nUFBr)ObCEpLQ7_0QS zgN0{MTz2Iu3RL7Nf`ec^G>oJ~9I_6lPOTae)+8#5+TC!Z=>cdiMRp{W>--4CfGcn} z*-PzOml(N)B1_p_T~>jX}%F;y} zaW9AS=t2&jKZ1Qp?xIfY*LrpPa*D zwq1$2QNaD|Q|R0@eMn|}TjkX{ZHcWFUt0wmLyGz3mQQODYr*I$%i6p`8ZIHP4w-N> zkXz@>??Ht#zvfURGk+);?0m3oo&R(UVR=OxR){;h!*#Ab(DyFDGEgkA)sJ4AytqgwtbxlM>ZDaVW$x)Swo;T?93;-AacKaKt0tp0r)1vL1ZQvWuUFRc6pRKWk% z^^fDb>S6ucir}lPf6Gw_udMH&ftoJ9IL%#ISLkKX?$7O z=Ualnl?r)S{17b}&cn*Gi=G7tNT18k4Y$~vknsO9frC>eX@`U>VE^&o@CeIa-Iz$Z+N~W9yDiiI@d$qf`>WkCk;bm>rq|yz{U47I zCXr@2Kh%Q1uf_n@pa5Qj`D3&Y>f1s+sz`_Ma$_K66=mhhadhk3c6eKuww33#dV-^f z{Yraa99uM>Ts^Sg1p-$?G}xXXN332~59~W2u;6%+jJ2h`(Q)Z$E~k)tZCnz?TsOphh|d+vVl{T`OJsQb9)}4d zPw!n&QC_BurTkvjwwCJQE!Va#K>1_os64OLw*I2$ch-R$+Ta^)+sZ$$%eMZy$Ctgf zwX*ydF~MW|Gd{aIN88mot8&=Yo3J7ucC{Frz_@j~0O6_3a;L*x;@Z~|!#b{j_?311 z<=Mnv-jorQi3+s*D7+Ep3EIRbop0JE?(;y{KEGyrha$g}!HBS57qAd7V+jo72C}ci zu%Rzhk@M`TOU)0LEiAP=L$3Y!He}1e4nDsr_TwMG3+=}r+V+EUhp)?ijDWx=e=~fu zn$>sJF2eJ=Ju};Wh~uS)S}Xe4^ty+@7B}GcJkFZ&R0Ctigp!v-{brOp1(wX*_O%Ln0Z?i5WjW! z_sp(P=;!#yhvr@I9`5QAfc@ha3Bf%~cS{o%9J>S`0Q{Z-w4wONhw;E)_3d4PC@}so zop0MX4luto}<0?M+5%2F_A>IqG5bp=C0FU|j=KvncEeC)97QhSY0qOlX zfET1kyq~>7y!?*?*?4$8ILmiQIJ#zO*@Dv2+oEf+uSuQ=PF1ZaTU3hkO2hZW zaeio`J-h*DoQ7rWX~`1T#h8Cf_~AItPK~Qit`D(fiQ1Ae|CZaasg}zG-EV<+ogU6p z{gtHW<42B`UE0MdMLYjxWu=%3lXGRgtS?z&Z+GBfrxXc<)0FJwp|y=lL^ur9PkxEL z-dfEQKpxC*DfSB%nb)vAkrBr2zVUFJCvx8|yjEZpG+C9)3BzjTb-1;?DcRzn0T0>1 z`MRXDb`zx2%EN^zCgzUH&Y8?`dmHiuAOH#IO{-+Z5g3xN&)&B^EXwK*&@B_X%W&5a z1n!)++hrq%4Y5SPE8HOye}lbS>SeBn6g9QeLTbo^oz~05HRC{E%sA>)VfQLWDRbrn z|G9YTis|rDIXXRjUwiY0IOV;lw5+_+~^ko~jAtb8-1%kr@u5mP;+eKIPDwsFkPb_V7~PZWV5}D{PLNXO}E#ZQRnJ z2{lkmB-7Z0s}Oi@Gy&v*I!gJLMZ-`WN|;iz1#Evu%^-jB)s(+259Gi$2UOM^f?l$O zgIl1@n-{{5@NnkFHi)_#_bN7p@tcfOu0n_Udl&8`X%mTuaWwuTC@5U2*_mv^q0g`> z8_A@wZ%cu|4(DcY9_fsw1HuL)qacM(sf%J4RW|QM3!<_aeh)B|?kXE#FBi9UR!W8X z0!l1q+jPPj=o~0>ffK56RCl{L;O$TImh{6 zge9yNRN-`|@4=NBz^RQ`x`pv%XAl|ZX`NnPAP2AFe8T}8Zzv??Aji>6^fbnuNA-jr zhH=h2$K#%_-^8OoY-}8pcG8|LOm9CKO5o_klk&-moZtzyC&(vGn6#p&fF^6aczhTS zyba+1J!XeM@OeA<%tX%&*Ki;RC;Xk^U{P;1IvRjtyvW+UoZ-kB95iP2*D*|-^S}W+ znX4I#=dwvaN3VzEaHO!aR1I*ecP)XDGwEXtgpzM{q_v4OkeXxwEPV#v=jNH4ms5Op zehcy0O08vz$iy=Ykb=&KpTdKru$&p#O;k+5HOXuMCKxb3++eI$M1TD^Yg8*3y zp~N!DpOgqnM-|Prnc9MjBRE<*y?unoZsAy@GiLPcHJJARwmYjqUWR-3VYf3Mpi6Fn zGu*=s{Coy*tfrO$BS$Bj?BZ6ZWu?Z~0@E5e3`N6nkc{FiSd@dY-Yw-bFmMD2t1^No z^l*-toH<^QK6!EM4oEvYXHz9eaqeZHkJyIX4y2!*i8*qdy*nc|g)@9@1VzrwV|qv} zjhvjplgcL3UoH7BsCvrOj?-GdMjj$Rtr z@y0ozS07B52Y2)A?#Y2YdAA`mAerf-Owz~pBksjSOq1d(NTrXzaV|)O5_c-ROuu}1 zzGPs})l6fx4K@mkX~dAs~t>vxWd?Mip4QE2*MbAb?@v z{zVKU4wnfy_|A!qImVbv)RF)_NUhFpEP;Bf^N2Z@=2*Bn&NSIy*!Y*QuO+5^ojZ)8 zu+7`c*w?v^eeHnV(#8?$;xmrt9piXjjN^G*-$rR1N0|~1K*#C(+BilpSW%^m#W-1U zINvsoSJ61)T>fZ*wH#yV6R6kPHcs&PF55N&VUD(q6T`jB?REn(hkL}>F}>)-aLTD> zF`&_Y@)5K;{o*yKb`D|7j012%O54H-!xln>WLxSQP$b8&raW+qws0a~3qeKMLQr8q z?9nBt+~0{!=z!yn{v?fioDgDAEr}Ycb zWTiPtliEy3LkJM93203^(WBsukDwj1Uxs^*+ab|R`mNwYwDa-+;h1fQkR>Z@JmiI} zI5v!|I5sRc{f*w0L<1k`EjUWE3S?08&x!_|{q$4U$|qF0;nX37ZE0kBnHhM?=JY1& ziQ?7yYo7INv|r$6tri)%c|gCA>4eGj4lN~-pR1MWXP)AhM3IP3>tXgLq?~?QlpJS* z;?VAAM6Ka-QvyVD>gXmj%@+Mav?KP*aL-WQgJMy3Ar8N5pV9E=`~vAJ3lD23Z?Fu*H% zgzgK>m~QXYVnguzfGu@f&E$_$jM3?{7tVfa9Z(=str_e2ifVP??7k)j71AaK{q*e} zD)u3$i5oOw9-yC}E!>=Eb2c;kPo{~5eNB(gv!bJpy{7MyiH-_7k0l*VJvR>tYI|d! zOqv%wycMU~!i$(iWbLOyTSwDROOus&7f5BK*CSWDjN=*y9K%^V|KbRchNXd%dK4SA zo8QE>AeZT9Q>?{`?#3wEFW#ntI5h<-!ldR6w^WR#k4Ys=yd4;s-3*&w%_<7cq?t!L zH`-i8CIm;4%E7oe0(Eq_NAOvZ-J{%vrCxTc;JzbTdMnQUeHZ|j~WN(7JQEI^o6|7%Xd5OZHR^IQ`o1BTu5)f5K2hD44ZH<5jZg?5!3*d~^$@H-faLfZ^@h6mRMTX$<(ZTpv9Klc5?+uULgC_ps zygu>e4#>47JbAV|y&ZQesndj!sHiT$4emMj?%gU=Rk6Y@bTmtz z9nDvV^22R6PP#A5eg_-D9A6&fwDMt)L7W#kJ6PY)l#`!iZhk&;Nq**npT8c>&CYjU z4Lj_=$n9L?Vn)?v1dx{D&OrmvX~L~Zw9e2-9Odk+nTAy1)EA_WNo$`Jmo_?;{Rr`E zol7J@foCK8V?sFNd5FVq=2Z6GC>_4Rc?E^JP_3%ibhr9?Av;^(IIH)9@62D}zuwlB z;fO52#+mEPjr5&)Quq?-hJedDYMvYheltNlU3<$#d4Ch%{Y>*_5FByM`$2d(^U-`k zrKExdgGyh3Q=Vf}!*zRQ(_9vPs3~eIZ@+MEO_-{R7Ir~d&;vhBF+(PUlxx*)Hg^eJ zrU2MfRX_cz&Nu0E#({deDpJ@9DWKZnq<&P%(->OG%uM0D{xjLnlFn|%K@STzRanvE zfy^9ZcAu7Vq5<=j4{WN_14VJ2a_$h|K^W+&RmD!REKXUGBP@#&D|#doJ7UF3(%X-P zlJ8b`tCZmOkTdN5X8M^YWYbKA>p!!1x{S?w#J3oZ@HS5 z_<#)1yhGh>Qi2hs<8sk}shg4>j)iwB?r~i)3$ydd8u;8PvhNq!mmr&e{R6oJ=D4=& zbe46?sSL_1(KnvBEWEnp`ms(WC~YI z7z%gl7pHKy0ddpJfAZHx5l1oS;I z8fN8(O*xKRhs2s57i)T4S<^45*qPmoEl0B#;Ar+9K^@wY>oF6|T_Nyc$4fIU|krQa$v<(~bwRG<4b#c=j7b9o+{3;sm z+~xBU#mNTQH9h}KkkQor|GRLcJh&MQQW!?gF$Mz9V=DFRd^oPU0e~9NGh;^wmm^`L zf<2bR4$0IkV(JEfXZV}LOUhru(qPb^vYlew@g*C{($5rPt$JSaEt{CErU|^^9&w%( zP>;1Or3HF?%f-YJVA#_SXxG)~+clY!ncBG*N77UIesb96mU75}#52k%8&K z19fNL>;$fDn0y1S)Wp4eYV-_a#rfGA^_%|7J|LSu)B%MyHfZKZkGx68&mM(yVD>w* zVmN@BPL98ZHwh!5iUlJG=FSmym8%mM&QmXY3I3vy8X@KXfQ4xr&om85iyY`mr7z&( z$5KCQq|jt`478~l_vpScM1ff&na)YVJv$@)1^i7vtz^&ZYSozc z*mXkA#_)15_8-!;Vfu|jD@*`hJf?{_wt_EE7;~y=<`}QWlZ0h>uc+@DyxW?k=&K%0 zUg9k%)cm5pA1NB?r*APN)662mW|$+x{v7lFp1!_zXcF0ifPeP zh=?oaPQLJxx{yx&o_%Nv6SfzCl#!b*MpYHDB15>%Ri;Xhr{X6t6!qkbtwX8!anR_2 zKdxvUJ3IQqvvA%q!DGQ~j2z8Gk6O{gsrXS9;YcceSVcIbA{=6b7hXF1(8Sru)Y-^{ zy8Ld|<3*TmQ-fo9V}ArxBTrH)(C1lWA2&W2s;s1z?UIr^iRLCRS<0EjXVy_*$$26L z4$APNx54uae1|1q^%H0bL<(t(6+6e08RDFeS!nPnIX9SodOjB-cH^EPsNp%Qc8gL~ zz+U#D0#kpt{B9Uy|O!q>K72{Gy;x31OuGTGkoG zj4~=4317DnA&TR2dr{o_TmT0;dVV;?IDB9?FGXVPpIIX~ zHZjV<3=Ev4IIwzEF9%hVi$Ny+w2*o7J)kixY}h0{{JDu2j{S~QGIHuLShaIKa<#3_ zLjzxjdxFEb;1=23%~a7@q11G{P&l@Tq+{o$fX`*3=Q4xB?QU{gv?HbRiZ~!3UuNv) zNP0$wh_6d=EWIAB38+^?r-VBRU|t#4oF6DBlC)C&#P}o$Tf28@Y%+D}@)-LRbO4uT zQ$VCTyAAV={9a%+x)IC0swE#lUo&;URcqdr=XAbFOA;g*oH#ss}QM@t~p|yTk}UTH-_(?bwEQ;r|xs{H>7* zcp|r+v|t>tmIV-9JD{|X7iV#@Xr@H`%L}cY1PBXT9v#9Gr&A2?$nQZpSSb!a0Hkz+ zu{jdqL0+4;&4SUC<{PEW@2a#(RGT zDOmIrB1PA`AJyI#^`5*QK(TO3@+%*n$2iZaOx=~+q$@ZA5pu}NNr43RfdIJ8SQ04a z7&-*1hl^D%FkJjNadrz1<4ZtGlip=Ontr;uq#3|b(i~3F{iFw=kC?E#p+zGawe-aH#?QhfuNVMbd=PQ*9^|Tm*^LI1&R`*=w}F5t~rH`Alc_CX3-U zWRL{&l2~PlXbkhA++RjM5|3&VN<4vhw9JX5NJDhVT%Q8hO7$G&63yxSniEFJ$OkSuR{r1an58YM)Gr}NVxDsJFwZ{%g+NzSGM{nyD@p)Cb ztqEWW(}~c-8OaBMKivD2rpX9Sx;PxcL0%WyLa7U z$t}bys1zINvUW?$ff%aF>mfC5uh0&%b`goqpVTza*G;@KYIf;4WjY;7-U==-WG97z zu|f{eA*@vdUMsXhzLJ%|px3Z?c=*I`!@cz0f)4L&iJR2lt68`C+m=Mr`?tpCeBBH3UafeTxFe?Sc~6$j7e@m zUk@ccTF)tTm;zZQJ`g>FPLs_rr%bUBehbn>*WB8*3c6^TRt{j##6aW>1P?q_eRQg*KJzY)c*h!u<_;3! zV&+*%n5mOS-)tt_WjdjhT=oVs=l1r1KRe0A9sJ0OUexzfgd}a|AS0`=tk@8?V!Xm( zMdY2i%j}eVMUGg}qnX%IEA~pp7pYQIrpN({*T_F*#rCJ-PpMJK1F86au+}pi*@r(E z65S`mm>kK%cot^a_he#wtk|wpe2_$0K8K{X? z>Lh+K#>DXMQw&oXif`>FJ%BXy8aMR2VOfgnR9c*gEHVz~;p6~xZW z;9~T1*Ku7~fpv{lgW(N~@{d~iEZV#A1{uTDh(glTus#V8=0kK1XrgYc+-zxORJMlV&0_a&ua72Q!A1fl}C8hjP%dyl8+2vP(>di zCi0T~T_`bv*~(xYAVw(XafH(SKBag=zNVbPGU?*FH`Ie@RdkwjznBt3fsbR6I2;U& z?|{wm^wYBX8Vgt@f%LILj%X$;@M$2dGJN zTT6k}zlGxp+tby>$MRwps8Y?-zOB{3`! zLQZ#@iDA_pdDR{a+Vy!5Xc#T;TnKj#!qbKxVZaKs9agw5b~*eX+HPuon3n)){|*}r z_=v+)jrxM#$)EF`o)1}-Nc4OhQF_)KO{Z{wJ#e0&ab!)_;-QaAmYqUH{=h0!FUJ>n z7TBR9qrf=3Nrr&wjbg=8KNq)iN8Vt90W#v`i(VWB#z*+2#Q0!G75})M31=ULUGd%W zP+hQ4at>Hin-nCft{>U!WtNcCz`v0;#OU3>pylbT#{_e0Ay1K??VH*zS`t%C_SB>8 zZ5ZWY#(zM^XV*fAB{|9JuKCWs1?6^u+_|K6K5Ww3e+lx3ibMKv5?%7_xwz!TPbLzd zTxt2T;dEMz{D54KE+exuCIv=Emye{n#ZJiFtpOqS*g|l3YiwR*_n`{B`ZdLk3Dtms zZv;P8#~|}YjR_^^BbD?qwc33yP%^s@0nTm;^b&9Ua`8Lpp$VRfQ(|j_5;A)7pCPyG zTu9ALmV4D&!D1TPxJ1G9?#+5;ik{P0?N5;0vfUA$Ze zdxM83P*)S{<`APHe^;OM#P_Y_*=TfZ+FUF-eFcYmz!Rs)`FN7*8%n$hUq#=1G#s$1 z7f$_hZg9XnKKA3SLs_C8**;SOyJ2Y$FdD}m3F@5N`@n`yyvz6zR$*btksfXcF(L(! zbgn_luxI2?tq^gBBE2JiLi2f)#Kdhcu%v$s>pwqTU^ zZ73KKBIe{!5tI-eH0{uHO#}P!B4VctV7R;a$?Hf+jlz2R0r)_|5>-A>Yf!|d^)ck@ z(}(p)(OVMAgyhhlvypNe4=Vt8EgMnt@siCl{Qv_U^a>yJn| z=o8JQPsB^npU%jL59oLn5F&lup0eK1w-OJ6&W&MOIS%Ixs+*O<;h*#oI|qG_|4vhA zS3X(%HVsv^WaF5&psqbP^-|R)qda`|uY>Y31#3re_%roKBP;z$kKf73RHMIuiPemZ z$XI!qPi~`#S!+;+=Q6w5h(pHK4*p%Pmxi5_rbM+rvx@qjqv?p9OFtt^ONu`JWich^ zGRy0@QYLop`?AhNEo@>Z6GLHYEat`5(_D3=x)MmwCOat;C3Ea;Ru7G0QPP>n=$Yi` zndm66p@rCOQ!~@TArV|)I)cHSRD1-TPb`Kym5QH4@)$)pfj<~UIH7u^+S|g8hH)B$ z{27r8nY(9RhprPUa6WsXw$5qU^RJ;Vb`A2mZS?-fo`M%3)|6%=)E$OV77N7Js#OKu z@cmFf&`uCw)hj=RCWE+u(>C$7s`2(W5U3NYWa0K^5HrjD;w%Zq`_-Ur5B z39#-)?*kT{rr;uX1*#AS~8!O)=fthK~d-jALJPY*>A^ ze_Zzhf9hfqJKxnN+G{pnWFz2?T;?)wtY4||5~N0^_76vfkS-**AGVogpL|ayy5FE7 zqo0`L#CP$Ry05lfsr_O(fQ(sbiO5p;EPQ&;cZ{7T_@NIUGO_*XXViE-L7fC?n@G

    aVFMcaW9 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�&@>v3Z$D@wPzFcm0^fecJ>Q7+o9 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 literal 0 HcmV?d00001 diff --git a/3rdParty/cri/pc/libs/x64/cri_base_pcx64.lib b/3rdParty/cri/pc/libs/x64/cri_base_pcx64.lib new file mode 100644 index 0000000000000000000000000000000000000000..c8c02f11649e2c129142e55a80a1f64b43cae909 GIT binary patch literal 710970 zcmeFa3y@^lSsr++ySlrkX2gud2m~IWB^r=qX(sDkH4;?by!pDBHy>11Pq$zom6e&* zmEBpHMLxQ_v@#&ZXlJ%!90Xcp#Tu^--dM9nO8}10g6&YuV>Oc4SS-LY0O@(mHe8XaB%DbJFL@FIs1g^ZdlStTW@DpZh86 z%yFIul8HK53l|Kh+<# z&bD%|{PXK&>#TY{|3&NU7e3F=?EG(9FYEKI^VV$mdFx+Wv$28stpAubtDbM4vu5c@ zeEuuz`NcO|v&VTp{2^=hOYwYa*P1=a^9LWWX7%S!f8LtapT9!+%IDn7iHgoqH+I7k=A1cf#lVeQ&lRpV$7Dbw2#O;r-V6 z<2)<>+B*N`ep>(8Iv@4ioU_iq63>sUTIY}ZeBeIoyn24_m#y<(%IC#zw9bF_#mUbX zzt=i{%ICs2KV*$OZ+(q*L4VfXZ(W%7I6rP(c%`5EA6pm3J)OU_E}Zsxdds>He%@cU zE}ZoFz+0>f^!)4@>%zbIqIKbe+po;?sdrfyz7)@&{g`#(gwNbV4_GhDv;2@Xr=Im6 zvgYXV-flkEzsj0B?(^;sS#u|O-ZyK_spqHvz?ypr&pogDx7OX~ZW+9sGBE%3|IvEc zp7<|V^Iwjq`d({Zf8O;`YyPD?@5@^A>iNeFYyPy)bKh^xALsdmx4Bt$;?-Evi@SC{ z=h*2|Jhd2GSc zSICyVdIkVPLw~ z-A~pAwE&)J4j!wuhs^*|F(Fl_)~*lR2=NMvqJol;q!IB*P$-savWfI{4;3GxL_)P> zR0D_}ekf^GJz?7jvYPHSIWhbK>h0FP`9AEl1{5n36l(2ux9-1|d#%o3*MF_Fo6Q4N z^b4s}A!n!Ee0+1&sFRgUKAX>{oKk$dv~7C^E|H0+3YlC!nQ`Nrmz*R&D=PMMs{_F! zF$x6c7g=wO ziLneu*C`YdsZqwwm96GMw>Q{a>7s?SyWImMsnZB0+DXPU8LynqC6H)8uXek=xiZ*8 z9tWr%w6+ND`YX+YlZ^(F%gd#nYbcX0l~l3u5z98WQZJ zH#e4JeY_MAPPY@1I266CKR;#ok<)|DCd#Q&v5?S$PHkc7r@_4P|hZBU6 zkEgPBF5#5*FkYVI<>Q%DCXsZLx~!jG&{E}iIqjwGV$KP&`(+R^5^TTxyttEgJlEAr z&)%U%ysX--s)=N;cFXVcQn#D+;hU!7*FZM&Ig(mD7bXPv0rR*xEwuSbV8$Ia^F*5?X}I$6`dsSTcxZ%J%`Pr1F09GbD!NLhS4+l2jDy^P3MewO)%?C;tJiFZX)O)SS6YKT zjH0_Oo^e#J(|Z>=tjItRJ*|Fg+)3-`$k0O6(P4z4W)k|>v7FpF+(XihVnKJ8PI?(P zg;}x6I2vXelX{Xk-e|zmye~tKQ;#i6BWh)>7gRv1gwp5r1we<;#A6S$xpKEFiv{_n z)%A9F0O6BscM*dxEq(w(R{U2@AOPds8~I+xq(7g^dzgJvhPHNgL*kJ4(z#+Li#EyP zuom9nD8#ebL>i00RGirp=s7W<@css;0zt|`OK1{9(8xMAt4kLNu_IEfL9Dkhg%uHr z!VQbnczk4>VRD(?$f%-m;Z#eiF#!i)ldpfhx3e21oawliDPnudOUr6lU8D`MG14i8 zlM6mtIDh*m@N8m^&zz_^CE1)C9vVx?ENbD%~o!JuHg zI`lg%A}tLEqqG93mUFTWKpe_SC?E7X5;I_~HN1cdK@zp(i+i>Uow>2m3p`hEVT*#Y%uyvl4>bQ}F2Is5k;3g-$@ZgkDMH z3XW6CB;%JckzY63%}Sx1^9tAxk7KB{TWZK1cc)GxWE}1Ly z)l{*VatjGNE_M=(C|A=?rkr+@8RiTJo6e-O*+M46afX9Udu8+ixl;Twk1}osn@J}! zP67Lkl*`rS5VDX-a4dK=j9Tt)SR=^*&5uey8X+2j9HflyX#b+ z5(>HGbS<$+jsO#fTg`g6*C_H9MhLyiE5QIL>d_2bz{Ukb*l^4QiwZfE>R=NoNB~vM z!m6170UMV9!iEzdDtI)MPy&c-eO$PYiH3@#RWbL({Bp2;c+lML(s(XIrmiU6YPK8W zU@ICSCS**j8XZ;>)3_X?PiZkzk?lZY#(;9JGb3ssD|#*5m)do=n^>JxuNpq2c_X$mKqJy=X0q5 z(CXKXi0LFN6t%xW>T_uup+2l!8}_yIi2=jMBFBkZr$M_W=~f#{!yqR>RdC+oHE%ZC z2K2FRdk7&^dwolxy){S??`gQ1Q4`u=?2WYCjS}48dse#EMg;@idvZrEp`_$c~_74V!dgyLH z)oGM=1=Uvb8jiqqv@f$N7&NMJv;x&TJQyI5?b=S;D0X1Ey13KTQd_yvI$+6C^2!_2 z5L#=mj!khPl05IDqj@?t(cpbqmI_7TqQM%Xg!fR10Ae&gr@Oz8lYhTKIK4WRfzvwJ zqjtg_Br+Y&nSoE?$VJaNPhfACAsWpAO;a!Tn~lUFPG_jMu3T3b5qK0#jN)NRIc+xC zd6)<&Rrh2>M3sa3FAMF4fLOwV4UOBX{R?(;*>Rh?Cdj@|?D%GwXpdJklO}2tCQ#ckd2%&z^Gb3jRqL*R%3Kt4afC5Vk{p#s5j5Duow~*Qj zpLz*G3R6Ts5~kUYPz4Vl+z7o;>(s6x67VLQyR~5(r9%6KiNj>`W($2QFS^3iBs+py zP*LZFW58|HbYD%=oOHaHE)^1q5~gXGqAkUi7FQ>&$>o}gX8gHix?m#!(%Ff{Ruh<_4YOsndS{a3BqZj%3~`*)F)jyRo=HTV^^lIum3a{RxE= zFy`W3&bHIVf>0HTVfTAAhW&3XTAeeldab3}`qIMU>aPFJ=WW`FS?EM>CxqYGm9vnD zT0!@rihgp1_&u1c7H))Mi;j9uk_U`F+&n@R?{lUg4c9Q79&YdTn*F_QyP>2=B|*u` z6qdwcq19>a5BF)x;&(6OqV-z)tpQHdTb;y#=px5a>Z(&?lcb0sjb3Y~SL<;r9wFzR zJ*qg8%{J6P6#e8v*Sp(LqNP?qR16Z8#oQI+WJIO=V^{<(Xr_~zCsR@DHQHr#aL2E9 zv%gbCq=drl2l&W7gC`Ui40||kzcEg<(6I=ql|q}Y)p3FnRZ5_Ay1gDIO_+1A5J7&@ z?V3302vtY8zZ%=C9V30i1IShqnnPn!#dy&ZMwIyFg9f^-5>~}~XdUB zg|g%2_>5bI0_`nQ;MB@4n4hWEZDL0nvoUp%q96wRUQ=&(`|i$gm#3im)Muc9jV7+a z(ZZN7=-x~u&A8Bcqa&4l+9-M~Yd=}UnoDHSWUCBnJ)X>!c6a+YlH@WnNl1VT%|VSP z+hII410*amX5gj;50Wv#j}{-Q0F$VpSUPG6RdBD?7bR%oAgV&gwIXVvn(9Ocg9?DA zB-cSimZ-8tKhiX|iB+gT(@Jm>JLbBK*6XiYM%TqqJ=J2Rq?%wqO|u5AYMFksOxp2W(MvlesPECa{YGqk0q4J)OE@239Yx93mC7PIBf5d2Q_2b5 z1i^@T%QVK68+TKQV%o`ZGp9|o#bxS1oErL!4xRefu>!w_Ej5nYkC7Om!kZ{3g&Kum zL{i5xLJmc0P-WdZpNaD?D#b7&SQmvcT3ZaGXj?uiFt-nxC4~d(2%`w3NE81t$b<@= zLC8f@mH85B5Fj;*V`GH17C3f^QmGZM!MN$uVxC{HJ+I`1C;B1<#(F}6Akrg~e2EGo zz}$S%>9x|>9&E@ocY7S`Zmr&o$18R@WnZo4@qKxOE*{UvzY8HOjbMxru2K*$Ie;p~ z1@SPGY7}$`6$nlUq2xxk&gG4{%&&rwlOFb(JY)q8k#Tx0nW7iQAx0j zj!AS-N#hfxTG99;lL3gJRA~%&wHc&jRuZK}fJzs~ZI$cBvRiThjXr%a~MA)Af}ikstFz4s@PG| zpe-l_RqJ9005LiH9iAhQ=8@a5JB^Afu4!mEO(8XaYI};Jcw|TcoOZy)lr!Ke*BT8> za@ANY5rx`~CVooR0Z*hQs$A>!O`H_yRh+Wn9wm`&ub_Dm7lXv4yInfM@KY|qLJ-D)Q@2MD6t>;! zXepKf5h8WlPL`bl@2`pMXh_*FVEtRu3P>ZM9rDQdFzje>w~yt~evKP?t#KQzj>a&) zTqWgo*(oMUDL0>v+Zf>tIbF`ClIa}jou{`_DHD~;XNztg_jI;X1*wv*0`wAvV#dYB zP4XQ@Db@;A%4d>Z5sRf_sTc~djH@?LoXW)0?p3-oqFozXb-a8jkuUK51SHW(<8FsT zX)UVD0IKnovR~+j&UXig{w&hT z#1UDkT)^57Y>Nxau|=>YYFN7ZD!d$N?EvoqpBqmX^Laa8z_b;ND~n4UA9Z;vXfC*F zMHhE?{z^T(!I>{)k-iIUiilzdo4Bo84ut-8V0 z)vjQcp{bTElrqo{;R%75D3iP-aWl!6rxj<2t&`4x(SEF6+;j78$%W<#Mv2%eif09~ zrwKABa+$pAWT1I1DV9el3fMhJm9XlU6iXu%#ZtChDw3wBhy@j|*8Eh1VwOjJO7JE# zZUQmUGXdMpecZc~n|{n3%nG&FVz<)liHm(cf3mqVyoS+*r^RYiW*&v%g`ZMbFfd4m zoK4f&S0uC8b^sSn;v)%A6&%3?5@ShfB%q87Y@(_o!)8$!pD`@z#Zs8(iAKPf(DnzZ z+c=mU4VW)~a++yyp*|mrEW~0KDUZlw)90`EIaa8MH+v4XpgJ^d#nzr5nm+wyYPIO& z7js(6Ag@`w*&G*|n4NN&sP!D@evjnOS2p9fZXL(AY0N0w&|b%8WP>C{-h91Qg_JUt zm`(DDl2~L(iRkvsWtGo>tPkshc%0W%v?@C;LmAz)Sc#p4>&h~spmHI_f>XpA;y+Fz zuI8rX?P@MqQ5w1DHDpY%({eKkIf<2)pV0*!9av$2PW zDz>aFwi2+C%6iFc-Xrxpl=XJn+(BN+6mlgem!-?Lj5fE1H(WPcOyg(}Bfu&a9XLNT zhMA3=oln`>4EC1<9+!0VVQ2#v`n_a{235%)^9K;<_>q(cV~7EeBZh*hE(GtSSLGjU z>HEwI$7}h-p=70QDH=nod)3Y~Dt(17VxwgQbtr}YwN!@&4nDn*wduu^b}Hv4Ju&0h zSX^C!%DG+$ph&o02{b5$bsTiAt|-F>;k0SV5aZ#PG}cHa5{Hl<%7DhTOKPt^+!wf< zS59UykyEu~)}m967qX56A))z%sAo)lAS^h><$(}K6Hw8S*Y!7-{fS5tH{+>4oqnk+kTrXT*pSufyIL!u7?E( z2Tv?G-=4_g#S?{0F=6&H& zlvIt4KnMlhNJLa%LJL^S7!oCpER_1K8I;fq9v4znb^mPMu{;9$_*n`=~um3!VFd#yFuD9g^mauP@(E=hQZ>Q zXm!-oHwcC?YAGPWAsurG6=KZ-KIq}yKXT_yCJl(qAf5NljVHQE~L_ogDDOjSIm_&r9zfb<~_Nkq?atZ z39>bVAloK#8JqdINh@(!unrOG2NELAs zMrdw=26`h=NEfgzlT_%?-G~jxb8t;JlT!H5b&U-e@+c-8nB0)Dhwevgq}+1aPQpr) z#E1D)g+kHE;!?IuUYI{yb_>~TnlGYK?!xJFleqEhV0IyQ4g9SnBby0qy1BVx(#24% z2sil0^6kwDKg7e2iD z+Lu@0I*FXK;t;6rTb)wujHB*DDEw(`T5FfY$eE2B`Pfc7EY$jZ#1&xVUXlQaV~zlc zg6opbvlcw2XJY~bCW@Y|N@167JG+&#li?##8CS5;6GUzvh|2EA$;WYLtAHI#)|*+3 z;n157+EKFD6@vI|u86QUS9;BXJ}32Zup^doF(+lU#AWPs;zqt=!W>zsjbe6N3k*46 z(-&5iU>yN=R)}wLVF4A5Dpq{^LIabzaMT_|n2VR}vgcvHO=HB=avCE#&s?UQFJ>_d z6DfrbB*iES278A%a)F_Q8rhXiXQXK^n}V?@!Y7#lrY7sq}lb`T7U49J?7 z&E=B0gwXX_#2M2%8J*C@xCa&UJ|@MO^!vJ#%h2qkKXvM~yu4Q9cdCq=`&I1_lwS2M zAbO_;M_atLw#ZsotfFXi0h4%ryN5zNk2Q?vVxi^W<|ouauaTZH z&l%7MRg+j5X6)@$xEoTG(VGYXR`l8v$}u429-8VP1Ts5qAE_0z55pA?tP#66STcR6 z-i~}A>L5@S@S%Ym8wqjykO7zkfw?pTj$#crLO&?r{KD2VwcR^RphU)}HDs2&VDOH?@R zHqK`E50>O^_vU8I>9xFWzu$(^A|+%0ARhnD6ei$TN$Y16>(vh1HJxN3B7lM)z$jJ* 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

    W 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

    yqas4sYka-j4GUiT1}Lv8li} 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