@@ -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