static void gst_core_media_meta_free (GstCoreMediaMeta * meta, GstBuffer * buf) { if (meta->image_buf != NULL) { CVPixelBufferUnlockBaseAddress (meta->image_buf, kCVPixelBufferLock_ReadOnly); CVBufferRelease(meta->image_buf); } if (meta->block_buf != NULL) { CFRelease (meta->block_buf); } CVBufferRelease ((CVBufferRef)meta->sample_buf); }
void CRendererVTB::ReleaseBuffer(int idx) { CRenderBuffer &buf = m_vtbBuffers[idx]; if (buf.m_videoBuffer) CVBufferRelease(buf.m_videoBuffer); buf.m_videoBuffer = nullptr; }
bool CDVDVideoCodecVDA::ClearPicture(DVDVideoPicture* pDvdVideoPicture) { // release any previous retained image buffer ref that // has not been passed up to renderer (ie. dropped frames, etc). if (m_use_cvBufferRef && pDvdVideoPicture->cvBufferRef) CVBufferRelease(pDvdVideoPicture->cvBufferRef); return CDVDVideoCodec::ClearPicture(pDvdVideoPicture); }
static void gst_core_video_meta_free (GstCoreVideoMeta * meta, GstBuffer * buf) { if (meta->pixbuf != NULL) { CVPixelBufferUnlockBaseAddress (meta->pixbuf, kCVPixelBufferLock_ReadOnly); } CVBufferRelease (meta->cvbuf); }
void CRendererVTB::AddVideoPictureHW(DVDVideoPicture &picture, int index) { CRenderBuffer &buf = m_vtbBuffers[index]; if (buf.m_videoBuffer) CVBufferRelease(buf.m_videoBuffer); buf.m_videoBuffer = picture.cvBufferRef; // retain another reference, this way VideoPlayer and renderer can issue releases. CVBufferRetain(picture.cvBufferRef); }
void CRendererVTB::ReleaseBuffer(int idx) { CRenderBuffer &buf = m_vtbBuffers[idx]; if (buf.m_videoBuffer) CVBufferRelease(buf.m_videoBuffer); buf.m_videoBuffer = nullptr; if (buf.m_fence && glIsSyncAPPLE(buf.m_fence)) { glDeleteSyncAPPLE(buf.m_fence); buf.m_fence = nullptr; } }
static void gst_core_media_meta_free (GstCoreMediaMeta * meta, GstBuffer * buf) { if (meta->image_buf != NULL) { CVBufferRelease (meta->image_buf); } if (meta->block_buf != NULL) { CFRelease (meta->block_buf); } CFRelease (meta->sample_buf); }
void CDVDVideoCodecVDA::DisplayQueuePop(void) { CCocoaAutoPool pool; if (!m_display_queue || m_queue_depth == 0) return; // pop the top frame off the queue pthread_mutex_lock(&m_queue_mutex); frame_queue *top_frame = m_display_queue; m_display_queue = m_display_queue->nextframe; m_queue_depth--; pthread_mutex_unlock(&m_queue_mutex); // and release it if (top_frame->pixel_buffer_ref) CVBufferRelease(top_frame->pixel_buffer_ref); free(top_frame); }
void CRendererVTB::DeleteTexture(int index) { CRenderBuffer &buf = m_vtbBuffers[index]; if (buf.m_videoBuffer) CVBufferRelease(buf.m_videoBuffer); buf.m_videoBuffer = nullptr; if (buf.m_textureY) CFRelease(buf.m_textureY); buf.m_textureY = nullptr; if (buf.m_textureUV) CFRelease(buf.m_textureUV); buf.m_textureUV = nullptr; YUVFIELDS &fields = m_buffers[index].fields; fields[FIELD_FULL][0].id = 0; fields[FIELD_FULL][1].id = 0; fields[FIELD_FULL][2].id = 0; }
void jit_gl_hap_draw_frame(void *jitob, CVImageBufferRef frame) { t_jit_gl_hap * x = (t_jit_gl_hap*)jitob; CFTypeID imageType = CFGetTypeID(frame); OSType newPixelFormat; if(x->validframe) return; if (imageType == CVPixelBufferGetTypeID()) { // Update the texture CVBufferRetain(frame); if(x->buffer) { CVPixelBufferUnlockBaseAddress(x->buffer, kCVPixelBufferLock_ReadOnly); CVBufferRelease(x->buffer); } x->buffer = frame; CVPixelBufferLockBaseAddress(x->buffer, kCVPixelBufferLock_ReadOnly); x->dim[0] = CVPixelBufferGetWidth(x->buffer); x->dim[1] = CVPixelBufferGetHeight(x->buffer); newPixelFormat = CVPixelBufferGetPixelFormatType(x->buffer); if(x->buffer && x->hap_format==JIT_GL_HAP_PF_HAP) { size_t extraRight, extraBottom; unsigned int bitsPerPixel; size_t bytesPerRow; size_t actualBufferSize; CVPixelBufferGetExtendedPixels(x->buffer, NULL, &extraRight, NULL, &extraBottom); x->roundedWidth = x->dim[0] + extraRight; x->roundedHeight = x->dim[1] + extraBottom; if (x->roundedWidth % 4 != 0 || x->roundedHeight % 4 != 0) { x->validframe = 0; return; } switch (newPixelFormat) { case kHapPixelFormatTypeRGB_DXT1: x->newInternalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; bitsPerPixel = 4; break; case kHapPixelFormatTypeRGBA_DXT5: case kHapPixelFormatTypeYCoCg_DXT5: x->newInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; bitsPerPixel = 8; break; default: // we don't support non-DXT pixel buffers x->validframe = 0; return; break; } x->useshader = (newPixelFormat == kHapPixelFormatTypeYCoCg_DXT5); bytesPerRow = (x->roundedWidth * bitsPerPixel) / 8; x->newDataLength = bytesPerRow * x->roundedHeight; // usually not the full length of the buffer actualBufferSize = CVPixelBufferGetDataSize(x->buffer); // Check the buffer is as large as we expect it to be if (x->newDataLength > actualBufferSize) { x->validframe = 0; return; } // If we got this far we're good to go x->validframe = 1; x->target = GL_TEXTURE_2D; if(!x->flipped) { jit_attr_setlong(x->texoutput, gensym("flip"), 1); x->flipped = 1; } //x->drawhap = 1; } else if(x->buffer) {// && x->hap_format==JIT_GL_HAP_PF_HAP) { if( newPixelFormat == k24RGBPixelFormat ) x->newInternalFormat = GL_RGB8; else if( newPixelFormat == k32BGRAPixelFormat ) x->newInternalFormat = GL_RGBA8; else { x->validframe = 0; return; } x->roundedWidth = x->dim[0]; x->roundedHeight = x->dim[1]; x->newDataLength = CVPixelBufferGetDataSize(x->buffer); x->rowLength = CVPixelBufferGetBytesPerRow( x->buffer ) / (x->hap_format==JIT_GL_HAP_PF_RGB ? 3 : 4); x->target = GL_TEXTURE_RECTANGLE_EXT; if(!x->flipped) { jit_attr_setlong(x->texoutput, gensym("flip"), 1); x->flipped = 1; } x->validframe = 1; } } else { #ifdef MAC_VERSION CGSize imageSize = CVImageBufferGetEncodedSize(frame); bool flipped = CVOpenGLTextureIsFlipped(frame); x->texture = CVOpenGLTextureGetName(frame); x->useshader = 0; x->dim[0] = (t_atom_long)imageSize.width; x->dim[1] = (t_atom_long)imageSize.height; x->validframe = 1; x->target = GL_TEXTURE_RECTANGLE_ARB; if(x->flipped!=flipped) { jit_attr_setlong(x->texoutput, gensym("flip"), flipped); x->flipped = flipped; } #endif } }