core/vidl/vidl_ffmpeg_convert.cxx

Go to the documentation of this file.
00001 // This is core/vidl/vidl_ffmpeg_convert.cxx
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005 //:
00006 // \file
00007 // \author Matt Leotta
00008 // \date   19 Jan 2006
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 // PIX_FMT_NONE is undefined in old versions of FFMPEG
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 //: Convert the pixel format of a frame using FFMPEG
00032 //
00033 // The \p in_frame->data() is converted from \p in_frame->pixel_format()
00034 // to \p out_frame->pixel_format() and stored in \p out_frame->data()
00035 // If the output frame data is not the correct size new memory
00036 // will be allocated
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 //: Find the vidl pixel format that matches a FFMPEG one
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 //: Find the FFMPEG pixel format that matches a vidl one
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 }

Generated on Mon Mar 8 05:10:34 2010 for core/vidl by  doxygen 1.5.1