Opened 13 years ago
Closed 13 years ago
#2637 closed defect (needs_more_info)
avcodec_close error
| Reported by: | jocker | Owned by: | |
|---|---|---|---|
| Priority: | normal | Component: | avcodec |
| Version: | unspecified | Keywords: | |
| Cc: | Blocked By: | ||
| Blocking: | Reproduced by developer: | no | |
| Analyzed by developer: | no |
Description
I use to compile the 32-bit version of ffmpeg visual studio 2012. I used the latter for now windows build from 5/29/13.
Here is my test code:
avcodec_register_all();
int width = 764, height = 480;
int got_output;
AVFrame *frame;
AVPacket pkt;
AVCodec *codec;
AVCodecContext *c = NULL;
while(1)
{
frame = avcodec_alloc_frame();
if (!frame) {
fprintf(stderr, "Could not allocate video frame\n");
return -1;
}
frame->format = AV_PIX_FMT_YUV420P;
frame->width = width;
frame->height = height;
/* the image can be allocated by any means and av_image_alloc() is
* just the most convenient way if av_malloc() is to be used */
int ret = av_image_alloc(frame->data, frame->linesize, width, height,
AV_PIX_FMT_YUV420P, 1);
if (ret < 0) {
fprintf(stderr, "Could not allocate raw picture buffer\n");
av_freep(&frame->data[0]);
avcodec_free_frame(&frame);
return -1;
}
/* find the mpeg4 video encoder */
codec = avcodec_find_encoder(AV_CODEC_ID_MPEG4);
if (!codec) {
fprintf(stderr, "Codec not found\n");
return -1;
}
c = avcodec_alloc_context3(codec);
if (!c) {
fprintf(stderr, "Could not allocate video codec context\n");
return -1;
}
/* put sample parameters */
c->profile = FF_PROFILE_MPEG4_SIMPLE;
/* resolution must be a multiple of two */
c->width = width;
c->height = height;
/* frames per second */
c->time_base.den = 25;
c->time_base.num = 1;
c->gop_size = 25; /* emit one intra frame every 25 frames */
c->pix_fmt = AV_PIX_FMT_YUV420P;
c->qmax = 4;
c->qmin = 4;
/* open it */
if (avcodec_open2(c, codec, NULL) < 0) {
fprintf(stderr, "Could not open codec\n");
avcodec_close(c);
av_free(c);
return -1;
}
for(int k = 0; k < 30; k++)
{
av_init_packet(&pkt);
pkt.data = NULL; // packet data will be allocated by the encoder
pkt.size = 0;
frame->pts = c->frame_number;
/* encode the image */
if (avcodec_encode_video2(c, &pkt, frame, &got_output) < 0) {
fprintf(stderr, "Error encoding frame\n");
return -1;
}
if (got_output) {
av_free_packet(&pkt);
}
}
if(c)
{
avcodec_close(c);
av_free(c);
}
if(frame)
{
av_freep(&frame->data[0]);
avcodec_free_frame(&frame);
}
}
return 0;
On the second call function avcodec_close () throws an exception. Such an error is detected on the MPEG4 codec with a frame width in the range 754-767 at an altitude of 480. Perhaps at other resolutions, too. Help solve the problem.
Change History (1)
comment:1 by , 13 years ago
| Keywords: | avcodec_close removed |
|---|---|
| Priority: | important → normal |
| Resolution: | → needs_more_info |
| Status: | new → closed |
Note:
See TracTickets
for help on using tickets.



This tracker is intended for reports of bugs within FFmpeg. Please reopen this ticket if you suspect a bug within FFmpeg and if you can provide backtrace etc. as explained on http://ffmpeg.org/bugreports.html
If you need support please read http://ffmpeg.org/contact.html