Example #1
0
// 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;
}
Example #2
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;
  }
}