PicturePtr Picture::FromResource(HWND hwnd, HINSTANCE instance, const char *type, const char *name) { PicturePtr result; if (IStream *stream = StreamFromResource(instance, type, name)) { IPicture *pic = PictureFromStream(stream); stream->Release(); if (pic) { if (HDC hdc = GetDC(hwnd)) { int width = MakeWidth(hdc, pic); int height = MakeHeight(hdc, pic); ReleaseDC(hwnd, hdc); if (width && height) result.reset(new Picture(pic, width, height)); } if (!result) pic->Release(); } } return result; }
PicturePtr VaapiDecoderBase::createPicture(int64_t timeStamp /* , VaapiPictureStructure structure = VAAPI_PICTURE_STRUCTURE_FRAME */) { PicturePtr picture; /*accquire one surface from m_surfacePool in base decoder */ SurfacePtr surface = createSurface(); if (!surface) { ERROR("create surface failed"); return picture; } picture.reset(new VaapiDecPicture(m_context, surface, timeStamp)); return picture; }
PicturePtr VaapiDecoderH265::createPicture(const H265SliceHdr* const slice, const H265NalUnit* const nalu) { PicturePtr picture; SurfacePtr surface = createSurface(); if (!surface) return picture; picture.reset(new VaapiDecPictureH265(m_context, surface, m_currentPTS)); picture->m_noRaslOutputFlag = isIdr(nalu) || isBla(nalu) || m_newStream || m_endOfSequence; m_noRaslOutputFlag = picture->m_noRaslOutputFlag; if (isIrap(nalu)) m_associatedIrapNoRaslOutputFlag = picture->m_noRaslOutputFlag; picture->m_picOutputFlag = (isRasl(nalu) && m_associatedIrapNoRaslOutputFlag) ? false : slice->pic_output_flag; getPoc(picture, slice, nalu); return picture; }