Merge commit '0fea8555ae25124c21f4c4f55a5fa76e9169aa03'
authorClément Bœsch <u@pkh.me>
Wed, 26 Apr 2017 15:17:50 +0000 (17:17 +0200)
committerClément Bœsch <u@pkh.me>
Wed, 26 Apr 2017 15:17:50 +0000 (17:17 +0200)
* commit '0fea8555ae25124c21f4c4f55a5fa76e9169aa03':
  v4l2: use codec descriptors for mapping a codec name to id

Merged-by: Clément Bœsch <u@pkh.me>
1  2 
libavdevice/v4l2.c

@@@ -841,62 -756,35 +841,62 @@@ static int v4l2_read_header(AVFormatCon
      if (s->fd < 0)
          return s->fd;
  
 -    if (s->list_format) {
 -        list_formats(s1, s->fd, s->list_format);
 -        return AVERROR_EXIT;
 +    if (s->channel != -1) {
 +        /* set video input */
 +        av_log(ctx, AV_LOG_DEBUG, "Selecting input_channel: %d\n", s->channel);
 +        if (v4l2_ioctl(s->fd, VIDIOC_S_INPUT, &s->channel) < 0) {
 +            res = AVERROR(errno);
 +            av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_S_INPUT): %s\n", av_err2str(res));
 +            goto fail;
 +        }
 +    } else {
 +        /* get current video input */
 +        if (v4l2_ioctl(s->fd, VIDIOC_G_INPUT, &s->channel) < 0) {
 +            res = AVERROR(errno);
 +            av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_G_INPUT): %s\n", av_err2str(res));
 +            goto fail;
 +        }
      }
  
 -    avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
 +    /* enum input */
 +    input.index = s->channel;
 +    if (v4l2_ioctl(s->fd, VIDIOC_ENUMINPUT, &input) < 0) {
 +        res = AVERROR(errno);
 +        av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_ENUMINPUT): %s\n", av_err2str(res));
 +        goto fail;
 +    }
 +    s->std_id = input.std;
 +    av_log(ctx, AV_LOG_DEBUG, "Current input_channel: %d, input_name: %s, input_std: %"PRIx64"\n",
 +           s->channel, input.name, (uint64_t)input.std);
  
 -    if (s->video_size &&
 -        (res = av_parse_video_size(&s->width, &s->height, s->video_size)) < 0) {
 -        av_log(s1, AV_LOG_ERROR, "Could not parse video size '%s'.\n",
 -               s->video_size);
 -        return res;
 +    if (s->list_format) {
 +        list_formats(ctx, s->list_format);
 +        res = AVERROR_EXIT;
 +        goto fail;
      }
  
 +    if (s->list_standard) {
 +        list_standards(ctx);
 +        res = AVERROR_EXIT;
 +        goto fail;
 +    }
 +
 +    avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
 +
      if (s->pixel_format) {
-         AVCodec *codec = avcodec_find_decoder_by_name(s->pixel_format);
+         const AVCodecDescriptor *desc = avcodec_descriptor_get_by_name(s->pixel_format);
  
-         if (codec)
-             ctx->video_codec_id = codec->id;
 -        if (desc) {
 -            s1->video_codec_id = desc->id;
 -            st->need_parsing   = AVSTREAM_PARSE_HEADERS;
 -        }
++        if (desc)
++            ctx->video_codec_id = desc->id;
  
          pix_fmt = av_get_pix_fmt(s->pixel_format);
  
-         if (pix_fmt == AV_PIX_FMT_NONE && !codec) {
+         if (pix_fmt == AV_PIX_FMT_NONE && !desc) {
 -            av_log(s1, AV_LOG_ERROR, "No such input format: %s.\n",
 +            av_log(ctx, AV_LOG_ERROR, "No such input format: %s.\n",
                     s->pixel_format);
  
 -            return AVERROR(EINVAL);
 +            res = AVERROR(EINVAL);
 +            goto fail;
          }
      }