mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-31 12:36:41 +08:00 
			
		
		
		
	Plug memory leak in NUT muxer and demuxer
Originally committed as revision 22174 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		| @@ -12,6 +12,9 @@ libavutil:   2009-03-08 | |||||||
|  |  | ||||||
| API changes, most recent first: | API changes, most recent first: | ||||||
|  |  | ||||||
|  | 2010-03-03 - r22174 - lavu 50.10.0 - av_tree_enumerate() | ||||||
|  |   Add av_tree_enumerate(). | ||||||
|  |  | ||||||
| 2010-02-07 - r21673 - lavu 50.9.0 - av_compare_ts() | 2010-02-07 - r21673 - lavu 50.9.0 - av_compare_ts() | ||||||
|   Add av_compare_ts(). |   Add av_compare_ts(). | ||||||
|  |  | ||||||
|   | |||||||
| @@ -69,6 +69,17 @@ void ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts){ | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void enu_free(void *opaque, void *elem) | ||||||
|  | { | ||||||
|  |     av_free(elem); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ff_nut_free_sp(NUTContext *nut) | ||||||
|  | { | ||||||
|  |     av_tree_enumerate(nut->syncpoints, NULL, NULL, enu_free); | ||||||
|  |     av_tree_destroy(nut->syncpoints); | ||||||
|  | } | ||||||
|  |  | ||||||
| const Dispositions ff_nut_dispositions[] = { | const Dispositions ff_nut_dispositions[] = { | ||||||
|     {"default"     , AV_DISPOSITION_DEFAULT}, |     {"default"     , AV_DISPOSITION_DEFAULT}, | ||||||
|     {"dub"         , AV_DISPOSITION_DUB}, |     {"dub"         , AV_DISPOSITION_DUB}, | ||||||
|   | |||||||
| @@ -110,6 +110,7 @@ int64_t ff_lsb2full(StreamContext *stream, int64_t lsb); | |||||||
| int ff_nut_sp_pos_cmp(Syncpoint *a, Syncpoint *b); | int ff_nut_sp_pos_cmp(Syncpoint *a, Syncpoint *b); | ||||||
| int ff_nut_sp_pts_cmp(Syncpoint *a, Syncpoint *b); | int ff_nut_sp_pts_cmp(Syncpoint *a, Syncpoint *b); | ||||||
| void ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts); | void ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts); | ||||||
|  | void ff_nut_free_sp(NUTContext *nut); | ||||||
|  |  | ||||||
| extern const Dispositions ff_nut_dispositions[]; | extern const Dispositions ff_nut_dispositions[]; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -901,6 +901,7 @@ static int nut_read_close(AVFormatContext *s) | |||||||
|  |  | ||||||
|     av_freep(&nut->time_base); |     av_freep(&nut->time_base); | ||||||
|     av_freep(&nut->stream); |     av_freep(&nut->stream); | ||||||
|  |     ff_nut_free_sp(nut); | ||||||
|     for(i = 1; i < nut->header_count; i++) |     for(i = 1; i < nut->header_count; i++) | ||||||
|         av_freep(&nut->header[i]); |         av_freep(&nut->header[i]); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -797,6 +797,7 @@ static int write_trailer(AVFormatContext *s){ | |||||||
|     while(nut->header_count<3) |     while(nut->header_count<3) | ||||||
|         write_headers(nut, bc); |         write_headers(nut, bc); | ||||||
|     put_flush_packet(bc); |     put_flush_packet(bc); | ||||||
|  |     ff_nut_free_sp(nut); | ||||||
|     av_freep(&nut->stream); |     av_freep(&nut->stream); | ||||||
|     av_freep(&nut->time_base); |     av_freep(&nut->time_base); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ | |||||||
| #define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) | #define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) | ||||||
|  |  | ||||||
| #define LIBAVUTIL_VERSION_MAJOR 50 | #define LIBAVUTIL_VERSION_MAJOR 50 | ||||||
| #define LIBAVUTIL_VERSION_MINOR  9 | #define LIBAVUTIL_VERSION_MINOR 10 | ||||||
| #define LIBAVUTIL_VERSION_MICRO  0 | #define LIBAVUTIL_VERSION_MICRO  0 | ||||||
|  |  | ||||||
| #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | ||||||
|   | |||||||
| @@ -135,7 +135,6 @@ void av_tree_destroy(AVTreeNode *t){ | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| #if 0 |  | ||||||
| void av_tree_enumerate(AVTreeNode *t, void *opaque, int (*cmp)(void *opaque, void *elem), int (*enu)(void *opaque, void *elem)){ | void av_tree_enumerate(AVTreeNode *t, void *opaque, int (*cmp)(void *opaque, void *elem), int (*enu)(void *opaque, void *elem)){ | ||||||
|     if(t){ |     if(t){ | ||||||
|         int v= cmp ? cmp(opaque, t->elem) : 0; |         int v= cmp ? cmp(opaque, t->elem) : 0; | ||||||
| @@ -144,7 +143,6 @@ void av_tree_enumerate(AVTreeNode *t, void *opaque, int (*cmp)(void *opaque, voi | |||||||
|         if(v<=0) av_tree_enumerate(t->child[1], opaque, cmp, enu); |         if(v<=0) av_tree_enumerate(t->child[1], opaque, cmp, enu); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef TEST | #ifdef TEST | ||||||
|  |  | ||||||
|   | |||||||
| @@ -79,4 +79,17 @@ void *av_tree_find(const struct AVTreeNode *root, void *key, int (*cmp)(void *ke | |||||||
| void *av_tree_insert(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b), struct AVTreeNode **next); | void *av_tree_insert(struct AVTreeNode **rootp, void *key, int (*cmp)(void *key, const void *b), struct AVTreeNode **next); | ||||||
| void av_tree_destroy(struct AVTreeNode *t); | void av_tree_destroy(struct AVTreeNode *t); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Applies enu(opaque, &elem) to all the elements in the tree in a given range. | ||||||
|  |  * | ||||||
|  |  * @param cmp a comparison function that returns < 0 for a element below the | ||||||
|  |  *            range, > 0 for a element above the range and == 0 for a | ||||||
|  |  *            element inside the range | ||||||
|  |  * | ||||||
|  |  * @note The cmp function should use the same ordering used to construct the | ||||||
|  |  *       tree. | ||||||
|  |  */ | ||||||
|  | void av_tree_enumerate(struct AVTreeNode *t, void *opaque, int (*cmp)(void *opaque, void *elem), int (*enu)(void *opaque, void *elem)); | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* AVUTIL_TREE_H */ | #endif /* AVUTIL_TREE_H */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Vitor Sessak
					Vitor Sessak