Libavcodec can do it. This is the code from Anand, and his code only use ffmpeg libs.

First I also think about libjpeg and found a jpeg library including Anroid.mk to port to Android NDK (I'm working in android platform), but I search in ffmpeg source code and see that it has the CODEC_ID_JPEG, so I think it does not need to use libjpeg.

int WriteJPEG (AVCodecContext *pCodecCtx, AVFrame *pFrame, int FrameNo){
        AVCodecContext         *pOCodecCtx;
        AVCodec                *pOCodec;
        uint8_t                *Buffer;
        int                     BufSiz;
        int                     BufSizActual;
int ImgFmt = PIX_FMT_YUVJ420P; //for the newer ffmpeg version, this int to pixelformat
        FILE                   *JPEGFile;
        char                    JPEGFName[256];

BufSiz = avpicture_get_size ( ImgFmt,pCodecCtx->width,pCodecCtx->height );

        Buffer = (uint8_t *)malloc ( BufSiz );
        if ( Buffer == NULL )
                return ( 0 );
        memset ( Buffer, 0, BufSiz );

        pOCodecCtx = avcodec_alloc_context ( );
        if ( !pOCodecCtx ) {
                 free ( Buffer );
                 return ( 0 );
                 }

        pOCodecCtx->bit_rate      = pCodecCtx->bit_rate;
        pOCodecCtx->width         = pCodecCtx->width;
        pOCodecCtx->height        = pCodecCtx->height;
        pOCodecCtx->pix_fmt       = ImgFmt;
        pOCodecCtx->codec_id      = CODEC_ID_MJPEG;
        pOCodecCtx->codec_type    = CODEC_TYPE_VIDEO;
        pOCodecCtx->time_base.num = pCodecCtx->time_base.num;
        pOCodecCtx->time_base.den = pCodecCtx->time_base.den;

        pOCodec = avcodec_find_encoder ( pOCodecCtx->codec_id );
        if ( !pOCodec ) {
                 free ( Buffer );
                return ( 0 );
                 }
        if ( avcodec_open ( pOCodecCtx, pOCodec ) < 0 ) {
                 free ( Buffer );
                 return ( 0 );
                }

pOCodecCtx->mb_lmin = pOCodecCtx->lmin = pOCodecCtx->qmin * FF_QP2LAMBDA; pOCodecCtx->mb_lmax = pOCodecCtx->lmax = pOCodecCtx->qmax * FF_QP2LAMBDA;
        pOCodecCtx->flags          = CODEC_FLAG_QSCALE;
        pOCodecCtx->global_quality = pOCodecCtx->qmin * FF_QP2LAMBDA;

        pFrame->pts     = 1;
        pFrame->quality = pOCodecCtx->global_quality;
BufSizActual = avcodec_encode_video( pOCodecCtx,Buffer,BufSiz,pFrame );

        sprintf ( JPEGFName, "%06d.jpg", FrameNo );
        JPEGFile = fopen ( JPEGFName, "wb" );
        fwrite ( Buffer, 1, BufSizActual, JPEGFile );
        fclose ( JPEGFile );

        avcodec_close ( pOCodecCtx );
        free ( Buffer );
        return ( BufSizActual );
 }

I searched on google and saw that many people ask the same question but not found the answer yet. So this will help for developer in the first use ffmpeg libs

Hoang Ong

On 8/6/2010 12:20 AM, Michael Chisholm wrote:
Here we go again... :)  Can't you use libavcodec's builtin mjpeg encoder?

On 8/5/2010 11:38 AM, Glen Ruedinger wrote:
You need libjpeg.

On Thu, Aug 5, 2010 at 10:58 AM, Hoang Ong<[email protected]> wrote:

  Hi everybody,

I can get the AVFrame and output it to a raw image file (.ppm) I try to use sws_scale to convert that image to variety of image type to save it as a jpg
file but it not work. I think it not a way to do.

I dont have much knowledge about image processing. So anybody know how to use ffmpeg's libs to convert AVFrame to jpg please help me. The code I used
to save frame as a ppm file like this:

void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame)
{
    FILE *pFile;
    char szFilename[32];
    int  y;

    // Open file
    sprintf(szFilename, "frame.ppm", iFrame);
    pFile=fopen(szFilename, "wb");
    if(pFile==NULL)
        return;

    // Write header
    fprintf(pFile, "P6\n%d %d\n255\n", width, height);

    // Write pixel data
    for(y=0; y<height; y++)
fwrite(pFrame->data[0]+y*pFrame->linesize[0], 1, width*3, pFile);

    // Close file
    fclose(pFile);
}

Regards
Hoang Ong
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user



_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to