Hello, i resize mpeg4 files to 640x480 and 320x240 with this code, but
the size (Kb) of this files is the same (both files has a length 60
seconds). what is wrong in this code.?
thanks

CResize::CResize( enum PixelFormat format_src, int width_src, int
height_src, enum PixelFormat format_dst, int width_dst, int height_dst
)
{
        m_format_src = format_src;
        m_width_src = width_src;
        m_height_src = height_src;
        
        m_format_dst = format_dst;
        m_width_dst = width_dst;
        m_height_dst = height_dst;

        m_sws_context = NULL;
        
        m_avframe_src = NULL;
        m_avframe_dst = NULL;

        //alloc m_avframe_src, needed to recieve libavcodec source avframe
        m_avframe_src = allocAVFrame( format_src, width_src, height_src );
        
        //alloc m_avframe_dst, needed to 'sws_scale' function
        m_avframe_dst = allocAVFrame( format_dst, width_dst, height_dst );
}

CResize::~CResize()
{
        if( m_avframe_src != NULL ){
                av_free( m_avframe_src );
                m_avframe_src = NULL;   
        }
        
        if( m_avframe_dst != NULL ){
                av_free( m_avframe_dst );
                m_avframe_dst = NULL;
        }               
        
        if( m_sws_context != NULL ){
                sws_freeContext( m_sws_context );
                m_sws_context = NULL;
        }
}

AVFrame* CResize::resize( AVFrame* av_frame )
{       
        //copy orignal libavcodec avframe to allocated m_avframe_src
        av_picture_copy(        (AVPicture*)m_avframe_src,      //dest. frame
                                                                                
(AVPicture*)av_frame,                   //src. frame
                                                                                
m_format_src,                                                   //src. format
                                                                                
m_width_src,                                                            //src. 
width (input codec)
                                                                                
m_height_src );                                                 //src. height 
(input codec)

        //check avframe
        if( m_avframe_src == NULL || m_avframe_src->data == NULL){
                return NULL;
        }

        //free the convert context
        if( m_sws_context != NULL ) sws_freeContext(m_sws_context);
        
        
        //create convert context
        m_sws_context = sws_getContext( m_width_src, //src. width (input
codec, AVCodecContext->width)
                                                                                
                                                        m_height_src,//src. 
height (input codec,
AVCodecContext->height)
                                                                                
                                                        m_format_src,//could 
be, PIX_FMT_YUV420P
                                                                                
                                                        m_width_dst, //dest. 
width
                                                                                
                                                        m_height_dst,//dest. 
height
                                                                                
                                                        m_format_dst,//could 
be, PIX_FMT_YUV420P or PIX_FMT_YUVJ420P
                                                                                
                                                        SWS_BICUBIC,
                                                                                
                                                        NULL,
                                                                                
                                                        NULL,
                                                                                
                                                        NULL );                 
                                                                                
                                                        
        if( m_sws_context == NULL ){
                perror("m_sws_context");
                return NULL;
        }
                                                                                
                                                                                
                
         //resize frame
         sws_scale( m_sws_context,
                                                        m_avframe_src->data,
                                                        m_avframe_src->linesize,
                                                        0,
                                                        m_height_src,
                                                        m_avframe_dst->data,
                                                        m_avframe_dst->linesize 
);
                                                
        return m_avframe_dst;
}

AVFrame* CResize::allocAVFrame( enum PixelFormat pix_fmt, int width,
int height )
{
        AVFrame *av_frame;
        uint8_t *avframe_buf;
        int size;

        av_frame = avcodec_alloc_frame();
        if( !av_frame )
                return NULL;
        
        size = avpicture_get_size( pix_fmt, width, height );
        //determine required buffer size and allocate buffer
        avframe_buf = (uint8_t *)av_malloc(size);
        if (!avframe_buf) {
                 av_free(av_frame);
                 return NULL;
        }
        //assign appropriate parts of buffer to image planes in av_frame
        avpicture_fill( (AVPicture *)av_frame, avframe_buf, pix_fmt, width, 
height );
        
        return av_frame;
}
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to