00001
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005
00006
00007
00008
00009
00010
00011
00012 #include "vidl_ffmpeg_convert.h"
00013 #include "vidl_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 #if LIBAVCODEC_BUILD >= ((52<<16)+(10<<8)+0) // after ver 52.10.0
00023 extern "C" {
00024 #include <libswscale/swscale.h>
00025 }
00026 #endif
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 bool vidl_ffmpeg_convert(const vidl_frame_sptr& in_frame,
00038 vidl_frame_sptr& out_frame)
00039 {
00040 if (!in_frame || !out_frame)
00041 return false;
00042
00043 PixelFormat in_fmt =
00044 vidl_pixel_format_to_ffmpeg(in_frame->pixel_format());
00045
00046 PixelFormat out_fmt =
00047 vidl_pixel_format_to_ffmpeg(out_frame->pixel_format());
00048
00049 if (in_fmt == PIX_FMT_NONE || out_fmt == PIX_FMT_NONE)
00050 return false;
00051
00052 unsigned ni = in_frame->ni();
00053 unsigned nj = in_frame->nj();
00054 unsigned out_size = (unsigned) avpicture_get_size( out_fmt, ni, nj );
00055
00056 if (out_frame->size() != out_size ||
00057 out_frame->ni() != ni ||
00058 out_frame->nj() != nj ||
00059 !out_frame->data() )
00060 out_frame = new vidl_memory_chunk_frame(ni, nj, out_frame->pixel_format(),
00061 new vil_memory_chunk(out_size, VIL_PIXEL_FORMAT_BYTE));
00062
00063 AVPicture in_pic;
00064 vcl_memset( &in_pic, 0, sizeof(in_pic) );
00065 avpicture_fill(&in_pic, (uint8_t*) in_frame->data(), in_fmt, ni, nj);
00066
00067 AVPicture out_pic;
00068 vcl_memset( &out_pic, 0, sizeof(out_pic) );
00069 avpicture_fill(&out_pic, (uint8_t*) out_frame->data(), out_fmt, ni, nj);
00070
00071 #if LIBAVCODEC_BUILD < ((52<<16)+(10<<8)+0) // before ver 52.10.0
00072 if ( img_convert( &out_pic, out_fmt, &in_pic, in_fmt, ni, nj ) < 0 )
00073 return false;
00074 #else
00075 SwsContext* ctx = sws_getContext( ni, nj, in_fmt,
00076 ni, nj, out_fmt,
00077 SWS_BILINEAR,
00078 NULL, NULL, NULL );
00079 sws_scale( ctx,
00080 in_pic.data, in_pic.linesize,
00081 0, nj,
00082 out_pic.data, out_pic.linesize );
00083 sws_freeContext( ctx );
00084 #endif
00085
00086 return true;
00087 }
00088
00089
00090
00091 vidl_pixel_format
00092 vidl_pixel_format_from_ffmpeg(PixelFormat ffmpeg_pix_fmt)
00093 {
00094 switch (ffmpeg_pix_fmt)
00095 {
00096 case PIX_FMT_YUV420P: return VIDL_PIXEL_FORMAT_YUV_420P;
00097 case PIX_FMT_YUYV422: return VIDL_PIXEL_FORMAT_YUYV_422;
00098 case PIX_FMT_RGB24: return VIDL_PIXEL_FORMAT_RGB_24;
00099 case PIX_FMT_BGR24: return VIDL_PIXEL_FORMAT_BGR_24;
00100 case PIX_FMT_YUV422P: return VIDL_PIXEL_FORMAT_YUV_422P;
00101 case PIX_FMT_YUV444P: return VIDL_PIXEL_FORMAT_YUV_444P;
00102 #ifdef PIX_FMT_RGBA
00103 case PIX_FMT_RGBA: return VIDL_PIXEL_FORMAT_RGBA_32;
00104 #endif
00105 case PIX_FMT_YUV410P: return VIDL_PIXEL_FORMAT_YUV_410P;
00106 case PIX_FMT_YUV411P: return VIDL_PIXEL_FORMAT_YUV_411P;
00107 case PIX_FMT_RGB565: return VIDL_PIXEL_FORMAT_RGB_565;
00108 case PIX_FMT_RGB555: return VIDL_PIXEL_FORMAT_RGB_555;
00109 case PIX_FMT_GRAY8: return VIDL_PIXEL_FORMAT_MONO_8;
00110 case PIX_FMT_MONOWHITE: return VIDL_PIXEL_FORMAT_MONO_1;
00111 case PIX_FMT_MONOBLACK: return VIDL_PIXEL_FORMAT_MONO_1;
00112 case PIX_FMT_UYVY422: return VIDL_PIXEL_FORMAT_UYVY_422;
00113 case PIX_FMT_UYYVYY411: return VIDL_PIXEL_FORMAT_UYVY_411;
00114 default: break;
00115 }
00116 return VIDL_PIXEL_FORMAT_UNKNOWN;
00117 }
00118
00119
00120
00121 PixelFormat
00122 vidl_pixel_format_to_ffmpeg(vidl_pixel_format vidl_pix_fmt)
00123 {
00124 switch (vidl_pix_fmt)
00125 {
00126 case VIDL_PIXEL_FORMAT_RGB_24: return PIX_FMT_RGB24;
00127 case VIDL_PIXEL_FORMAT_BGR_24: return PIX_FMT_BGR24;
00128 #ifdef PIX_FMT_RGBA
00129 case VIDL_PIXEL_FORMAT_RGBA_32: return PIX_FMT_RGBA;
00130 #endif
00131 case VIDL_PIXEL_FORMAT_RGB_565: return PIX_FMT_RGB565;
00132 case VIDL_PIXEL_FORMAT_RGB_555: return PIX_FMT_RGB555;
00133 case VIDL_PIXEL_FORMAT_YUV_444P: return PIX_FMT_YUV444P;
00134 case VIDL_PIXEL_FORMAT_YUYV_422: return PIX_FMT_YUYV422;
00135 case VIDL_PIXEL_FORMAT_YUV_422P: return PIX_FMT_YUV422P;
00136 case VIDL_PIXEL_FORMAT_YUV_420P: return PIX_FMT_YUV420P;
00137 case VIDL_PIXEL_FORMAT_YUV_411P: return PIX_FMT_YUV411P;
00138 case VIDL_PIXEL_FORMAT_YUV_410P: return PIX_FMT_YUV410P;
00139 case VIDL_PIXEL_FORMAT_UYVY_422: return PIX_FMT_UYVY422;
00140 case VIDL_PIXEL_FORMAT_UYVY_411: return PIX_FMT_UYYVYY411;
00141 case VIDL_PIXEL_FORMAT_MONO_1: return PIX_FMT_MONOBLACK;
00142 case VIDL_PIXEL_FORMAT_MONO_8: return PIX_FMT_GRAY8;
00143 default: break;
00144 }
00145 return PIX_FMT_NONE;
00146 }