// Setup frame with a new reference to buffer. The buffer must have been // allocated from the given pool. static int ffmmal_set_ref(AVFrame *frame, FFPoolRef *pool, MMAL_BUFFER_HEADER_T *buffer) { FFBufferRef *ref = av_mallocz(sizeof(*ref)); if (!ref) return AVERROR(ENOMEM); ref->pool = pool; ref->buffer = buffer; frame->buf[0] = av_buffer_create((void *)ref, sizeof(*ref), ffmmal_release_frame, NULL, AV_BUFFER_FLAG_READONLY); if (!frame->buf[0]) { av_free(ref); return AVERROR(ENOMEM); } avpriv_atomic_int_add_and_fetch(&ref->pool->refcount, 1); mmal_buffer_header_acquire(buffer); frame->format = AV_PIX_FMT_MMAL; frame->data[3] = (uint8_t *)ref->buffer; return 0; }
void gst_mmal_opaque_mem_set_mmal_header (GstMemory * mem, MMAL_BUFFER_HEADER_T * mmal_buffer_header) { if (mem == NULL || !gst_is_mmal_opaque_memory (mem)) { return; } { GstMMALOpaqueMemory *mmem = GST_MMAL_OPAQUE_MEMORY (mem); /* This function is also used by gst_mmal_opaque_buffer_pool_reset_buffer(), so we should take care to unref any header we're already pointing at. */ if (mmem->mmal_buffer_header != NULL) { mmal_buffer_header_release (mmem->mmal_buffer_header); } if (mmal_buffer_header != NULL) { mmal_buffer_header_acquire (mmal_buffer_header); } /* N.B. Setting to NULL is fine. */ mmem->mmal_buffer_header = mmal_buffer_header; } }