示例#1
0
cv::Mat IPLImage::toCvMat()
{
    cv::Mat mat(_height, _width, CV_8UC4, rgb32());

    // slower float version
    /*
    cv::Mat mat(_height, _width, CV_32FC3);
    for(int y = 0; y<_height; y++)
    {
        for(int x = 0; x<_width; x++)
        {
            float r = _planes[0]->p(x,y);
            float g = _planes[1]->p(x,y);
            float b = _planes[2]->p(x,y);

            cv::Vec3f value;
            value.val[0] = b;
            value.val[1] = g;
            value.val[2] = r;

            mat.at<cv::Vec3f>(y, x) = value;
        }
    }*/

    return mat;
}
示例#2
0
int
VideoRenderer::DeliverFrame(unsigned char* buffer, int buffer_size, uint32_t time_stamp, int64_t render_time)
{
    PRTime epoch_c = PR_Now();
    PRFloat64 epoch = (PRFloat64)(epoch_c / MICROSECONDS);
    epoch += ((PRFloat64)(epoch_c % MICROSECONDS)) / MICROSECONDS;

    int fsize = width * height * 4;
    if (vCanvas) {
        /* Convert i420 to RGB32 to write on canvas */
        nsAutoArrayPtr<PRUint8> rgb32(new PRUint8[fsize]);
        I420toRGB32(width, height,
            (const char *)buffer, (char *)rgb32.get()
        );

        nsCOMPtr<nsIRunnable> render = new CanvasRenderer(
            vCanvas, width, height, rgb32, fsize
        );

        NS_DispatchToMainThread(render);
    }

    return 0;
}
示例#3
0
STDMETHODIMP
VideoSourceWin::SampleCB(double Time, IMediaSample *pSample)
{
    HRESULT hr;
    nsresult rv;
    
    PRUint32 wr;
    BYTE *pBuffer;
    long bufferLen;
    PRUint8 *i420buf;
    int start, end, fsize, isize, bpp;
    
    bpp = 4;
    fsize = width * height * 4;
    isize = width * height * 3 / 2;
    bufferLen = pSample->GetActualDataLength();
    
    hr = pSample->GetPointer(&pBuffer);
    nsAutoArrayPtr<PRUint8> rgb32(new PRUint8[bufferLen]);
    memcpy(rgb32.get(), pBuffer, bufferLen);
    pBuffer = rgb32.get();
    
    /* Reverse RGB32 top-down */
    PRUint8 tmp;
    for (start = 0, end = bufferLen - bpp;
            start < bufferLen / 2;
            start += bpp, end -= bpp) {

        /* While we're here let's do a RGB<->BGR swap */
        tmp = pBuffer[start];
        pBuffer[start] = pBuffer[end+2];
        pBuffer[end+2] = tmp;
        
        tmp = pBuffer[start+1];
        pBuffer[start+1] = pBuffer[end+1];
        pBuffer[end+1] = tmp;
        
        tmp = pBuffer[start+2];
        pBuffer[start+2] = pBuffer[end];
        pBuffer[end] = tmp;
        
        tmp = pBuffer[start+3];
        pBuffer[start+3] = pBuffer[end+3];
        pBuffer[end+3] = tmp;
    }
    
    /* Write header: timestamp + length */
    if (is_rec != PR_TRUE)
        return S_OK;
    
    //PRFloat64 current = epoch + Time;
    PRTime epoch_c = PR_Now();
    PRFloat64 epoch = (PRFloat64)(epoch_c / MICROSECONDS);
    epoch += ((PRFloat64)(epoch_c % MICROSECONDS)) / MICROSECONDS;
    
    rv = output->Write(
        (const char *)&epoch, sizeof(PRFloat64), &wr
    );
    rv = output->Write(
        (const char *)&isize, sizeof(PRUint32), &wr
    );
    /* Write to pipe after converting to i420 */
    i420buf = (PRUint8 *)PR_Calloc(isize, sizeof(PRUint8));
    RGB32toI420(width, height, (const char *)pBuffer, (char *)i420buf);
    rv = output->Write((const char *)i420buf, isize, &wr);
    PR_Free(i420buf);
    
    /* Write sample to canvas if neccessary */
    if (vCanvas) {
        nsCOMPtr<nsIRunnable> render = new CanvasRenderer(
            vCanvas, width, height, rgb32, fsize
        );
        rv = NS_DispatchToMainThread(render);
    }
    rgb32 = NULL; // AutoPtr should free this?
    
    return S_OK;
}
/* 565RLE image format: [count(2 bytes), rle(2 bytes)] */
int load_565rle_image(char *filename, bool bf_supported)
{
	struct fb_info *info;
	int fd, count, err = 0;
	unsigned max;
	unsigned short *data, *ptr ;
	uint32_t *bits;
	unsigned int out;

	info = registered_fb[0];
	if (!info) {
		printk(KERN_WARNING "%s: Can not access framebuffer\n",
			__func__);
		return -ENODEV;
	}

	fd = sys_open(filename, O_RDONLY, 0);
	if (fd < 0) {
		printk(KERN_WARNING "%s: Can not open %s\n",
			__func__, filename);
		return -ENOENT;
	}
	count = sys_lseek(fd, (off_t)0, 2);
	if (count <= 0) {
		err = -EIO;
		goto err_logo_close_file;
	}
	sys_lseek(fd, (off_t)0, 0);
	data = kmalloc(count, GFP_KERNEL);
	if (!data) {
		printk(KERN_WARNING "%s: Can not alloc data\n", __func__);
		err = -ENOMEM;
		goto err_logo_close_file;
	}
	if (sys_read(fd, (char *)data, count) != count) {
		err = -EIO;
		goto err_logo_free_data;
	}

	max = fb_width(info) * fb_height(info);
	ptr = data;
	if (bf_supported && (info->node == 1 || info->node == 2)) {
		err = -EPERM;
		pr_err("%s:%d no info->creen_base on fb%d!\n",
		       __func__, __LINE__, info->node);
		goto err_logo_free_data;
	}
	bits = (uint32_t*)(info->screen_base);
	while (count > 3) {
		unsigned n = ptr[0];
		if (n > max)
			break;
		out = rgb32(ptr[1]);  

		memset32(bits, out, n << 2);
		bits += n;
		max -= n;
		ptr += 2;
		count -= 4;
	}

err_logo_free_data:
	kfree(data);
err_logo_close_file:
	sys_close(fd);
	return err;
}
示例#5
0
STDMETHODIMP
VideoSourceWinCallback::SampleCB(double Time, IMediaSample *pSample)
{
    HRESULT hr;
    nsresult rv;
    
    PRUint32 wr;
    BYTE *pBuffer;
    long bufferLen;
    PRUint8 *i420buf;
    int start, end, fsize, isize, bpp;
    
    bpp = 4;
    fsize = w * h * 4;
    isize = w * h * 3 / 2;
    bufferLen = pSample->GetActualDataLength();
    
    hr = pSample->GetPointer(&pBuffer);
    nsAutoArrayPtr<PRUint8> rgb32(new PRUint8[bufferLen]);
    memcpy(rgb32.get(), pBuffer, bufferLen);
    pBuffer = rgb32.get();
    
    /* Reverse RGB32 top-down */
    PRUint8 tmp;
    for (start = 0, end = bufferLen - bpp;
            start < bufferLen / 2;
            start += bpp, end -= bpp) {

        /* While we're here let's do a RGB<->BGR swap */
        tmp = pBuffer[start];
        pBuffer[start] = pBuffer[end+2];
        pBuffer[end+2] = tmp;
        
        tmp = pBuffer[start+1];
        pBuffer[start+1] = pBuffer[end+1];
        pBuffer[end+1] = tmp;
        
        tmp = pBuffer[start+2];
        pBuffer[start+2] = pBuffer[end];
        pBuffer[end] = tmp;
        
        tmp = pBuffer[start+3];
        pBuffer[start+3] = pBuffer[end+3];
        pBuffer[end+3] = tmp;
    }
    
    /* Write sample to canvas if neccessary */
    if (vCanvas) {
        nsCOMPtr<nsIRunnable> render = new CanvasRenderer(
            vCanvas, w, h, rgb32, fsize
        );
        rv = NS_DispatchToMainThread(render);
    }
    
    /* Write to pipe after converting to i420 */
    i420buf = (PRUint8 *)PR_Calloc(isize, sizeof(PRUint8));
    RGB32toI420(w, h, (const char *)pBuffer, (char *)i420buf);
    rv = output->Write((const char *)i420buf, isize, &wr);
    PR_Free(i420buf);
    
    return S_OK;
}