ProfilerPrintPackedDeltaFromNow("Decode -> PictureReady", picture.decode_id); // Free a picture if there's one the renderer hasn't consumed yet if (m_HasNextPicture) { ProfilerPrintWarning("Decoder is outpacing renderer!"); uint64_t millis = ProfilerGetMillis(); m_VideoDecoder->RecyclePicture(m_NextPicture); ProfilerPrintDeltaFromNow("RecyclePicture (PictureReady)", millis); } // Put the latest picture in the slot for rendering next m_NextPicture = picture; m_HasNextPicture = true; // Queue another call to get another picture g_Instance->m_VideoDecoder->GetPicture( g_Instance->m_CallbackFactory.NewCallbackWithOutput(&MoonlightInstance::PictureReady)); // Start painting if we aren't now if (!m_IsPainting) { PaintPicture(); } } DECODER_RENDERER_CALLBACKS MoonlightInstance::s_DrCallbacks = { MoonlightInstance::VidDecSetup, MoonlightInstance::VidDecCleanup, MoonlightInstance::VidDecSubmitDecodeUnit, CAPABILITY_SLICES_PER_FRAME(4) };
} if (disp_clr_index >= 0) vpu_DecClrDispFlag(handle, disp_clr_index); disp_clr_index = outinfo.indexFrameDisplay; } else if (outinfo.indexFrameDisplay == -1) { fprintf(stderr, "Failed to decode frame\n"); exit(EXIT_FAILURE); } } return DR_OK; } static void decoder_renderer_cleanup() { IOFreePhyMem(&ps_mem_desc); IOFreePhyMem(&slice_mem_desc); IOFreeVirtMem(&mem_desc); IOFreePhyMem(&mem_desc); vpu_UnInit(); } DECODER_RENDERER_CALLBACKS decoder_callbacks_imx = { .setup = decoder_renderer_setup, .cleanup = decoder_renderer_cleanup, .submitDecodeUnit = decoder_renderer_submit_decode_unit, .capabilities = CAPABILITY_DIRECT_SUBMIT | CAPABILITY_SLICES_PER_FRAME(2), };
if (SDL_LockMutex(mutex) == 0) { int ret = ffmpeg_decode(ffmpeg_buffer, length); if (ret == 1) { AVFrame* frame = ffmpeg_get_frame(); SDL_Event event; event.type = SDL_USEREVENT; event.user.code = SDL_CODE_FRAME; event.user.data1 = &frame->data; event.user.data2 = &frame->linesize; SDL_PushEvent(&event); } SDL_UnlockMutex(mutex); } else fprintf(stderr, "Couldn't lock mutex\n"); } else { fprintf(stderr, "Video decode buffer too small"); exit(1); } return DR_OK; } DECODER_RENDERER_CALLBACKS decoder_callbacks_sdl = { .setup = sdl_setup, .cleanup = sdl_cleanup, .submitDecodeUnit = sdl_submit_decode_unit, .capabilities = CAPABILITY_SLICES_PER_FRAME(2) | CAPABILITY_REFERENCE_FRAME_INVALIDATION | CAPABILITY_DIRECT_SUBMIT, };