void shutdown(Context *ctx) { unsigned int i; imx_vpu_dec_close(ctx->vpudec); free(ctx->framebuffers); for (i = 0; i < ctx->num_framebuffers; ++i) imx_vpu_dma_buffer_deallocate(ctx->fb_dmabuffers[i]); free(ctx->fb_dmabuffers); imx_vpu_dma_buffer_deallocate(ctx->bitstream_buffer); imx_vpu_dec_unload(); free(ctx); }
void shutdown(Context *ctx) { unsigned int i; /* Close the previously opened encoder instance */ imx_vpu_enc_close(ctx->vpuenc); /* Free all allocated memory (both regular and DMA memory) */ imx_vpu_dma_buffer_deallocate(ctx->input_fb_dmabuffer); free(ctx->framebuffers); for (i = 0; i < ctx->num_framebuffers; ++i) imx_vpu_dma_buffer_deallocate(ctx->fb_dmabuffers[i]); free(ctx->fb_dmabuffers); imx_vpu_dma_buffer_deallocate(ctx->bitstream_buffer); /* Unload the VPU firmware */ imx_vpu_enc_unload(); free(ctx); }
ImxVpuDecReturnCodes imx_vpu_jpeg_dec_open(ImxVpuJPEGDecoder **jpeg_decoder, ImxVpuDMABufferAllocator *dma_buffer_allocator, unsigned int num_extra_framebuffers) { ImxVpuDecOpenParams open_params; ImxVpuDecReturnCodes ret = IMX_VPU_DEC_RETURN_CODE_OK; ImxVpuJPEGDecoder *jpegdec = NULL; assert(jpeg_decoder != NULL); if ((ret = imx_vpu_dec_load()) != IMX_VPU_DEC_RETURN_CODE_OK) return ret; jpegdec = IMX_VPU_ALLOC(sizeof(ImxVpuJPEGDecoder)); if (jpegdec == NULL) { IMX_VPU_ERROR("allocating memory for JPEG decoder object failed"); return IMX_VPU_DEC_RETURN_CODE_ERROR; } memset(jpegdec, 0, sizeof(ImxVpuJPEGDecoder)); jpegdec->dma_buffer_allocator = (dma_buffer_allocator != NULL) ? dma_buffer_allocator : imx_vpu_dec_get_default_allocator(); jpegdec->num_extra_framebuffers = num_extra_framebuffers; memset(&open_params, 0, sizeof(open_params)); open_params.codec_format = IMX_VPU_CODEC_FORMAT_MJPEG; open_params.frame_width = 0; open_params.frame_height = 0; imx_vpu_dec_get_bitstream_buffer_info(&(jpegdec->bitstream_buffer_size), &(jpegdec->bitstream_buffer_alignment)); jpegdec->bitstream_buffer = imx_vpu_dma_buffer_allocate(jpegdec->dma_buffer_allocator, jpegdec->bitstream_buffer_size, jpegdec->bitstream_buffer_alignment, 0); if (jpegdec->bitstream_buffer == NULL) { IMX_VPU_ERROR("could not allocate DMA buffer for bitstream buffer with %u bytes and alignment %u", jpegdec->bitstream_buffer_size, jpegdec->bitstream_buffer_alignment); ret = IMX_VPU_DEC_RETURN_CODE_ERROR; goto error; } if ((ret = imx_vpu_dec_open(&(jpegdec->decoder), &open_params, jpegdec->bitstream_buffer, initial_info_callback, jpegdec)) != IMX_VPU_DEC_RETURN_CODE_OK) goto error; *jpeg_decoder = jpegdec; return IMX_VPU_DEC_RETURN_CODE_OK; error: if (jpegdec != NULL) { if (jpegdec->bitstream_buffer != NULL) imx_vpu_dma_buffer_deallocate(jpegdec->bitstream_buffer); IMX_VPU_FREE(jpegdec, sizeof(ImxVpuJPEGDecoder)); } return ret; }
static void imx_vpu_jpeg_deallocate_dma_buffers(ImxVpuDMABuffer **dma_buffers, unsigned int num_dma_buffers) { unsigned int i; for (i = 0; i < num_dma_buffers; ++i) { if (dma_buffers[i] != NULL) { imx_vpu_dma_buffer_deallocate(dma_buffers[i]); dma_buffers[i] = NULL; } } }
ImxVpuEncReturnCodes imx_vpu_jpeg_enc_close(ImxVpuJPEGEncoder *jpeg_encoder) { assert(jpeg_encoder != NULL); imx_vpu_jpeg_enc_close_internal(jpeg_encoder); if (jpeg_encoder->bitstream_buffer != NULL) imx_vpu_dma_buffer_deallocate(jpeg_encoder->bitstream_buffer); imx_vpu_enc_unload(); IMX_VPU_FREE(jpeg_encoder, sizeof(ImxVpuJPEGEncoder)); return IMX_VPU_ENC_RETURN_CODE_OK; }
ImxVpuDecReturnCodes imx_vpu_jpeg_dec_close(ImxVpuJPEGDecoder *jpeg_decoder) { assert(jpeg_decoder != NULL); assert(jpeg_decoder->decoder != NULL); imx_vpu_dec_close(jpeg_decoder->decoder); imx_vpu_jpeg_dec_deallocate_framebuffers(jpeg_decoder); if (jpeg_decoder->bitstream_buffer != NULL) imx_vpu_dma_buffer_deallocate(jpeg_decoder->bitstream_buffer); IMX_VPU_FREE(jpeg_decoder, sizeof(ImxVpuJPEGDecoder)); return IMX_VPU_DEC_RETURN_CODE_OK; }
ImxVpuEncReturnCodes imx_vpu_jpeg_enc_open(ImxVpuJPEGEncoder **jpeg_encoder, ImxVpuDMABufferAllocator *dma_buffer_allocator) { ImxVpuEncReturnCodes ret = IMX_VPU_ENC_RETURN_CODE_OK; ImxVpuJPEGEncoder *jpegenc = NULL; assert(jpeg_encoder != NULL); if ((ret = imx_vpu_enc_load()) != IMX_VPU_ENC_RETURN_CODE_OK) goto error; jpegenc = IMX_VPU_ALLOC(sizeof(ImxVpuJPEGEncoder)); if (jpegenc == NULL) { IMX_VPU_ERROR("allocating memory for JPEG encoder object failed"); ret = IMX_VPU_ENC_RETURN_CODE_ERROR; goto error; } memset(jpegenc, 0, sizeof(ImxVpuJPEGEncoder)); jpegenc->dma_buffer_allocator = (dma_buffer_allocator != NULL) ? dma_buffer_allocator : imx_vpu_enc_get_default_allocator(); imx_vpu_enc_get_bitstream_buffer_info(&(jpegenc->bitstream_buffer_size), &(jpegenc->bitstream_buffer_alignment)); jpegenc->bitstream_buffer = imx_vpu_dma_buffer_allocate(jpegenc->dma_buffer_allocator, jpegenc->bitstream_buffer_size, jpegenc->bitstream_buffer_alignment, 0); if (jpegenc->bitstream_buffer == NULL) { IMX_VPU_ERROR("could not allocate DMA buffer for bitstream buffer with %u bytes and alignment %u", jpegenc->bitstream_buffer_size, jpegenc->bitstream_buffer_alignment); ret = IMX_VPU_ENC_RETURN_CODE_ERROR; goto error; } /* imx_vpu_enc_open() is called later on demand during encoding, to accomodate * for potentially changing parameters like width, height, quality factor */ *jpeg_encoder = jpegenc; return IMX_VPU_ENC_RETURN_CODE_OK; error: if ((jpegenc != NULL) && (jpegenc->bitstream_buffer != NULL)) imx_vpu_dma_buffer_deallocate(jpegenc->bitstream_buffer); return ret; }