165 |
165 |
166 switch (pix_fmt) { |
166 switch (pix_fmt) { |
167 case PIX_FMT_YUV420P: |
167 case PIX_FMT_YUV420P: |
168 fmt = GST_MAKE_FOURCC ('I', '4', '2', '0'); |
168 fmt = GST_MAKE_FOURCC ('I', '4', '2', '0'); |
169 break; |
169 break; |
170 case PIX_FMT_NV12: |
|
171 fmt = GST_MAKE_FOURCC ('N', 'V', '1', '2'); |
|
172 break; |
|
173 case PIX_FMT_NV21: |
|
174 fmt = GST_MAKE_FOURCC ('N', 'V', '2', '1'); |
|
175 break; |
|
176 case PIX_FMT_YVU420P: |
170 case PIX_FMT_YVU420P: |
177 fmt = GST_MAKE_FOURCC ('Y', 'V', '1', '2'); |
171 fmt = GST_MAKE_FOURCC ('Y', 'V', '1', '2'); |
178 break; |
172 break; |
179 case PIX_FMT_YUV422: |
173 case PIX_FMT_YUV422: |
180 fmt = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'); |
174 fmt = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'); |
181 break; |
175 break; |
182 case PIX_FMT_UYVY422: |
176 case PIX_FMT_UYVY422: |
183 fmt = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); |
177 fmt = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); |
184 break; |
|
185 case PIX_FMT_YVYU422: |
|
186 fmt = GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'); |
|
187 break; |
178 break; |
188 case PIX_FMT_UYVY411: |
179 case PIX_FMT_UYVY411: |
189 fmt = GST_MAKE_FOURCC ('I', 'Y', 'U', '1'); |
180 fmt = GST_MAKE_FOURCC ('I', 'Y', 'U', '1'); |
190 break; |
181 break; |
191 case PIX_FMT_RGB24: |
182 case PIX_FMT_RGB24: |
354 break; |
345 break; |
355 case PIX_FMT_PAL8: |
346 case PIX_FMT_PAL8: |
356 bpp = depth = 8; |
347 bpp = depth = 8; |
357 endianness = G_BYTE_ORDER; |
348 endianness = G_BYTE_ORDER; |
358 break; |
349 break; |
359 case PIX_FMT_V308: |
|
360 fmt = GST_MAKE_FOURCC ('v', '3', '0', '8'); |
|
361 break; |
|
362 case PIX_FMT_AYUV4444: |
350 case PIX_FMT_AYUV4444: |
363 fmt = GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'); |
351 fmt = GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'); |
364 break; |
352 break; |
365 case PIX_FMT_GRAY8:{ |
353 case PIX_FMT_GRAY8: |
366 GstCaps *tmp; |
|
367 |
|
368 bpp = depth = 8; |
354 bpp = depth = 8; |
369 caps = gst_ff_vid_caps_new (context, "video/x-raw-gray", |
355 caps = gst_ff_vid_caps_new (context, "video/x-raw-gray", |
370 "bpp", G_TYPE_INT, bpp, "depth", G_TYPE_INT, depth, NULL); |
356 "bpp", G_TYPE_INT, bpp, "depth", G_TYPE_INT, depth, NULL); |
371 tmp = gst_ff_vid_caps_new (context, "video/x-raw-yuv", |
|
372 "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('Y', '8', '0', '0'), |
|
373 NULL); |
|
374 gst_caps_append (caps, tmp); |
|
375 } |
|
376 break; |
|
377 case PIX_FMT_GRAY16_L: |
|
378 bpp = depth = 16; |
|
379 caps = gst_ff_vid_caps_new (context, "video/x-raw-gray", |
|
380 "bpp", G_TYPE_INT, bpp, "depth", G_TYPE_INT, depth, |
|
381 "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, NULL); |
|
382 break; |
|
383 case PIX_FMT_GRAY16_B: |
|
384 bpp = depth = 16; |
|
385 caps = gst_ff_vid_caps_new (context, "video/x-raw-gray", |
|
386 "bpp", G_TYPE_INT, bpp, "depth", G_TYPE_INT, depth, |
|
387 "endianness", G_TYPE_INT, G_BIG_ENDIAN, NULL); |
|
388 break; |
357 break; |
389 default: |
358 default: |
390 /* give up ... */ |
359 /* give up ... */ |
391 break; |
360 break; |
392 } |
361 } |
413 } else { |
382 } else { |
414 caps = gst_ff_vid_caps_new (context, "video/x-raw-rgb", |
383 caps = gst_ff_vid_caps_new (context, "video/x-raw-rgb", |
415 "bpp", G_TYPE_INT, bpp, |
384 "bpp", G_TYPE_INT, bpp, |
416 "depth", G_TYPE_INT, depth, |
385 "depth", G_TYPE_INT, depth, |
417 "endianness", G_TYPE_INT, endianness, NULL); |
386 "endianness", G_TYPE_INT, endianness, NULL); |
418 if (context && context->pix_fmt == PIX_FMT_PAL8) { |
387 if (context) { |
419 gst_ffmpeg_set_palette (caps, context); |
388 gst_ffmpeg_set_palette (caps, context); |
420 } |
389 } |
421 } |
390 } |
422 } else if (fmt) { |
391 } else if (fmt) { |
423 caps = gst_ff_vid_caps_new (context, "video/x-raw-yuv", |
392 caps = gst_ff_vid_caps_new (context, "video/x-raw-yuv", |
424 "format", GST_TYPE_FOURCC, fmt, NULL); |
393 "format", GST_TYPE_FOURCC, fmt, NULL); |
425 } |
394 } |
426 } |
395 } |
427 |
396 |
428 if (caps != NULL) { |
397 if (caps != NULL) { |
429 GST_DEBUG ("caps for pix_fmt=%d: %" GST_PTR_FORMAT, pix_fmt, caps); |
398 char *str = gst_caps_to_string (caps); |
|
399 |
|
400 GST_DEBUG ("caps for pix_fmt=%d: %s", pix_fmt, str); |
|
401 g_free (str); |
430 } else { |
402 } else { |
431 GST_LOG ("No caps found for pix_fmt=%d", pix_fmt); |
403 GST_LOG ("No caps found for pix_fmt=%d", pix_fmt); |
432 } |
404 } |
433 |
405 |
434 return caps; |
406 return caps; |
467 "endianness", G_TYPE_INT, G_BYTE_ORDER, |
439 "endianness", G_TYPE_INT, G_BYTE_ORDER, |
468 "width", G_TYPE_INT, bpp, "depth", G_TYPE_INT, bpp, NULL); |
440 "width", G_TYPE_INT, bpp, "depth", G_TYPE_INT, bpp, NULL); |
469 } |
441 } |
470 |
442 |
471 if (caps != NULL) { |
443 if (caps != NULL) { |
472 GST_DEBUG ("caps for sample_fmt=%d: %" GST_PTR_FORMAT, sample_fmt, caps); |
444 char *str = gst_caps_to_string (caps); |
|
445 |
|
446 GST_DEBUG ("caps for sample_fmt=%d: %s", sample_fmt, str); |
|
447 g_free (str); |
473 } else { |
448 } else { |
474 GST_LOG ("No caps found for sample_fmt=%d", sample_fmt); |
449 GST_LOG ("No caps found for sample_fmt=%d", sample_fmt); |
475 } |
450 } |
476 |
451 |
477 return caps; |
452 return caps; |
614 context->pix_fmt = PIX_FMT_YUV422; |
589 context->pix_fmt = PIX_FMT_YUV422; |
615 break; |
590 break; |
616 case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): |
591 case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): |
617 context->pix_fmt = PIX_FMT_UYVY422; |
592 context->pix_fmt = PIX_FMT_UYVY422; |
618 break; |
593 break; |
619 case GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'): |
|
620 context->pix_fmt = PIX_FMT_YVYU422; |
|
621 break; |
|
622 case GST_MAKE_FOURCC ('I', 'Y', 'U', '1'): |
594 case GST_MAKE_FOURCC ('I', 'Y', 'U', '1'): |
623 context->pix_fmt = PIX_FMT_UYVY411; |
595 context->pix_fmt = PIX_FMT_UYVY411; |
624 break; |
596 break; |
625 case GST_MAKE_FOURCC ('I', '4', '2', '0'): |
597 case GST_MAKE_FOURCC ('I', '4', '2', '0'): |
626 context->pix_fmt = PIX_FMT_YUV420P; |
598 context->pix_fmt = PIX_FMT_YUV420P; |
627 break; |
599 break; |
628 case GST_MAKE_FOURCC ('N', 'V', '1', '2'): |
|
629 context->pix_fmt = PIX_FMT_NV12; |
|
630 break; |
|
631 case GST_MAKE_FOURCC ('N', 'V', '2', '1'): |
|
632 context->pix_fmt = PIX_FMT_NV21; |
|
633 break; |
|
634 case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): |
600 case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): |
635 context->pix_fmt = PIX_FMT_YVU420P; |
601 context->pix_fmt = PIX_FMT_YVU420P; |
636 break; |
602 break; |
637 case GST_MAKE_FOURCC ('Y', '4', '1', 'B'): |
603 case GST_MAKE_FOURCC ('Y', '4', '1', 'B'): |
638 context->pix_fmt = PIX_FMT_YUV411P; |
604 context->pix_fmt = PIX_FMT_YUV411P; |
644 context->pix_fmt = PIX_FMT_YUV410P; |
610 context->pix_fmt = PIX_FMT_YUV410P; |
645 break; |
611 break; |
646 case GST_MAKE_FOURCC ('Y', 'V', 'U', '9'): |
612 case GST_MAKE_FOURCC ('Y', 'V', 'U', '9'): |
647 context->pix_fmt = PIX_FMT_YVU410P; |
613 context->pix_fmt = PIX_FMT_YVU410P; |
648 break; |
614 break; |
649 case GST_MAKE_FOURCC ('v', '3', '0', '8'): |
|
650 context->pix_fmt = PIX_FMT_V308; |
|
651 break; |
|
652 case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): |
615 case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): |
653 context->pix_fmt = PIX_FMT_AYUV4444; |
616 context->pix_fmt = PIX_FMT_AYUV4444; |
654 break; |
617 break; |
655 case GST_MAKE_FOURCC ('Y', '4', '4', '4'): |
618 case GST_MAKE_FOURCC ('Y', '4', '4', '4'): |
656 context->pix_fmt = PIX_FMT_YUV444P; |
619 context->pix_fmt = PIX_FMT_YUV444P; |
657 break; |
|
658 case GST_MAKE_FOURCC ('Y', '8', '0', '0'): |
|
659 context->pix_fmt = PIX_FMT_GRAY8; |
|
660 break; |
620 break; |
661 } |
621 } |
662 } |
622 } |
663 } else if (gst_structure_has_name (structure, "video/x-raw-rgb")) { |
623 } else if (gst_structure_has_name (structure, "video/x-raw-rgb")) { |
664 gint bpp = 0, rmask = 0, endianness = 0, amask = 0, depth = 0; |
624 gint bpp = 0, rmask = 0, endianness = 0, amask = 0, depth = 0; |
745 |
705 |
746 if (gst_structure_get_int (structure, "bpp", &bpp)) { |
706 if (gst_structure_get_int (structure, "bpp", &bpp)) { |
747 switch (bpp) { |
707 switch (bpp) { |
748 case 8: |
708 case 8: |
749 context->pix_fmt = PIX_FMT_GRAY8; |
709 context->pix_fmt = PIX_FMT_GRAY8; |
750 break; |
|
751 case 16:{ |
|
752 gint endianness = 0; |
|
753 |
|
754 if (gst_structure_get_int (structure, "endianness", &endianness)) { |
|
755 if (endianness == G_LITTLE_ENDIAN) |
|
756 context->pix_fmt = PIX_FMT_GRAY16_L; |
|
757 else if (endianness == G_BIG_ENDIAN) |
|
758 context->pix_fmt = PIX_FMT_GRAY16_B; |
|
759 } |
|
760 } |
|
761 break; |
710 break; |
762 } |
711 } |
763 } |
712 } |
764 } |
713 } |
765 } |
714 } |
860 picture->data[1] = picture->data[2] + size2; |
809 picture->data[1] = picture->data[2] + size2; |
861 picture->linesize[0] = stride; |
810 picture->linesize[0] = stride; |
862 picture->linesize[1] = stride2; |
811 picture->linesize[1] = stride2; |
863 picture->linesize[2] = stride2; |
812 picture->linesize[2] = stride2; |
864 return size + 2 * size2; |
813 return size + 2 * size2; |
865 case PIX_FMT_NV12: |
|
866 case PIX_FMT_NV21: |
|
867 stride = GST_ROUND_UP_4 (width); |
|
868 h2 = ROUND_UP_X (height, pinfo->y_chroma_shift); |
|
869 size = stride * h2; |
|
870 w2 = 2 * DIV_ROUND_UP_X (width, pinfo->x_chroma_shift); |
|
871 stride2 = GST_ROUND_UP_4 (w2); |
|
872 h2 = DIV_ROUND_UP_X (height, pinfo->y_chroma_shift); |
|
873 size2 = stride2 * h2; |
|
874 picture->data[0] = ptr; |
|
875 picture->data[1] = picture->data[0] + size; |
|
876 picture->data[2] = NULL; |
|
877 picture->linesize[0] = stride; |
|
878 picture->linesize[1] = stride2; |
|
879 picture->linesize[2] = 0; |
|
880 return size + size2; |
|
881 case PIX_FMT_RGB24: |
814 case PIX_FMT_RGB24: |
882 case PIX_FMT_BGR24: |
815 case PIX_FMT_BGR24: |
883 stride = GST_ROUND_UP_4 (width * 3); |
816 stride = GST_ROUND_UP_4 (width * 3); |
884 size = stride * height; |
817 size = stride * height; |
885 picture->data[0] = ptr; |
818 picture->data[0] = ptr; |
905 return size; |
838 return size; |
906 case PIX_FMT_RGB555: |
839 case PIX_FMT_RGB555: |
907 case PIX_FMT_RGB565: |
840 case PIX_FMT_RGB565: |
908 case PIX_FMT_YUV422: |
841 case PIX_FMT_YUV422: |
909 case PIX_FMT_UYVY422: |
842 case PIX_FMT_UYVY422: |
910 case PIX_FMT_YVYU422: |
|
911 stride = GST_ROUND_UP_4 (width * 2); |
843 stride = GST_ROUND_UP_4 (width * 2); |
912 size = stride * height; |
|
913 picture->data[0] = ptr; |
|
914 picture->data[1] = NULL; |
|
915 picture->data[2] = NULL; |
|
916 picture->linesize[0] = stride; |
|
917 return size; |
|
918 case PIX_FMT_V308: |
|
919 stride = GST_ROUND_UP_4 (width * 3); |
|
920 size = stride * height; |
844 size = stride * height; |
921 picture->data[0] = ptr; |
845 picture->data[0] = ptr; |
922 picture->data[1] = NULL; |
846 picture->data[1] = NULL; |
923 picture->data[2] = NULL; |
847 picture->data[2] = NULL; |
924 picture->linesize[0] = stride; |
848 picture->linesize[0] = stride; |
932 picture->data[2] = NULL; |
856 picture->data[2] = NULL; |
933 picture->linesize[0] = width + width / 2; |
857 picture->linesize[0] = width + width / 2; |
934 return size + size / 2; |
858 return size + size / 2; |
935 case PIX_FMT_GRAY8: |
859 case PIX_FMT_GRAY8: |
936 stride = GST_ROUND_UP_4 (width); |
860 stride = GST_ROUND_UP_4 (width); |
937 size = stride * height; |
|
938 picture->data[0] = ptr; |
|
939 picture->data[1] = NULL; |
|
940 picture->data[2] = NULL; |
|
941 picture->linesize[0] = stride; |
|
942 return size; |
|
943 case PIX_FMT_GRAY16_L: |
|
944 case PIX_FMT_GRAY16_B: |
|
945 stride = GST_ROUND_UP_4 (width * 2); |
|
946 size = stride * height; |
861 size = stride * height; |
947 picture->data[0] = ptr; |
862 picture->data[0] = ptr; |
948 picture->data[1] = NULL; |
863 picture->data[1] = NULL; |
949 picture->data[2] = NULL; |
864 picture->data[2] = NULL; |
950 picture->linesize[0] = stride; |
865 picture->linesize[0] = stride; |