Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] solo6x10: Fix pixelformat accepted/reported by the encoder

The 6010 produces MPEG-4 part 2, while 6110 produces H.264.

Signed-off-by: Ismael Luceno <ismael.luceno@corp.bluecherry.net>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Ismael Luceno and committed by
Mauro Carvalho Chehab
16af690f 8c93c400

+32 -11
+32 -11
drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c
··· 519 519 vb->v4l2_buf.flags |= V4L2_BUF_FLAG_MOTION_DETECTED; 520 520 } 521 521 522 - if (solo_enc->fmt == V4L2_PIX_FMT_MPEG4) 522 + switch (solo_enc->fmt) { 523 + case V4L2_PIX_FMT_MPEG4: 524 + case V4L2_PIX_FMT_H264: 523 525 ret = solo_fill_mpeg(solo_enc, vb, vh); 524 - else 526 + break; 527 + default: /* V4L2_PIX_FMT_MJPEG */ 525 528 ret = solo_fill_jpeg(solo_enc, vb, vh); 529 + break; 530 + } 526 531 527 532 if (!ret) { 528 533 vb->v4l2_buf.sequence = solo_enc->sequence++; ··· 785 780 static int solo_enc_enum_fmt_cap(struct file *file, void *priv, 786 781 struct v4l2_fmtdesc *f) 787 782 { 783 + struct solo_enc_dev *solo_enc = video_drvdata(file); 784 + int dev_type = solo_enc->solo_dev->type; 785 + 788 786 switch (f->index) { 789 787 case 0: 790 - f->pixelformat = V4L2_PIX_FMT_MPEG4; 791 - strcpy(f->description, "MPEG-4 AVC"); 788 + switch (dev_type) { 789 + case SOLO_DEV_6010: 790 + f->pixelformat = V4L2_PIX_FMT_MPEG4; 791 + strcpy(f->description, "MPEG-4 part 2"); 792 + break; 793 + case SOLO_DEV_6110: 794 + f->pixelformat = V4L2_PIX_FMT_H264; 795 + strcpy(f->description, "H.264"); 796 + break; 797 + } 792 798 break; 793 799 case 1: 794 800 f->pixelformat = V4L2_PIX_FMT_MJPEG; ··· 814 798 return 0; 815 799 } 816 800 801 + static inline int solo_valid_pixfmt(u32 pixfmt, int dev_type) 802 + { 803 + return (pixfmt == V4L2_PIX_FMT_H264 && dev_type == SOLO_DEV_6110) 804 + || (pixfmt == V4L2_PIX_FMT_MPEG4 && dev_type == SOLO_DEV_6010) 805 + || pixfmt == V4L2_PIX_FMT_MJPEG ? 0 : -EINVAL; 806 + } 807 + 817 808 static int solo_enc_try_fmt_cap(struct file *file, void *priv, 818 809 struct v4l2_format *f) 819 810 { ··· 828 805 struct solo_dev *solo_dev = solo_enc->solo_dev; 829 806 struct v4l2_pix_format *pix = &f->fmt.pix; 830 807 831 - if (pix->pixelformat != V4L2_PIX_FMT_MPEG4 && 832 - pix->pixelformat != V4L2_PIX_FMT_MJPEG) 808 + if (solo_valid_pixfmt(pix->pixelformat, solo_dev->type)) 833 809 return -EINVAL; 834 810 835 811 if (pix->width < solo_dev->video_hsize || ··· 941 919 struct solo_enc_dev *solo_enc = video_drvdata(file); 942 920 struct solo_dev *solo_dev = solo_enc->solo_dev; 943 921 944 - if (fsize->pixel_format != V4L2_PIX_FMT_MPEG4 && 945 - fsize->pixel_format != V4L2_PIX_FMT_MJPEG) 922 + if (solo_valid_pixfmt(fsize->pixel_format, solo_dev->type)) 946 923 return -EINVAL; 947 924 948 925 switch (fsize->index) { ··· 968 947 struct solo_enc_dev *solo_enc = video_drvdata(file); 969 948 struct solo_dev *solo_dev = solo_enc->solo_dev; 970 949 971 - if (fintv->pixel_format != V4L2_PIX_FMT_MPEG4 && 972 - fintv->pixel_format != V4L2_PIX_FMT_MJPEG) 950 + if (solo_valid_pixfmt(fintv->pixel_format, solo_dev->type)) 973 951 return -EINVAL; 974 952 if (fintv->index) 975 953 return -EINVAL; ··· 1245 1225 mutex_init(&solo_enc->lock); 1246 1226 spin_lock_init(&solo_enc->av_lock); 1247 1227 INIT_LIST_HEAD(&solo_enc->vidq_active); 1248 - solo_enc->fmt = V4L2_PIX_FMT_MPEG4; 1228 + solo_enc->fmt = (solo_dev->type == SOLO_DEV_6010) ? 1229 + V4L2_PIX_FMT_MPEG4 : V4L2_PIX_FMT_H264; 1249 1230 solo_enc->type = SOLO_ENC_TYPE_STD; 1250 1231 1251 1232 solo_enc->qp = SOLO_DEFAULT_QP;