Show
Ignore:
Timestamp:
01/25/09 02:44:54 (5 years ago)
Author:
douglask
Message:

set_size_cif() was incorrectly being used with codecs that are not restricted to CIF & QCIF capture resolutions.

Also, due to widescreen resolutions, set_size_cif() was getting confused in setting outh_ & outw_. It now discriminates based on input height rather than input width.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • vic/branches/mpeg4/video/grabber-v4l2.cpp

    r4346 r4364  
    269269                } 
    270270 
    271                 if (capability.capabilities & V4L2_CAP_VIDEO_CAPTURE == 0) { 
     271                if ((capability.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) { 
    272272                        debug_msg("%s, %s can't capture\n",capability.card,capability.bus_info); 
    273273                        v4l2_close(fd); 
     
    369369                fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420; 
    370370                if (-1 != v4l2_ioctl(fd_, VIDIOC_S_FMT, &fmt) ) { 
    371                         if (fmt.fmt.pix.height == test_height[i] && fmt.fmt.pix.width == test_width[i] && fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV420) { 
     371                        if (fmt.fmt.pix.height == test_height[i] && fmt.fmt.pix.width >= test_width[i] && fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV420) { 
    372372                                have_YUV420P = 1; 
    373373                                debug_msg("Device supports V4L2_PIX_FMT_YUV420 capture at %dx%d\n",test_width[i],test_height[i]); 
     
    381381                fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV422P; 
    382382                if (-1 != v4l2_ioctl(fd_, VIDIOC_S_FMT, &fmt) ) { 
    383                         if (fmt.fmt.pix.height == test_height[i] && fmt.fmt.pix.width == test_width[i] && fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV422P) { 
     383                        if (fmt.fmt.pix.height == test_height[i] && fmt.fmt.pix.width >= test_width[i] && fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV422P) { 
    384384                                have_YUV422P = 1; 
    385385                                debug_msg("Device supports V4L2_PIX_FMT_YUV422 capture at %dx%d\n",test_width[i],test_height[i]); 
     
    393393                fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; 
    394394                if (-1 != v4l2_ioctl(fd_, VIDIOC_S_FMT, &fmt) ) { 
    395                         if (fmt.fmt.pix.height == test_height[i] && fmt.fmt.pix.width == test_width[i]) { 
     395                        if (fmt.fmt.pix.height == test_height[i] && fmt.fmt.pix.width >= test_width[i]) { 
    396396                                have_YUV422 = 1; 
    397397                                debug_msg("Device supports V4L2_PIX_FMT_YUYV (YUV 4:2:2) capture at %dx%d\n",test_width[i],test_height[i]); 
     
    406406                fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; 
    407407                if (-1 != v4l2_ioctl(fd_, VIDIOC_S_FMT, &fmt) ) { 
    408                         if (fmt.fmt.pix.height == test_height[i] && fmt.fmt.pix.width == test_width[i] && fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG) { 
     408                        if (fmt.fmt.pix.height == test_height[i] && fmt.fmt.pix.width >= test_width[i] && fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG) { 
    409409                                have_MJPEG = 1; 
    410410                                debug_msg("Device supports V4L2_PIX_FMT_MJPEG capture at %dx%d\n",test_width[i],test_height[i]); 
     
    418418                fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG; 
    419419                if (-1 != v4l2_ioctl(fd_, VIDIOC_S_FMT, &fmt) ) { 
    420                         if (fmt.fmt.pix.height == test_height[i] && fmt.fmt.pix.width == test_width[i] && fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_JPEG) { 
     420                        if (fmt.fmt.pix.height == test_height[i] && fmt.fmt.pix.width >= test_width[i] && fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_JPEG) { 
    421421                                have_MJPEG = 1; 
    422422                                debug_msg("Device supports V4L2_PIX_FMT_JPEG capture at %dx%d\n",test_width[i],test_height[i]); 
     
    712712                tempbuf.type = vimage[0].vidbuf.type; 
    713713                while ((err = v4l2_ioctl(fd_, VIDIOC_DQBUF, &tempbuf)) < 0 && 
    714                        (errno == EINTR)); 
     714                       (errno == EINTR)) ; 
    715715 
    716716                if (err < 0) { 
     
    893893                switch (cformat_) { 
    894894                case CF_CIF: 
    895                         set_size_420(width_, height_); 
     895                        set_size_cif(width_, height_); 
    896896                        debug_msg(" cif\n"); 
    897897                        break; 
     
    945945                                                debug_msg("\nV4L2: Failed to set format\n"); 
    946946 
    947                                         if ( ( fmt.fmt.pix.width != (unsigned int)width_ ) || 
    948                                                                 ( fmt.fmt.pix.height !=  (unsigned int)height_ ) ) { 
     947                                        if ( fmt.fmt.pix.width > (unsigned int)width_ ) 
     948                                                inw_ = width_ = fmt.fmt.pix.width; 
     949 
     950 
     951                                        if ( ( fmt.fmt.pix.width == (unsigned int)width_ ) || 
     952                                                                ( fmt.fmt.pix.height == (unsigned int)height_ ) )  { 
     953                                                debug_msg("V4L2: setting format: width=%d height=%d\n", fmt.fmt.pix.width, fmt.fmt.pix.height); 
     954                                                format_ok = 1; 
     955                                                break; 
     956                                        } else { 
    949957 
    950958                                                debug_msg("V4L2: failed to set format! requested %dx%d, got %dx%d\n", width_, height_, fmt.fmt.pix.width, fmt.fmt.pix.height); 
     
    10281036                                                        } 
    10291037                                                        break; 
    1030  
    10311038                                                } 
    1032  
    1033                                         } else { 
    1034                                                 debug_msg("V4L2: setting format: width=%d height=%d\n", fmt.fmt.pix.width, fmt.fmt.pix.height); 
    1035                                                 format_ok = 1; 
    10361039                                        } 
    1037                                         break; 
    10381040                                } 
    1039  
    10401041                        } 
    10411042                }