[FFmpeg-trac] #2609(avformat:new): av_seek_frame crashes on .nut file
FFmpeg
trac at avcodec.org
Thu May 30 09:51:28 CEST 2013
#2609: av_seek_frame crashes on .nut file
-------------------------------------+------------------------------------
Reporter: hxuanyu | Owner:
Type: defect | Status: new
Priority: normal | Component: avformat
Version: unspecified | Resolution:
Keywords: | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+------------------------------------
Description changed by cehoyos:
Old description:
> I'm building application with ffmpeg 1.1.3
> http://ffmpeg.org/releases/ffmpeg-1.1.3.tar.gz. While opening a .nut
> file, av_seek_frame always crashes. I also wrote a simple test app, it
> also crashes every time.
>
> The file I used is here
> https://dl.dropboxusercontent.com/u/89678527/Akon.nut. And below is the
> test code:
>
> static int open_codec_context(int *stream_idx,
> AVFormatContext *fmt_ctx, enum AVMediaType
> type)
> {
> int ret;
> AVStream *st;
> AVCodecContext *dec_ctx = NULL;
> AVCodec *dec = NULL;
>
> ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
> if (ret < 0) {
> //fprintf(stderr, "Could not find %s stream in input file
> '%s'\n",
> // av_get_media_type_string(type), src_filename);
> return ret;
> } else {
> *stream_idx = ret;
> st = fmt_ctx->streams[*stream_idx];
>
> /* find decoder for the stream */
> dec_ctx = st->codec;
> dec = avcodec_find_decoder(dec_ctx->codec_id);
> if (!dec) {
> fprintf(stderr, "Failed to find %s codec\n",
> av_get_media_type_string(type));
> return ret;
> }
>
> if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) {
> fprintf(stderr, "Failed to open %s codec\n",
> av_get_media_type_string(type));
> return ret;
> }
> }
>
> return 0;
> }
>
> int main(int argc, char **argv)
> {
> int ret;
>
> if (argc == 1) {
> printf("no argument provided, exit ************** \n");
> return 0;
> }
> const char *src_filename = argv[1];
>
> printf("to play %s\n", src_filename);
>
> avcodec_register_all();
> av_register_all();
>
> AVFormatContext *pFormatCtx = NULL;
> if (avformat_open_input(&pFormatCtx, src_filename, NULL, NULL) < 0) {
> fprintf(stderr, "Could not open source file %s\n", src_filename);
> exit(1);
> }
>
> if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
> fprintf(stderr, "Could not find stream information\n");
> exit(1);
> }
>
> int video_stream_idx = -1, audio_stream_idx = -1;
> AVStream *video_stream;
> AVCodecContext *pCodecCtx = NULL;
> if (open_codec_context(&video_stream_idx, pFormatCtx,
> AVMEDIA_TYPE_VIDEO) >= 0) {
> video_stream = pFormatCtx->streams[video_stream_idx];
> pCodecCtx = video_stream->codec;
> printf("video stream index = %d", video_stream_idx);
> }
>
> AVCodec* pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
> avcodec_open(pCodecCtx, pCodec);
>
> AVFrame *frame = avcodec_alloc_frame();
> AVPacket pkt;
>
> av_init_packet(&pkt);
> pkt.data = NULL;
> pkt.size = 0;
>
> int count = 0;
> while (av_read_frame(pFormatCtx, &pkt) >= 0) {
> printf("frame %d\n", count++);
> if (count == 100) av_seek_frame(pFormatCtx, video_stream_idx, 0,
> 0); // always crashes here.
> }
> }
>
> I tried to print out some trace, it's pretty much that crash happens in
> read_seek of nutdec.c
New description:
I'm building application with ffmpeg 1.1.3
http://ffmpeg.org/releases/ffmpeg-1.1.3.tar.gz. While opening a .nut file,
av_seek_frame always crashes. I also wrote a simple test app, it also
crashes every time.
The file I used is here
https://dl.dropboxusercontent.com/u/89678527/Akon.nut. And below is the
test code:
{{{
static int open_codec_context(int *stream_idx,
AVFormatContext *fmt_ctx, enum AVMediaType
type)
{
int ret;
AVStream *st;
AVCodecContext *dec_ctx = NULL;
AVCodec *dec = NULL;
ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
if (ret < 0) {
//fprintf(stderr, "Could not find %s stream in input file '%s'\n",
// av_get_media_type_string(type), src_filename);
return ret;
} else {
*stream_idx = ret;
st = fmt_ctx->streams[*stream_idx];
/* find decoder for the stream */
dec_ctx = st->codec;
dec = avcodec_find_decoder(dec_ctx->codec_id);
if (!dec) {
fprintf(stderr, "Failed to find %s codec\n",
av_get_media_type_string(type));
return ret;
}
if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) {
fprintf(stderr, "Failed to open %s codec\n",
av_get_media_type_string(type));
return ret;
}
}
return 0;
}
int main(int argc, char **argv)
{
int ret;
if (argc == 1) {
printf("no argument provided, exit ************** \n");
return 0;
}
const char *src_filename = argv[1];
printf("to play %s\n", src_filename);
avcodec_register_all();
av_register_all();
AVFormatContext *pFormatCtx = NULL;
if (avformat_open_input(&pFormatCtx, src_filename, NULL, NULL) < 0) {
fprintf(stderr, "Could not open source file %s\n", src_filename);
exit(1);
}
if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
fprintf(stderr, "Could not find stream information\n");
exit(1);
}
int video_stream_idx = -1, audio_stream_idx = -1;
AVStream *video_stream;
AVCodecContext *pCodecCtx = NULL;
if (open_codec_context(&video_stream_idx, pFormatCtx,
AVMEDIA_TYPE_VIDEO) >= 0) {
video_stream = pFormatCtx->streams[video_stream_idx];
pCodecCtx = video_stream->codec;
printf("video stream index = %d", video_stream_idx);
}
AVCodec* pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
avcodec_open(pCodecCtx, pCodec);
AVFrame *frame = avcodec_alloc_frame();
AVPacket pkt;
av_init_packet(&pkt);
pkt.data = NULL;
pkt.size = 0;
int count = 0;
while (av_read_frame(pFormatCtx, &pkt) >= 0) {
printf("frame %d\n", count++);
if (count == 100) av_seek_frame(pFormatCtx, video_stream_idx, 0,
0); // always crashes here.
}
}
}}}
I tried to print out some trace, it's pretty much that crash happens in
read_seek of nutdec.c
--
--
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/2609#comment:2>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list