gst_plugins_base/gst/ffmpegcolorspace/gstffmpegcodecmap.c
branchRCL_3
changeset 30 7e817e7e631c
parent 29 567bb019e3e3
equal deleted inserted replaced
29:567bb019e3e3 30:7e817e7e631c
   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;