Example #1
0
static int encoder_allocate_framebuffer(struct EncodingInstance* instance)
{
	EncHandle handle = instance->handle;
	int i, enc_stride, src_stride, fbcount = instance->fbcount, src_fbid = instance->src_fbid;
	RetCode ret;
	FrameBuffer *fb;
	struct frame_buf **pfbpool;

	fb = instance->fb = calloc(fbcount + 1, sizeof(FrameBuffer));
	if(fb == NULL)
	{
		fputs("Failed to allocate enc->fb\n", stderr);
		return -1;
	}

	pfbpool = instance->pfbpool = calloc(fbcount + 1, sizeof(struct frame_buf*));
	if(pfbpool == NULL)
	{
		fputs("Failed to allocate enc->pfbpool", stderr);
		free(fb);
		return -1;
	}

	for(i = 0; i < fbcount; i++)
	{
		pfbpool[i] = framebuf_alloc(STD_AVC, MODE420, (instance->enc_picwidth + 15) & ~15, (instance->enc_picheight + 15) & ~15);

		if(pfbpool[i] == NULL)
		{
			fbcount = i;
			goto err1;
		}

		fb[i].bufY = pfbpool[i]->addrY;
		fb[i].bufCb = pfbpool[i]->addrCb;
		fb[i].bufCr = pfbpool[i]->addrCr;
		fb[i].strideY = pfbpool[i]->strideY;
		fb[i].strideC = pfbpool[i]->strideC;
	}

	/* Must be a multiple of 16 */

	enc_stride = (instance->enc_picwidth + 15) & ~15;
	src_stride = (instance->src_picwidth + 15) & ~15;

	ret = vpu_EncRegisterFrameBuffer(handle, fb, fbcount, enc_stride, src_stride);
	if(ret != RETCODE_SUCCESS)
	{
		fputs("Register frame buffer failed", stderr);
		goto err1;
	}

	pfbpool[src_fbid] = framebuf_alloc(STD_AVC, MODE420, instance->src_picwidth, instance->src_picheight);

	if(pfbpool[src_fbid] == NULL)
	{
		goto err1;
	}

	fb[src_fbid].bufY = pfbpool[src_fbid]->addrY;
	fb[src_fbid].bufCb = pfbpool[src_fbid]->addrCb;
	fb[src_fbid].bufCr = pfbpool[src_fbid]->addrCr;
	fb[src_fbid].strideY = pfbpool[src_fbid]->strideY;
	fb[src_fbid].strideC = pfbpool[src_fbid]->strideC;
	instance->fbcount++;

	return 0;

	err1: for(i = 0; i < fbcount; i++)
	{
		framebuf_free(pfbpool[i]);
	}

	free(fb);
	free(pfbpool);
	return -1;
}
Example #2
0
int VpuDec::calloc_FrameBuff(VencBlk * src)
{	
	int mvCol = 1;
	int ret = -1;
	int i;
	DecBufInfo bufinfo;
	FrameBuffer *fb;
	struct frame_buf **pfbpool;

	if (dec_format == STD_MJPG)
		mvCol = 0;
	
	fb = dec_fb = (FrameBuffer *)calloc(regfbcount, sizeof(FrameBuffer));
	if (fb == NULL) {
		printf("Failed to allocate fb,LINE:%d\n",__LINE__);
		return -1;
	}

	pfbpool = dec_pfbpool = (frame_buf **)calloc(regfbcount, sizeof(struct frame_buf *));
	if (pfbpool == NULL) {
		printf("Failed to allocate pfbpool,LINE:%d\n",__LINE__);
		free(dec_fb);
		dec_fb = NULL;
		return -1;
	}

	for (i = 0; i < regfbcount; i++) {
		pfbpool[i] = framebuf_alloc(&fbpool[i], STD_AVC, 0, src->width, src->height, mvCol);
		if (pfbpool[i] == NULL)
			return -1;
	}

	for (i = 0; i < regfbcount; i++) {
			fb[i].myIndex = i;
			fb[i].bufY = pfbpool[i]->addrY;
			fb[i].bufCb = pfbpool[i]->addrCb;
			fb[i].bufCr = pfbpool[i]->addrCr;
			fb[i].bufMvCol = pfbpool[i]->mvColBuf;
	}

	if (dec_format == STD_AVC) {
		ret = IOGetPhyMem(&slice_mem_desc);
			if (ret) {
				printf("Unable to obtain physical slice save mem,LINE:%d\n",__LINE__);
				return -1;
			}

		bufinfo.avcSliceBufInfo.bufferBase = slice_mem_desc.phy_addr;
		bufinfo.avcSliceBufInfo.bufferSize = slice_mem_desc.size;
	}

	bufinfo.maxDecFrmInfo.maxMbX = src->width / 16;
	bufinfo.maxDecFrmInfo.maxMbY = src->height / 16;
	bufinfo.maxDecFrmInfo.maxMbNum = src->width * src->height / 256;

	ret = vpu_DecRegisterFrameBuffer(handle, fb, regfbcount, src->width, &bufinfo);
	if (ret != RETCODE_SUCCESS) {
		printf("Register frame buffer failed, ret=%d,LINE:%d\n", ret,__LINE__);
		return -1;
	}
	
	return 0;

}
Example #3
0
int32_t encoder_allocate_framebuffer(struct encode *enc)
{
    EncHandle handle = enc->handle;
    int32_t i, enc_stride, src_stride, src_fbid;
    int32_t totalfb, minfbcount, srcfbcount, extrafbcount;
    RetCode ret;
    FrameBuffer *fb;
    PhysicalAddress subSampBaseA = 0, subSampBaseB = 0;
    struct frame_buf **pfbpool;
    EncExtBufInfo extbufinfo = { 0 };
    int32_t enc_fbwidth, enc_fbheight, src_fbwidth, src_fbheight;

    minfbcount = enc->minFrameBufferCount;
    srcfbcount = 1;

    enc_fbwidth = (enc->enc_picwidth + 15) & ~15;
    enc_fbheight = (enc->enc_picheight + 15) & ~15;
    src_fbwidth = (enc->src_picwidth + 15) & ~15;
    src_fbheight = (enc->src_picheight + 15) & ~15;

    if (cpu_is_mx6()) {
        if (enc->codecctrl->format == STD_AVC && enc->mvc_extension)    /* MVC */
            extrafbcount = 2 + 2;   /* Subsamp [2] + Subsamp MVC [2] */
        else if (enc->codecctrl->format == STD_MJPG)
            extrafbcount = 0;
        else
            extrafbcount = 2;   /* Subsamp buffer [2] */
    } else
        extrafbcount = 0;

    enc->totalfb = totalfb = minfbcount + extrafbcount + srcfbcount;

    /* last framebuffer is used as src frame in the test */
    enc->src_fbid = src_fbid = totalfb - 1;

    fb = enc->fb = calloc(totalfb, sizeof(FrameBuffer));
    if (fb == NULL) {
        err_msg("Failed to allocate enc->fb\n");
        return -1;
    }

    pfbpool = enc->pfbpool = calloc(totalfb, sizeof(struct frame_buf *));
    if (pfbpool == NULL) {
        err_msg("Failed to allocate enc->pfbpool\n");
        free(fb);
        return -1;
    }

    if (enc->codecctrl->mapType == LINEAR_FRAME_MAP) {
        /* All buffers are linear */
        for (i = 0; i < minfbcount + extrafbcount; i++) {
            pfbpool[i] = framebuf_alloc(enc->codecctrl->format, enc->mjpg_fmt,
                                        enc_fbwidth, enc_fbheight, 0);
            if (pfbpool[i] == NULL) {
                goto err1;
            }
        }
    } else {
        /* Encoded buffers are tiled */
        for (i = 0; i < minfbcount; i++) {
            pfbpool[i] = tiled_framebuf_alloc(enc->codecctrl->format, enc->mjpg_fmt,
                                              enc_fbwidth, enc_fbheight, 0,
                                              enc->codecctrl->mapType);
            if (pfbpool[i] == NULL)
                goto err1;
        }
        /* sub frames are linear */
        for (i = minfbcount; i < minfbcount + extrafbcount; i++) {
            pfbpool[i] = framebuf_alloc(enc->codecctrl->format, enc->mjpg_fmt,
                                        enc_fbwidth, enc_fbheight, 0);
            if (pfbpool[i] == NULL)
                goto err1;
        }
    }

    for (i = 0; i < minfbcount + extrafbcount; i++) {
        fb[i].myIndex = i;
        fb[i].bufY = pfbpool[i]->addrY;
        fb[i].bufCb = pfbpool[i]->addrCb;
        fb[i].bufCr = pfbpool[i]->addrCr;
        fb[i].strideY = pfbpool[i]->strideY;
        fb[i].strideC = pfbpool[i]->strideC;
    }

    if (cpu_is_mx6() && (enc->codecctrl->format != STD_MJPG)) {
        subSampBaseA = fb[minfbcount].bufY;
        subSampBaseB = fb[minfbcount + 1].bufY;
        if (enc->codecctrl->format == STD_AVC && enc->mvc_extension) {  /* MVC */
            extbufinfo.subSampBaseAMvc = fb[minfbcount + 2].bufY;
            extbufinfo.subSampBaseBMvc = fb[minfbcount + 3].bufY;
        }
    }

    /* Must be a multiple of 16 */
    if (enc->codecctrl->rot_angle == 90 || enc->codecctrl->rot_angle == 270)
        enc_stride = (enc->enc_picheight + 15) & ~15;
    else
        enc_stride = (enc->enc_picwidth + 15) & ~15;
    src_stride = (enc->src_picwidth + 15) & ~15;

    extbufinfo.scratchBuf = enc->scratchBuf;
    ret = VPU_EncRegisterFrameBuffer(handle, fb, minfbcount, enc_stride, src_stride,
                                     subSampBaseA, subSampBaseB, &extbufinfo);
    if (ret != RETCODE_SUCCESS) {
        err_msg("Register frame buffer failed\n");
        goto err1;
    }

    {
        /* Allocate a single frame buffer for source frame */
        pfbpool[src_fbid] = framebuf_alloc(enc->codecctrl->format, enc->mjpg_fmt,
                                           src_fbwidth, src_fbheight, 0);
        if (pfbpool[src_fbid] == NULL) {
            err_msg("failed to allocate single framebuf\n");
            goto err1;
        }

        fb[src_fbid].myIndex = enc->src_fbid;
        fb[src_fbid].bufY = pfbpool[src_fbid]->addrY;
        fb[src_fbid].bufCb = pfbpool[src_fbid]->addrCb;
        fb[src_fbid].bufCr = pfbpool[src_fbid]->addrCr;
        fb[src_fbid].strideY = pfbpool[src_fbid]->strideY;
        fb[src_fbid].strideC = pfbpool[src_fbid]->strideC;
    }

    return 0;

  err1:
    for (i = 0; i < totalfb; i++) {
        framebuf_free(pfbpool[i]);
    }

    free(fb);
    free(pfbpool);
    return -1;
}