[FFmpeg-trac] #576(swscale:new): sws_scale crash with PIX_FMT_YUVJ420P -> PIX_FMT_RGB24
FFmpeg
trac at avcodec.org
Fri Oct 21 00:21:50 CEST 2011
#576: sws_scale crash with PIX_FMT_YUVJ420P -> PIX_FMT_RGB24
-------------------------------------+-------------------------------------
Reporter: rich99 | Owner: michael
Type: defect | Status: new
Priority: normal | Component: swscale
Version: git- | Keywords: swscale
master | crash pixelformat
Blocked By: | Blocking:
Reproduced by developer: 0 | Analyzed by developer: 0
-------------------------------------+-------------------------------------
Last ffmpeg built from git, 10/20/2011 10:22:50AM.
Win7 x64, VS2010, built using migGW and msys, gcc 4.5.2.
Build options:
./configure --enable-shared --disable-static --enable-memalign-hack
--target-os=mingw32 --arch=i686 --cpu=i686 --enable-avisynth --enable-zlib
--enable-bzlib --enable-pthreads --enable-runtime-cpudetect --disable-
encoders --enable-swscale --extra-cflags=-U__STRICT_ANSI__
Everything works fine with playback except some crashes when using
sws_scale and certain video files. Here is an example that always crashes
with a sample code provided. I have stripped all checks to simplify the
code to the maximum. The sample video is also attached. If I don't use
sws_scale, everything works fine.
main.cpp
---------------------------------
#define __STDC_CONSTANT_MACROS
#pragma warning(disable:4244)
extern "C"
{
#include <stdint.h>
#include <inttypes.h>
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavcodec/avcodec.h"
#include <libavutil/opt.h>
}
int main()
{
av_register_all();
AVFormatContext* pFormatCtx;
av_open_input_file(&pFormatCtx, "ffdmjpeg.avi", NULL, 0, NULL);
av_find_stream_info(pFormatCtx);
dump_format(pFormatCtx, 0, "test", 0);
AVCodecContext* pCodecCtx;
// i know first stream is at index 0, simplified here
unsigned int videoStream = 0;
pCodecCtx = pFormatCtx->streams[videoStream]->codec;
AVCodec* pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
avcodec_open(pCodecCtx, pCodec);
AVFrame* pFrame = avcodec_alloc_frame();
AVFrame* pFrameRGB = avcodec_alloc_frame();
PixelFormat destFormat = PIX_FMT_RGB24;
// Determine required buffer size and allocate buffer
int numBytes = avpicture_get_size(destFormat, pCodecCtx->width,
pCodecCtx->height);
uint8_t* buffer = (uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
avpicture_fill((AVPicture *)pFrameRGB, buffer, destFormat,
pCodecCtx->width, pCodecCtx->height);
int frameFinished;
AVPacket packet;
SwsContext* swsContext = sws_alloc_context();
//AVOption options;
av_opt_set_defaults(swsContext);
av_set_int(swsContext, "sws_flags", SWS_POINT);
av_set_int(swsContext, "srcw", pCodecCtx->width);
av_set_int(swsContext, "srch", pCodecCtx->height);
av_set_int(swsContext, "dstw", pCodecCtx->width);
av_set_int(swsContext, "dsth", pCodecCtx->height);
av_set_int(swsContext, "src_format", pCodecCtx->pix_fmt);
av_set_int(swsContext, "dst_format", destFormat);
av_set_int(swsContext, "src_range", 1);
av_set_int(swsContext, "dst_range", 1);
sws_init_context(swsContext, NULL, NULL); //success
while(av_read_frame(pFormatCtx, &packet) >= 0)
{
// Is this a packet from the video stream?
if(packet.stream_index == videoStream)
{
// Decode video frame
avcodec_decode_video2(pCodecCtx, pFrame,
&frameFinished, &packet);
// Did we get a video frame?
if(frameFinished)
{
AVPicture &pic =
*(AVPicture*)pFrame;
AVPicture &picDst =
*(AVPicture*)pFrameRGB;
// [CRASH HERE]
sws_scale(swsContext,
&pic.data[0], &pic.linesize[0], 0, pCodecCtx->height, &picDst.data[0],
&picDst.linesize[0]);
//
printf(".");
}
}
// Free the packet that was allocated by av_read_frame
av_free_packet(&packet);
}
av_free(buffer);
av_free(pFrameRGB);
av_free(pFrame);
sws_freeContext(swsContext);
avcodec_close(pCodecCtx);
av_close_input_file(pFormatCtx);
return 0;
}
--
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/576>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list