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