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; }
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; }
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; }
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; }