Skip to content

Commit 27a9d8a

Browse files
committed
Fix reading a video using libav (correct API usage)
1 parent 5601cb3 commit 27a9d8a

File tree

1 file changed

+56
-16
lines changed

1 file changed

+56
-16
lines changed

bin/tld.c

Lines changed: 56 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ int main(int argc, char** argv)
2424
AVFormatContext* ic = 0;
2525
int video_stream = -1;
2626
AVStream* video_st = 0;
27-
AVFrame* picture = 0;
28-
AVFrame rgb_picture;
29-
memset(&rgb_picture, 0, sizeof(AVPicture));
27+
AVFrame* picture = avcodec_alloc_frame();
28+
AVFrame* rgb_picture = avcodec_alloc_frame();
29+
//avcodec_get_frame_defaults(&rgb_picture);
3030
AVPacket packet;
3131
memset(&packet, 0, sizeof(AVPacket));
3232
av_init_packet(&packet);
@@ -47,38 +47,77 @@ int main(int argc, char** argv)
4747
continue;
4848
video_stream = i;
4949
video_st = ic->streams[i];
50-
picture = avcodec_alloc_frame();
51-
rgb_picture.data[0] = (uint8_t*)ccmalloc(avpicture_get_size(PIX_FMT_RGB24, enc->width, enc->height));
52-
avpicture_fill((AVPicture*)&rgb_picture, rgb_picture.data[0], PIX_FMT_RGB24, enc->width, enc->height);
50+
avpicture_alloc((AVPicture*) rgb_picture, PIX_FMT_RGB24, enc->width, enc->height);
5351
break;
5452
}
5553
}
5654
int got_picture = 0;
5755
while (!got_picture)
5856
{
57+
av_init_packet(&packet);
5958
int result = av_read_frame(ic, &packet);
60-
if (result == AVERROR(EAGAIN))
59+
if (result == AVERROR(EAGAIN) || packet.stream_index != video_stream)
60+
{
61+
av_free_packet(&packet);
6162
continue;
62-
avcodec_decode_video2(video_st->codec, picture, &got_picture, &packet);
63+
}
64+
else if (result < 0)
65+
return 1;
66+
67+
if (avcodec_decode_video2(video_st->codec, picture, &got_picture,
68+
&packet) < 0)
69+
return 1;
70+
av_free_packet(&packet);
6371
}
72+
6473
ccv_enable_default_cache();
65-
struct SwsContext* picture_ctx = sws_getCachedContext(0, video_st->codec->width, video_st->codec->height, video_st->codec->pix_fmt, video_st->codec->width, video_st->codec->height, PIX_FMT_RGB24, SWS_BICUBIC, 0, 0, 0);
66-
sws_scale(picture_ctx, (const uint8_t* const*)picture->data, picture->linesize, 0, video_st->codec->height, rgb_picture.data, rgb_picture.linesize);
74+
75+
struct SwsContext* picture_ctx =
76+
sws_getCachedContext(0, video_st->codec->width,
77+
video_st->codec->height, video_st->codec->pix_fmt,
78+
video_st->codec->width, video_st->codec->height,
79+
PIX_FMT_RGB24, SWS_BICUBIC, 0, 0, 0);
80+
81+
sws_scale(picture_ctx, (const uint8_t* const*) picture->data,
82+
picture->linesize, 0, video_st->codec->height,
83+
rgb_picture->data, rgb_picture->linesize);
84+
6785
ccv_dense_matrix_t* x = 0;
68-
ccv_read(rgb_picture.data[0], &x, CCV_IO_RGB_RAW | CCV_IO_GRAY, video_st->codec->height, video_st->codec->width, rgb_picture.linesize[0]);
86+
ccv_read(rgb_picture->data[0], &x, CCV_IO_RGB_RAW | CCV_IO_GRAY,
87+
video_st->codec->height, video_st->codec->width,
88+
rgb_picture->linesize[0]);
6989
ccv_tld_t* tld = ccv_tld_new(x, box, ccv_tld_default_params);
90+
7091
ccv_dense_matrix_t* y = 0;
92+
7193
for (;;)
7294
{
7395
got_picture = 0;
96+
97+
av_init_packet(&packet);
7498
int result = av_read_frame(ic, &packet);
75-
if (result == AVERROR(EAGAIN))
99+
100+
if (result == AVERROR(EAGAIN) || packet.stream_index != video_stream)
101+
{
102+
av_free_packet(&packet);
76103
continue;
77-
avcodec_decode_video2(video_st->codec, picture, &got_picture, &packet);
104+
}
105+
else if (result < 0)
106+
return 1;
107+
108+
if (avcodec_decode_video2(video_st->codec, picture, &got_picture,
109+
&packet) < 0)
110+
return 1;
111+
78112
if (!got_picture)
79113
break;
80-
sws_scale(picture_ctx, (const uint8_t* const*)picture->data, picture->linesize, 0, video_st->codec->height, rgb_picture.data, rgb_picture.linesize);
81-
ccv_read(rgb_picture.data[0], &y, CCV_IO_RGB_RAW | CCV_IO_GRAY, video_st->codec->height, video_st->codec->width, rgb_picture.linesize[0]);
114+
115+
sws_scale(picture_ctx, (const uint8_t* const*)picture->data,
116+
picture->linesize, 0, video_st->codec->height,
117+
rgb_picture->data, rgb_picture->linesize);
118+
ccv_read(rgb_picture->data[0], &y, CCV_IO_RGB_RAW | CCV_IO_GRAY,
119+
video_st->codec->height, video_st->codec->width,
120+
rgb_picture->linesize[0]);
82121
ccv_tld_info_t info;
83122
ccv_comp_t newbox = ccv_tld_track_object(tld, x, y, &info);
84123
/*
@@ -132,7 +171,8 @@ int main(int argc, char** argv)
132171
}
133172
ccv_matrix_free(x);
134173
ccv_tld_free(tld);
135-
ccfree(rgb_picture.data[0]);
174+
avpicture_free((AVPicture *) rgb_picture);
175+
av_free(rgb_picture);
136176
ccv_disable_cache();
137177
#endif
138178
#endif

0 commit comments

Comments
 (0)