<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
Hello,<br>
<br>
I am trying to encode one single video frame as a jpg image.<br>
<br>
This my code: <br>
--------------------------------------------------<br>
<font face="Courier New, Courier, monospace"><span
style="background-color:#ffffff;padding:0px 0px 0px 2px;"><span
style="background-color: rgb(255, 255, 255); white-space: pre;">void saveFrame(AVFrame *pFrame,char *filename, int i)</span></span></font><br>
<font face="Courier New, Courier, monospace">{</font><br>
<font face="Courier New, Courier, monospace"> // pFrame has
pix_fmt AV_PIX_FMT_YUV420P </font><br>
<font face="Courier New, Courier, monospace"> int ret;</font><br>
<font face="Courier New, Courier, monospace"> FILE *JPEGFile;</font><br>
<font face="Courier New, Courier, monospace"> AVCodec *jpegCodec
= avcodec_find_encoder(AV_CODEC_ID_MJPEG);</font><br>
<font face="Courier New, Courier, monospace"> if (!jpegCodec) {</font><br>
<font face="Courier New, Courier, monospace"> return;</font><br>
<font face="Courier New, Courier, monospace"> }</font><br>
<font face="Courier New, Courier, monospace"> AVCodecContext
*jpegContext = avcodec_alloc_context3(jpegCodec);</font><br>
<font face="Courier New, Courier, monospace"> if (!jpegContext) {</font><br>
<font face="Courier New, Courier, monospace">
fprintf(stderr,"Error getting encoder context\n");</font><br>
<font face="Courier New, Courier, monospace"> return;</font><br>
<font face="Courier New, Courier, monospace"> }</font><br>
<font face="Courier New, Courier, monospace"> AVPacket* packet =
av_packet_alloc();</font><br>
<font face="Courier New, Courier, monospace">
jpegContext->height = pFrame->height;</font><br>
<font face="Courier New, Courier, monospace">
jpegContext->width = pFrame->width;</font><br>
<font face="Courier New, Courier, monospace">
jpegContext->pix_fmt = AV_PIX_FMT_YUVJ420P;</font><br>
<font face="Courier New, Courier, monospace">
jpegContext->time_base = (AVRational){1,25};</font><br>
<font face="Courier New, Courier, monospace">
jpegContext->framerate = (AVRational){25,1};</font><br>
<font face="Courier New, Courier, monospace">
jpegContext->qcompress = 0.5;</font><br>
<font face="Courier New, Courier, monospace"> if
(avcodec_open2(jpegContext, jpegCodec, NULL) < 0) {</font><br>
<font face="Courier New, Courier, monospace">
fprintf(stderr,"Error opening encoder\n");</font><br>
<font face="Courier New, Courier, monospace"> return;</font><br>
<font face="Courier New, Courier, monospace"> }</font><br>
<font face="Courier New, Courier, monospace"> ret =
avcodec_send_frame(jpegContext,pFrame);</font><br>
<font face="Courier New, Courier, monospace"> if (ret < 0)</font><br>
<font face="Courier New, Courier, monospace"> {</font><br>
<font face="Courier New, Courier, monospace">
write_avErrorMsg(ret,"saveFrame");</font><br>
<font face="Courier New, Courier, monospace"> return;</font><br>
<font face="Courier New, Courier, monospace"> }</font><br>
<font face="Courier New, Courier, monospace"> ret =
avcodec_receive_packet(jpegContext,packet);</font><br>
<font face="Courier New, Courier, monospace"> if (ret < 0)</font><br>
<font face="Courier New, Courier, monospace"> {</font><br>
<font face="Courier New, Courier, monospace">
write_avErrorMsg(ret,"saveFrame");</font><br>
<font face="Courier New, Courier, monospace"> return;</font><br>
<font face="Courier New, Courier, monospace"> }</font><br>
<font face="Courier New, Courier, monospace"> JPEGFile =
fopen(filename, "wb");</font><br>
<font face="Courier New, Courier, monospace">
fwrite(packet->data, 1, packet->size, JPEGFile);</font><br>
<font face="Courier New, Courier, monospace"> fclose(JPEGFile);</font><br>
<font face="Courier New, Courier, monospace">
av_packet_unref(packet);</font><br>
<font face="Courier New, Courier, monospace">
avcodec_close(jpegContext);</font><br>
<font face="Courier New, Courier, monospace"> return;</font><br>
<font face="Courier New, Courier, monospace">-----------------------------------------</font><br>
<br>
Calling avcodec_send_frame results in this error:<br>
Assertion ((src_linesize) >= 0 ? (src_linesize) :
(-(src_linesize))) >= bytewidth failed at
src/libavutil/imgutils.c:349<br>
<br>
Something seems to be wrong with the source (pFrame in my example).
I assume an issue with the bytewidth, because the values of
pFrame->linesize are correct. <br>
How can I fix this problem?<br>
<br>
Thanks in advance,<br>
Udo<br>
</body>
</html>