<div dir="ltr"><div class="gmail_default" style="color:rgb(68,68,68)"><font size="2"><span style="font-family:arial,helvetica,sans-serif">Hello all,<br></span></font>
<font size="2"><span style="font-family:arial,helvetica,sans-serif"><br>
I am working on encoding a raw yuv stream coming directly from webcam,
using v4l2. The issue that I am facing is that even after using <b><i>avpicture_fill </i></b></span></font>and assigning every buffer separately as<br><br><b><i>frame->data[0] = buffers[buf.index].start;<br>frame->data[1] = (buffers[buf.index].start)+1;<br>frame->data[2] = (buffers[buf.index].start)+3;</i></b><br></div><div><div class="gmail_signature"><div dir="ltr"><div><br><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(68,68,68)"><span style="font-family:arial,helvetica,sans-serif">The output is not getting encoded and I am getting raw video.</span> <span style="font-family:arial,helvetica,sans-serif">My Code is</span><br><br><i><span style="font-family:arial,helvetica,sans-serif">#include "libavutil/opt.h"<br>#include "libavcodec/avcodec.h"<br>#include "libavutil/channel_layout.h"<br>#include "libavutil/common.h"<br>#include "libavutil/imgutils.h"<br>#include "libavutil/mathematics.h"<br>#include "libavutil/samplefmt.h"<br>#include "stdio.h"<br>#include "stdlib.h"<br>#include "string.h"<br>#include "assert.h"<br>#include "getopt.h"<br>#include "fcntl.h"<br>#include "unistd.h"<br>#include "errno.h"<br>#include "malloc.h"<br>#include "sys/stat.h"<br>#include "sys/types.h"<br>#include "sys/time.h"<br>#include "sys/mman.h"<br>#include "sys/ioctl.h"<br>#include "asm/types.h"<br>#include "linux/videodev2.h"<br><br>#define INBUF_SIZE 4096<br>#define AUDIO_INBUF_SIZE 20480<br>#define AUDIO_REFILL_THRESH 4096<br>#define CLEAR(x) memset (&(x), 0, sizeof (x))<br><br>unsigned char *outbuffer = NULL;<br>unsigned long buff_siz = 0;<br>char out_name[256];<br><br>typedef enum <br>{<br>#ifdef IO_READ<br> IO_METHOD_READ,<br>#endif<br>#ifdef IO_MMAP<br> IO_METHOD_MMAP,<br>#endif<br>#ifdef IO_USERPTR<br> IO_METHOD_USERPTR,<br>#endif<br>}io_method;<br><br>struct buffer <br>{<br> void *start;<br> size_t length;<br>};<br><br>static io_method io = IO_METHOD_MMAP;<br>static int fd = -1;<br>struct buffer * buffers = NULL;<br>static unsigned int n_buffers = 0;<br><br>// global settings<br>static unsigned int width = 640;<br>static unsigned int height = 480;<br>static unsigned char jpegQuality = 70;<br>//static char* jpegFilename = NULL;<br>static char* deviceName = "/dev/video0";<br><br>AVCodec *codec;<br>AVCodecContext *c= NULL;<br>int i, ret, x, y, got_output;<br>FILE *fout;<br>AVFrame *frame;<br>AVPacket pkt;<br>uint8_t endcode[] = { 0, 0, 1, 0xb7 };<br>static int num=0;<br><br>/**<br> Convert from YUV422 format to RGB888. Formulae are described on <a href="http://en.wikipedia.org/wiki/YUV">http://en.wikipedia.org/wiki/YUV</a><br><br> \param width width of image<br> \param height height of image<br> \param src source<br> \param dst destination<br>*/<br>static void YUV422toRGB888(int width, int height, unsigned char *src, unsigned char *dst)<br>{<br> int line, column;<br> unsigned char *py, *pu, *pv;<br> unsigned char *tmp = dst;<br><br> /* In this format each four bytes is two pixels. Each four bytes is two Y's, a Cb and a Cr. <br> Each Y goes to one of the pixels, and the Cb and Cr belong to both pixels. */<br> py = src;<br> pu = src + 1;<br> pv = src + 3;<br><br> #define CLIP(x) ( (x)>=0xFF ? 0xFF : ( (x) <= 0x00 ? 0x00 : (x) ) )<br><br> for (line = 0; line < height; ++line) {<br> for (column = 0; column < width; ++column) {<br> *tmp++ = CLIP((double)*py + 1.402*((double)*pv-128.0));<br> *tmp++ = CLIP((double)*py - 0.344*((double)*pu-128.0) - 0.714*((double)*pv-128.0)); <br> *tmp++ = CLIP((double)*py + 1.772*((double)*pu-128.0));<br><br> // increase py every time<br> py += 2;<br> // increase pu,pv every second time<br> if ((column & 1)==1) {<br> pu += 4;<br> pv += 4;<br> }<br> }<br> }<br>}<br><br>/**<br> Print error message and terminate programm with EXIT_FAILURE return code.<br> \param s error message to print<br>*/<br>static void errno_exit(const char* s)<br>{<br> fprintf(stderr, "%s error %d, %s\n", s, errno, strerror (errno));<br> exit(EXIT_FAILURE);<br>}<br><br>/**<br> Do ioctl and retry if error was EINTR ("A signal was caught during the ioctl() operation."). Parameters are the same as on ioctl.<br><br> \param fd file descriptor<br> \param request request<br> \param argp argument<br> \returns result from ioctl<br>*/<br>static int xioctl(int fd, int request, void* argp)<br>{<br> int r;<br><br> do r = ioctl(fd, request, argp);<br> while (-1 == r && EINTR == errno);<br><br> return r;<br>}<br><br>/*<br> process image read<br>*/<br>static void imageProcess(const void* p)<br>{<br> unsigned char* src = (unsigned char*)p;<br> unsigned char* dst = malloc(width*height*3*sizeof(char));<br><br> // convert from YUV422 to RGB888<br> YUV422toRGB888(width,height,src,dst);<br><br>}<br><br>void print_array(int *ptr,int len)<br>{<br>// while(len-- > 0)<br>// {<br> printf("YUV Data is %x\n",*ptr);<br> ptr++;<br>// }<br>}<br><br>/**<br> read single frame<br>*/<br><br>static int frameRead(void)<br>{<br> struct v4l2_buffer buf;<br>#ifdef IO_USERPTR<br> unsigned int i;<br>#endif<br><br> switch (io)<br> {<br>#ifdef IO_READ<br> case IO_METHOD_READ:<br> if (-1 == read (fd, buffers[0].start, buffers[0].length))<br> {<br> switch (errno)<br> {<br> case EAGAIN:<br> return 0;<br><br> case EIO:<br> // Could ignore EIO, see spec.<br><br> // fall through<br> default:<br> errno_exit("read");<br> }<br> }<br><br> imageProcess(buffers[0].start);<br> break;<br>#endif<br><br>#ifdef IO_MMAP<br> case IO_METHOD_MMAP:<br> CLEAR (buf);<br><br> buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;<br> buf.memory = V4L2_MEMORY_MMAP;<br><br> if (-1 == xioctl(fd, VIDIOC_DQBUF, &buf))<br> {<br> switch (errno)<br> {<br> case EAGAIN:<br> return 0;<br><br> case EIO:<br> // Could ignore EIO, see spec<br><br> // fall through<br> default:<br> errno_exit("VIDIOC_DQBUF");<br> }<br> }<br><br> assert (buf.index < n_buffers);<br><br> if (-1 == xioctl(fd, VIDIOC_QBUF, &buf))<br> errno_exit("VIDIOC_QBUF");<br><br> av_init_packet(&pkt);<br> pkt.data = NULL; // packet data will be allocated by the encoder<br> pkt.size = 0;<br> fflush(stdout);<br> avpicture_fill((AVPicture*)frame, NULL, frame->format, frame->width, frame->height);<br> frame->data[0] = buffers[buf.index].start;<br> frame->data[1] = (buffers[buf.index].start)+1;<br> frame->data[2] = (buffers[buf.index].start)+3;<br>// print_array(buffers[buf.index].start,buffers[buf.index].length);<br> frame->pts = num;<br> num++;<br><br> /* encode the image */<br> ret = avcodec_encode_video2(c, &pkt, frame, &got_output);<br> if (ret < 0)<br> {<br> fprintf(stderr, "Error encoding frame\n");<br> exit(1);<br> }<br> if (got_output)<br> {<br>// printf("Write frame %3d (size=%5d)\n", num, pkt.size);<br> fwrite(pkt.data, 1, pkt.size, fout);<br> av_free_packet(&pkt);<br> }<br><br> break;<br>#endif<br><br>#ifdef IO_USERPTR<br> case IO_METHOD_USERPTR:<br> CLEAR (buf);<br><br> buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;<br> buf.memory = V4L2_MEMORY_USERPTR;<br><br> if (-1 == xioctl(fd, VIDIOC_DQBUF, &buf)) {<br> switch (errno) {<br> case EAGAIN:<br> return 0;<br><br> case EIO:<br> // Could ignore EIO, see spec.<br><br> // fall through<br> default:<br> errno_exit("VIDIOC_DQBUF");<br> <br> }<br> }<br><br> for (i = 0; i < n_buffers; ++i)<br> if (buf.m.userptr == (unsigned long) buffers[i].start && buf.length == buffers[i].length)<br> break;<br><br> assert (i < n_buffers);<br><br> imageProcess((void *) buf.m.userptr);<br><br> if (-1 == xioctl(fd, VIDIOC_QBUF, &buf))<br> errno_exit("VIDIOC_QBUF");<br> break;<br>#endif<br> }<br> return 1;<br>}<br><br>/** <br> mainloop: read frames and process them<br>*/<br>static void mainLoop(void)<br>{<br> unsigned int count,codec_id=AV_CODEC_ID_H264;<br> char *filename="abc.flv";<br> count = 300;<br><br> avcodec_register_all();<br><br> printf("Encode video file %s\n", filename);<br> /* find the mpeg1 video encoder */<br> codec = avcodec_find_encoder(codec_id);<br> if (!codec)<br> {<br> fprintf(stderr, "Codec not found\n");<br> exit(1);<br> }<br> c = avcodec_alloc_context3(codec);<br> if (!c)<br> {<br> fprintf(stderr, "Could not allocate video codec context\n");<br> exit(1);<br> }<br> /* put sample parameters */<br> c->bit_rate = 10000000;<br> /* resolution must be a multiple of two */<br> c->width = 640;<br> c->height = 480;<br> /* frames per second */<br> c->time_base = (AVRational){1,25};<br> c->gop_size = 10; /* emit one intra frame every ten frames */<br> c->max_b_frames = 1;<br> c->pix_fmt = AV_PIX_FMT_YUV420P;<br> if (codec_id == AV_CODEC_ID_H264)<br> av_opt_set(c->priv_data, "preset", "ultrafast", 0);<br> /* open it */<br> if (avcodec_open2(c, codec, NULL) < 0)<br> {<br> fprintf(stderr, "Could not open codec\n");<br> exit(1);<br> }<br> fout = fopen(filename, "wb");<br> if (!fout)<br> {<br> fprintf(stderr, "Could not open %s\n", filename);<br> exit(1);<br> }<br> frame = av_frame_alloc();<br> if (!frame)<br> {<br> fprintf(stderr, "Could not allocate video frame\n");<br> exit(1);<br> }<br> frame->format = c->pix_fmt;<br> frame->width = c->width;<br> frame->height = c->height;<br> /* the image can be allocated by any means and av_image_alloc() is<br> * just the most convenient way if av_malloc() is to be used */<br>// ret = av_image_alloc(frame->data, frame->linesize, c->width, c->height,c->pix_fmt, 32);<br>// if (ret < 0)<br>// {<br>// fprintf(stderr, "Could not allocate raw picture buffer\n");<br>// exit(1);<br>// }<br><br> while (count-- > 0)<br> {<br> for (;;)<br> {<br> fd_set fds;<br> struct timeval tv;<br> int r;<br><br> FD_ZERO(&fds);<br> FD_SET(fd, &fds);<br><br> /* Timeout. */<br> tv.tv_sec = 10;<br> tv.tv_usec = 0;<br><br> r = select(fd + 1, &fds, NULL, NULL, &tv);<br><br> if (-1 == r) {<br> if (EINTR == errno)<br> continue;<br><br> errno_exit("select");<br> }<br><br> if (0 == r) {<br> fprintf (stderr, "select timeout\n");<br> exit(EXIT_FAILURE);<br> }<br><br> if (frameRead())<br> break;<br><br><br> /* EAGAIN - continue select loop. */<br> }<br> }<br> for (got_output = 1; got_output; num++)<br> {<br> fflush(stdout);<br> ret = avcodec_encode_video2(c, &pkt, NULL, &got_output);<br> if (ret < 0)<br> {<br> fprintf(stderr, "Error encoding frame\n");<br> exit(1);<br> }<br> if (got_output)<br> {<br>// printf("Write frame %3d (size=%5d)\n", num, pkt.size);<br> fwrite(pkt.data, 1, pkt.size, fout);<br> av_free_packet(&pkt);<br> }<br> }<br> /* add sequence end code to have a real mpeg file */<br> fwrite(endcode, 1, sizeof(endcode), fout);<br> fclose(fout);<br> avcodec_close(c);<br> av_free(c);<br>// av_freep(&frame->data[0]);<br> av_frame_free(&frame);<br> printf("\n");<br>}<br><br>/**<br> stop capturing<br>*/<br>static void captureStop(void)<br>{<br> enum v4l2_buf_type type;<br><br> switch (io)<br> {<br>#ifdef IO_READ<br> case IO_METHOD_READ:<br> /* Nothing to do. */<br> break;<br>#endif<br><br>#ifdef IO_MMAP<br> case IO_METHOD_MMAP:<br>#endif<br>#ifdef IO_USERPTR<br> case IO_METHOD_USERPTR:<br>#endif<br>#if defined(IO_MMAP) || defined(IO_USERPTR)<br> type = V4L2_BUF_TYPE_VIDEO_CAPTURE;<br><br> if (-1 == xioctl(fd, VIDIOC_STREAMOFF, &type))<br> errno_exit("VIDIOC_STREAMOFF");<br><br> break;<br>#endif <br> }<br>}<br><br>/**<br> start capturing<br>*/<br>static void captureStart(void)<br>{<br> unsigned int i;<br> enum v4l2_buf_type type;<br><br> switch (io) {<br>#ifdef IO_READ <br> case IO_METHOD_READ:<br> /* Nothing to do. */<br> break;<br>#endif<br><br>#ifdef IO_MMAP<br> case IO_METHOD_MMAP:<br> for (i = 0; i < n_buffers; ++i)<br> {<br> struct v4l2_buffer buf;<br><br> CLEAR (buf);<br><br> buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;<br> buf.memory = V4L2_MEMORY_MMAP;<br> buf.index = i;<br><br> if (-1 == xioctl(fd, VIDIOC_QBUF, &buf))<br> errno_exit("VIDIOC_QBUF");<br> }<br> <br> type = V4L2_BUF_TYPE_VIDEO_CAPTURE;<br><br> if (-1 == xioctl(fd, VIDIOC_STREAMON, &type))<br> errno_exit("VIDIOC_STREAMON");<br><br> break;<br>#endif<br><br>#ifdef IO_USERPTR<br> case IO_METHOD_USERPTR:<br> for (i = 0; i < n_buffers; ++i) {<br> struct v4l2_buffer buf;<br><br> CLEAR (buf);<br><br> buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;<br> buf.memory = V4L2_MEMORY_USERPTR;<br> buf.index = i;<br> buf.m.userptr = (unsigned long) buffers[i].start;<br> buf.length = buffers[i].length;<br><br> if (-1 == xioctl(fd, VIDIOC_QBUF, &buf))<br> errno_exit("VIDIOC_QBUF");<br> }<br><br> type = V4L2_BUF_TYPE_VIDEO_CAPTURE;<br><br> if (-1 == xioctl(fd, VIDIOC_STREAMON, &type))<br> errno_exit("VIDIOC_STREAMON");<br><br> break;<br>#endif<br> }<br>}<br><br>static void deviceUninit(void)<br>{<br> unsigned int i;<br><br> switch (io) {<br>#ifdef IO_READ<br> case IO_METHOD_READ:<br> free(buffers[0].start);<br> break;<br>#endif<br><br>#ifdef IO_MMAP<br> case IO_METHOD_MMAP:<br> for (i = 0; i < n_buffers; ++i)<br> if (-1 == munmap (buffers[i].start, buffers[i].length))<br> errno_exit("munmap");<br> break;<br>#endif<br><br>#ifdef IO_USERPTR<br> case IO_METHOD_USERPTR:<br> for (i = 0; i < n_buffers; ++i)<br> free (buffers[i].start);<br> break;<br>#endif<br> }<br><br> free(buffers);<br>}<br><br>#ifdef IO_READ<br>static void readInit(unsigned int buffer_size)<br>{<br> buffers = calloc(1, sizeof(*buffers));<br><br> if (!buffers) {<br> fprintf (stderr, "Out of memory\n");<br> exit(EXIT_FAILURE);<br> }<br><br> buffers[0].length = buffer_size;<br> buffers[0].start = malloc (buffer_size);<br><br> if (!buffers[0].start) {<br> fprintf (stderr, "Out of memory\n");<br> exit(EXIT_FAILURE);<br> }<br>}<br>#endif<br><br>#ifdef IO_MMAP<br>static void mmapInit(void)<br>{<br> struct v4l2_requestbuffers req;<br><br> CLEAR (req);<br><br> req.count = 4;<br> req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;<br> req.memory = V4L2_MEMORY_MMAP;<br><br> if (-1 == xioctl(fd, VIDIOC_REQBUFS, &req)) {<br> if (EINVAL == errno) {<br> fprintf(stderr, "%s does not support memory mapping\n", deviceName);<br> exit(EXIT_FAILURE);<br> } else {<br> errno_exit("VIDIOC_REQBUFS");<br> }<br> }<br><br> if (req.count < 2) {<br> fprintf(stderr, "Insufficient buffer memory on %s\n", deviceName);<br> exit(EXIT_FAILURE);<br> }<br><br> buffers = calloc(req.count, sizeof(*buffers));<br><br> if (!buffers) {<br> fprintf(stderr, "Out of memory\n");<br> exit(EXIT_FAILURE);<br> }<br><br> for (n_buffers = 0; n_buffers < req.count; ++n_buffers) {<br> struct v4l2_buffer buf;<br><br> CLEAR (buf);<br><br> buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;<br> buf.memory = V4L2_MEMORY_MMAP;<br> buf.index = n_buffers;<br><br> if (-1 == xioctl(fd, VIDIOC_QUERYBUF, &buf))<br> errno_exit("VIDIOC_QUERYBUF");<br><br> buffers[n_buffers].length = buf.length;<br> buffers[n_buffers].start =<br> mmap (NULL /* start anywhere */, buf.length, PROT_READ | PROT_WRITE /* required */, MAP_SHARED /* recommended */, fd, buf.m.offset);<br><br> if (MAP_FAILED == buffers[n_buffers].start)<br> errno_exit("mmap");<br> }<br>}<br>#endif<br><br>#ifdef IO_USERPTR<br>static void userptrInit(unsigned int buffer_size)<br>{<br> struct v4l2_requestbuffers req;<br> unsigned int page_size;<br><br> page_size = getpagesize ();<br> buffer_size = (buffer_size + page_size - 1) & ~(page_size - 1);<br><br> CLEAR(req);<br><br> req.count = 4;<br> req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;<br> req.memory = V4L2_MEMORY_USERPTR;<br><br> if (-1 == xioctl(fd, VIDIOC_REQBUFS, &req)) {<br> if (EINVAL == errno) {<br> fprintf(stderr, "%s does not support user pointer i/o\n", deviceName);<br> exit(EXIT_FAILURE);<br> } else {<br> errno_exit("VIDIOC_REQBUFS");<br> }<br> }<br><br> buffers = calloc(4, sizeof (*buffers));<br><br> if (!buffers) {<br> fprintf(stderr, "Out of memory\n");<br> exit(EXIT_FAILURE);<br> }<br><br> for (n_buffers = 0; n_buffers < 4; ++n_buffers) {<br> buffers[n_buffers].length = buffer_size;<br> buffers[n_buffers].start = memalign (/* boundary */ page_size, buffer_size);<br><br> if (!buffers[n_buffers].start) {<br> fprintf(stderr, "Out of memory\n");<br> exit(EXIT_FAILURE);<br> }<br> }<br>}<br>#endif<br><br>/**<br> initialize device<br>*/<br>static void deviceInit(void)<br>{<br> struct v4l2_streamparm stream;<br> struct v4l2_capability cap;<br> struct v4l2_cropcap cropcap;<br> struct v4l2_crop crop;<br> struct v4l2_format fmt;<br> unsigned int min;<br><br> if (-1 == xioctl(fd, VIDIOC_QUERYCAP, &cap))<br> {<br> if (EINVAL == errno)<br> {<br> fprintf(stderr, "%s is no V4L2 device\n",deviceName);<br> exit(EXIT_FAILURE);<br> }<br> else<br> {<br> errno_exit("VIDIOC_QUERYCAP");<br> }<br> }<br><br> if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE))<br> {<br> fprintf(stderr, "%s is no video capture device\n",deviceName);<br> exit(EXIT_FAILURE);<br> }<br><br> if (-1 == xioctl(fd, VIDIOC_G_PARM, &stream))<br> {<br>// if (EINVAL == errno)<br>// {<br>// fprintf(stderr, "%s is no V4L2 device\n",deviceName);<br>// exit(EXIT_FAILURE);<br>// }<br>// else<br>// {<br>// errno_exit("VIDIOC_QUERYCAP");<br>// }<br> }<br> printf("Stream Paramater Type %u\n",stream.type);<br> printf("Input numerator %d\n",stream.parm.capture.timeperframe.numerator);<br> printf("Input denominator %d\n",stream.parm.capture.timeperframe.denominator);<br><br> printf("output numerator %d\n",stream.parm.output.timeperframe.numerator);<br> printf("output denominator %d\n",stream.parm.output.timeperframe.denominator);<br> switch (io) {<br>#ifdef IO_READ<br> case IO_METHOD_READ:<br> if (!(cap.capabilities & V4L2_CAP_READWRITE)) {<br> fprintf(stderr, "%s does not support read i/o\n",deviceName);<br> exit(EXIT_FAILURE);<br> }<br> break;<br>#endif<br><br>#ifdef IO_MMAP<br> case IO_METHOD_MMAP:<br>#endif<br>#ifdef IO_USERPTR<br> case IO_METHOD_USERPTR:<br>#endif<br>#if defined(IO_MMAP) || defined(IO_USERPTR)<br> if (!(cap.capabilities & V4L2_CAP_STREAMING)) {<br> fprintf(stderr, "%s does not support streaming i/o\n",deviceName);<br> exit(EXIT_FAILURE);<br> }<br> break;<br>#endif<br> }<br><br><br> /* Select video input, video standard and tune here. */<br> CLEAR(cropcap);<br><br> cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;<br><br> if (0 == xioctl(fd, VIDIOC_CROPCAP, &cropcap))<br> {<br> crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;<br> crop.c = cropcap.defrect; /* reset to default */<br><br> if (-1 == xioctl(fd, VIDIOC_S_CROP, &crop)) {<br> switch (errno) {<br> case EINVAL:<br> /* Cropping not supported. */<br> break;<br> default:<br> /* Errors ignored. */<br> break;<br> }<br> }<br> } else {<br> /* Errors ignored. */<br> }<br><br> CLEAR (fmt);<br><br> // v4l2_format<br> fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;<br> fmt.fmt.pix.width = width; <br> fmt.fmt.pix.height = height;<br> fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;<br> fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;<br><br> if (-1 == xioctl(fd, VIDIOC_S_FMT, &fmt))<br> errno_exit("VIDIOC_S_FMT");<br><br> /* Note VIDIOC_S_FMT may change width and height. */<br> if (width != fmt.fmt.pix.width)<br> {<br> width = fmt.fmt.pix.width;<br> fprintf(stderr,"Image width set to %i by device %s.\n",width,deviceName);<br> }<br> if (height != fmt.fmt.pix.height)<br> {<br> height = fmt.fmt.pix.height;<br> fprintf(stderr,"Image height set to %i by device %s.\n",height,deviceName);<br> }<br><br> /* Buggy driver paranoia. */<br> min = fmt.fmt.pix.width * 2;<br> if (fmt.fmt.pix.bytesperline < min)<br> fmt.fmt.pix.bytesperline = min;<br> min = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height;<br> if (fmt.fmt.pix.sizeimage < min)<br> fmt.fmt.pix.sizeimage = min;<br><br> switch (io)<br> {<br>#ifdef IO_READ<br> case IO_METHOD_READ:<br> readInit(fmt.fmt.pix.sizeimage);<br> break;<br>#endif<br><br>#ifdef IO_MMAP<br> case IO_METHOD_MMAP:<br> mmapInit();<br> break;<br>#endif<br><br>#ifdef IO_USERPTR<br> case IO_METHOD_USERPTR:<br> userptrInit(fmt.fmt.pix.sizeimage);<br> break;<br>#endif<br> }<br>}<br><br>/**<br> close device<br>*/<br>static void deviceClose(void)<br>{<br> if (-1 == close (fd))<br> errno_exit("close");<br><br> fd = -1;<br>}<br><br>/**<br> open device<br>*/<br>static void deviceOpen(void)<br>{<br> struct stat st;<br><br> // stat file<br> if (-1 == stat(deviceName, &st))<br> {<br> fprintf(stderr, "Cannot identify '%s': %d, %s\n", deviceName, errno, strerror (errno));<br> exit(EXIT_FAILURE);<br> }<br><br> // check if its device<br> if (!S_ISCHR (st.st_mode))<br> {<br> fprintf(stderr, "%s is no device\n", deviceName);<br> exit(EXIT_FAILURE);<br> }<br><br> // open device<br> fd = open(deviceName, O_RDWR /* required */ | O_NONBLOCK, 0);<br><br> // check if opening was successfull<br> if (-1 == fd) {<br> fprintf(stderr, "Cannot open '%s': %d, %s\n", deviceName, errno, strerror (errno));<br> exit(EXIT_FAILURE);<br> }<br>}<br><br>/**<br> print usage information<br>*/<br>static void usage(FILE* fp, int argc, char** argv)<br>{<br> fprintf (fp,<br> "Usage: %s [options]\n\n"<br> "Options:\n"<br> "-d | --device name Video device name [/dev/video0]\n"<br> "-h | --help Print this message\n"<br> "-o | --output JPEG output filename\n"<br> "-q | --quality JPEG quality (0-100)\n"<br> "-m | --mmap Use memory mapped buffers\n"<br> "-r | --read Use read() calls\n"<br> "-u | --userptr Use application allocated buffers\n"<br> "-W | --width width\n"<br> "-H | --height height\n"<br> "",<br> argv[0]);<br>}<br><br>static const char short_options [] = "d:ho:q:mruW:H:";<br><br>static const struct option<br>long_options [] = {<br> { "device", required_argument, NULL, 'd' },<br> { "help", no_argument, NULL, 'h' },<br> { "output", required_argument, NULL, 'o' },<br> { "quality", required_argument, NULL, 'q' },<br> { "mmap", no_argument, NULL, 'm' },<br> { "read", no_argument, NULL, 'r' },<br> { "userptr", no_argument, NULL, 'u' },<br> { "width", required_argument, NULL, 'W' },<br> { "height", required_argument, NULL, 'H' },<br> { 0, 0, 0, 0 }<br>};<br><br>int main(int argc, char **argv)<br>{<br><br> for (;;) {<br> int index, c = 0;<br> <br> c = getopt_long(argc, argv, short_options, long_options, &index);<br><br> if (-1 == c)<br> break;<br><br> switch (c)<br> {<br> case 0: /* getopt_long() flag */<br> break;<br><br> case 'd':<br> deviceName = optarg;<br> break;<br><br> case 'h':<br> // print help<br> usage (stdout, argc, argv);<br> exit(EXIT_SUCCESS);<br><br> case 'q':<br> // set jpeg filename<br> jpegQuality = atoi(optarg);<br> break;<br><br> case 'm':<br>#ifdef IO_MMAP<br> io = IO_METHOD_MMAP;<br>#else<br> fprintf(stderr, "You didn't compile for mmap support.\n");<br> exit(EXIT_FAILURE); <br>#endif<br> break;<br><br> case 'r':<br>#ifdef IO_READ<br> io = IO_METHOD_READ;<br>#else<br> fprintf(stderr, "You didn't compile for read support.\n");<br> exit(EXIT_FAILURE); <br>#endif<br> break;<br><br> case 'u':<br>#ifdef IO_USERPTR<br> io = IO_METHOD_USERPTR;<br>#else<br> fprintf(stderr, "You didn't compile for userptr support.\n");<br> exit(EXIT_FAILURE); <br>#endif<br> break;<br><br> case 'W':<br> // set width<br> width = atoi(optarg);<br> break;<br><br> case 'H':<br> // set height<br> height = atoi(optarg);<br> break;<br><br> default:<br> usage(stderr, argc, argv);<br> exit(EXIT_FAILURE);<br> }<br> }<br><br> // open and initialize device<br> deviceOpen();<br> deviceInit();<br><br> // start capturing<br> captureStart();<br><br> // process frames<br> mainLoop();<br><br> // stop capturing<br> captureStop();<br><br> // close device<br> deviceUninit();<br> deviceClose();<br><br> exit(EXIT_SUCCESS);<br><br> return 0;<br>}<br></span></i><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(68,68,68)"><span style="font-family:arial,helvetica,sans-serif">It is just for testing, so there are various unused and irrelevant variables in this code.<br>
For Compiling I am running this command</span>:<br><br><b><i><span style="font-family:arial,helvetica,sans-serif">gcc encode.c -o encode -L/usr/local/lib -lavcodec -lavformat -lavutil -lavfilter -lavdevice -lm -lswscale -lswresample -lx264 -lpthread -lz -lfdk-aac -lvpx -lmp3lame -lopus -lvorbis -lvorbisenc -lvorbisfile -ldl -lva -llzma -ltheora -logg</span></i></b><br><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(68,68,68)">Even though my video is not getting encoded and I am not getting proper output in vlc or videos application under Linux.<br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(68,68,68)"><table cellpadding="5" cellspacing="5" border="0" width="100%"><tbody><tr><td valign="top"><br></td><td align="right" width="145"><br></td></tr></tbody></table>---------------------------------------------<br></div><b><span style="font-family:arial,helvetica,sans-serif"><font size="2">Thanks & Regards<br>Gaurav Pathak<br></font></span></b></div><b><span style="font-family:arial,helvetica,sans-serif"><font size="2">Contact No: 9028531335</font></span></b><br><br><br><img src="http://thinkbeforeprinting.org/struct/signature-1.gif"><br></div></div></div>
</div>