00001
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005
00006
00007
00008
00009
00010
00011
00012 #include "vidl2_ffmpeg_convert.h"
00013 #include "vidl2_frame.h"
00014 #include <vcl_cstring.h>
00015
00016
00017 #if LIBAVFORMAT_BUILD <= 4623
00018
00019 #define PIX_FMT_NONE PixelFormat(-1)
00020 #endif
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 bool vidl2_ffmpeg_convert(const vidl2_frame_sptr& in_frame,
00032 vidl2_frame_sptr& out_frame)
00033 {
00034 if (!in_frame || !out_frame)
00035 return false;
00036
00037 PixelFormat in_fmt =
00038 vidl2_pixel_format_to_ffmpeg(in_frame->pixel_format());
00039
00040 PixelFormat out_fmt =
00041 vidl2_pixel_format_to_ffmpeg(out_frame->pixel_format());
00042
00043 if (in_fmt == PIX_FMT_NONE || out_fmt == PIX_FMT_NONE)
00044 return false;
00045
00046 unsigned ni = in_frame->ni();
00047 unsigned nj = in_frame->nj();
00048 unsigned out_size = (unsigned) avpicture_get_size( out_fmt, ni, nj );
00049
00050 if (out_frame->size() != out_size ||
00051 out_frame->ni() != ni ||
00052 out_frame->nj() != nj ||
00053 !out_frame->data() )
00054 out_frame = new vidl2_memory_chunk_frame(ni, nj, out_frame->pixel_format(),
00055 new vil_memory_chunk(out_size, VIL_PIXEL_FORMAT_BYTE));
00056
00057 AVPicture in_pic;
00058 vcl_memset( &in_pic, 0, sizeof(in_pic) );
00059 avpicture_fill(&in_pic, (uint8_t*) in_frame->data(), in_fmt, ni, nj);
00060
00061 AVPicture out_pic;
00062 vcl_memset( &out_pic, 0, sizeof(out_pic) );
00063 avpicture_fill(&out_pic, (uint8_t*) out_frame->data(), out_fmt, ni, nj);
00064
00065
00066 if ( img_convert( &out_pic, out_fmt, &in_pic, in_fmt, ni, nj ) < 0 )
00067 return false;
00068
00069 return true;
00070 }
00071
00072
00073
00074 vidl2_pixel_format
00075 vidl2_pixel_format_from_ffmpeg(PixelFormat ffmpeg_pix_fmt)
00076 {
00077 switch (ffmpeg_pix_fmt)
00078 {
00079 case PIX_FMT_YUV420P: return VIDL2_PIXEL_FORMAT_YUV_420P;
00080 case PIX_FMT_YUV422: return VIDL2_PIXEL_FORMAT_YUYV_422;
00081 case PIX_FMT_RGB24: return VIDL2_PIXEL_FORMAT_RGB_24;
00082 case PIX_FMT_BGR24: return VIDL2_PIXEL_FORMAT_BGR_24;
00083 case PIX_FMT_YUV422P: return VIDL2_PIXEL_FORMAT_YUV_422P;
00084 case PIX_FMT_YUV444P: return VIDL2_PIXEL_FORMAT_YUV_444P;
00085 case PIX_FMT_RGBA32: return VIDL2_PIXEL_FORMAT_RGBA_32;
00086 case PIX_FMT_YUV410P: return VIDL2_PIXEL_FORMAT_YUV_410P;
00087 case PIX_FMT_YUV411P: return VIDL2_PIXEL_FORMAT_YUV_411P;
00088 case PIX_FMT_RGB565: return VIDL2_PIXEL_FORMAT_RGB_565;
00089 case PIX_FMT_RGB555: return VIDL2_PIXEL_FORMAT_RGB_555;
00090 case PIX_FMT_GRAY8: return VIDL2_PIXEL_FORMAT_MONO_8;
00091 case PIX_FMT_MONOWHITE: return VIDL2_PIXEL_FORMAT_MONO_1;
00092 case PIX_FMT_MONOBLACK: return VIDL2_PIXEL_FORMAT_MONO_1;
00093
00094 #ifdef PIX_FMT_UYVY422
00095 case PIX_FMT_UYVY422: return VIDL2_PIXEL_FORMAT_UYVY_422;
00096 #endif
00097 #ifdef PIX_FMT_UYVY411
00098 case PIX_FMT_UYVY411: return VIDL2_PIXEL_FORMAT_UYVY_411;
00099 #endif
00100 default: break;
00101 }
00102 return VIDL2_PIXEL_FORMAT_UNKNOWN;
00103 }
00104
00105
00106
00107 PixelFormat
00108 vidl2_pixel_format_to_ffmpeg(vidl2_pixel_format vidl2_pix_fmt)
00109 {
00110 switch (vidl2_pix_fmt)
00111 {
00112 case VIDL2_PIXEL_FORMAT_RGB_24: return PIX_FMT_RGB24;
00113 case VIDL2_PIXEL_FORMAT_BGR_24: return PIX_FMT_BGR24;
00114 case VIDL2_PIXEL_FORMAT_RGBA_32: return PIX_FMT_RGBA32;
00115 case VIDL2_PIXEL_FORMAT_RGB_565: return PIX_FMT_RGB565;
00116 case VIDL2_PIXEL_FORMAT_RGB_555: return PIX_FMT_RGB555;
00117 case VIDL2_PIXEL_FORMAT_YUV_444P: return PIX_FMT_YUV444P;
00118 case VIDL2_PIXEL_FORMAT_YUYV_422: return PIX_FMT_YUV422;
00119 case VIDL2_PIXEL_FORMAT_YUV_422P: return PIX_FMT_YUV422P;
00120 case VIDL2_PIXEL_FORMAT_YUV_420P: return PIX_FMT_YUV420P;
00121 case VIDL2_PIXEL_FORMAT_YUV_411P: return PIX_FMT_YUV411P;
00122 case VIDL2_PIXEL_FORMAT_YUV_410P: return PIX_FMT_YUV410P;
00123
00124 #ifdef PIX_FMT_UYVY422
00125 case VIDL2_PIXEL_FORMAT_UYVY_422: return PIX_FMT_UYVY422;
00126 #endif
00127 #ifdef PIX_FMT_UYVY411
00128 case VIDL2_PIXEL_FORMAT_UYVY_411: return PIX_FMT_UYVY411;
00129 #endif
00130 case VIDL2_PIXEL_FORMAT_MONO_1: return PIX_FMT_MONOBLACK;
00131 case VIDL2_PIXEL_FORMAT_MONO_8: return PIX_FMT_GRAY8;
00132 default: break;
00133 }
00134 return PIX_FMT_NONE;
00135 }