Capture live stream and convert YUV to JPEG using FFmpeg.
static int capture_picture(Decoder *d, AVFrame *frame)
{
AVPacket pkt;
int got_picture = 0;
int ret = 0;
AVCodec *pCodec = avcodec_find_encoder(AV_CODEC_ID_MJPEG);
if(!pCodec)
return -1;
AVCodecContext *pCodecCtx = avcodec_alloc_context3(pCodec);
if(!pCodecCtx)
return -2;
pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO;
pCodecCtx->pix_fmt = AV_PIX_FMT_YUVJ420P;
pCodecCtx->width = d->avctx->width;
pCodecCtx->height = d->avctx->height;
pCodecCtx->time_base.num = 1;
pCodecCtx->time_base.den = 30;
av_new_packet(&pkt, d->avctx->width * d->avctx->height * 3);
ret = avcodec_open2(pCodecCtx, pCodec, NULL);
if(ret < 0)
goto fail;
ret = avcodec_encode_video2(pCodecCtx, &pkt, frame, &got_picture);
if(ret < 0)
goto fail;
if(got_picture)
printf("Got the data: size=%d, w=%d, h=%d, format=%d\n", pkt.size, frame->width, frame->height, frame->format);
fail:
av_free_packet(&pkt);
if(pCodecCtx)
avcodec_free_context(&pCodecCtx);
return ret;
}
Call above function in decoder_decode_frame() or queue_picture() in ffplay.c file.
Note: this will not work when using hard decoding.