Mercurial > libavformat.hg
annotate framehook.c @ 4037:5f65cbe25494 libavformat
Fix memleak caused by the fact that url_open_buf() allocates a context
when calling, but url_close_buf() doesn't free it. The better solution
is to not allocate it at all, init it with init_put_byte() and then
not have to close it at all. In the case where we do need to hold it
around for longer than within the function context, we allocate it with
av_alloc_put_byte() and free it with av_free() instead. Discussed in ML
thread "[PATCH] fix small memleak in rdt.c".
author | rbultje |
---|---|
date | Mon, 17 Nov 2008 14:23:20 +0000 |
parents | 97a01cb166f5 |
children | c3102b189cb6 |
rev | line source |
---|---|
0 | 1 /* |
2 * Video processing hooks | |
3 * Copyright (c) 2000, 2001 Fabrice Bellard. | |
4 * | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
896
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
896
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
896
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
0 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
896
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
0 | 11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
896
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
896
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
815
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 20 */ |
21 #include <errno.h> | |
22 #include "config.h" | |
368
08e042299038
(f)printf() is disallowed in libavcodec, compilation will fail now if its used, except that codecs which where added after the printf->av_log change which did ignore av_log() and used prinf are now silent and wont print anything, they should be changed to use av_log, i could do that, but its better if the orginal developer decides which AV_LOG level each message should get
michael
parents:
65
diff
changeset
|
23 #include "avformat.h" |
0 | 24 #include "framehook.h" |
25 | |
1510 | 26 #ifdef HAVE_DLFCN_H |
0 | 27 #include <dlfcn.h> |
28 #endif | |
29 | |
30 | |
2903
ffb5d8bb96b3
Rename two structures, identifiers starting with _[A-Z] are reserved.
diego
parents:
1960
diff
changeset
|
31 typedef struct FrameHookEntry { |
ffb5d8bb96b3
Rename two structures, identifiers starting with _[A-Z] are reserved.
diego
parents:
1960
diff
changeset
|
32 struct FrameHookEntry *next; |
0 | 33 FrameHookConfigureFn Configure; |
34 FrameHookProcessFn Process; | |
4
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
35 FrameHookReleaseFn Release; |
0 | 36 void *ctx; |
37 } FrameHookEntry; | |
38 | |
39 static FrameHookEntry *first_hook; | |
40 | |
41 /* Returns 0 on OK */ | |
42 int frame_hook_add(int argc, char *argv[]) | |
43 { | |
44 void *loaded; | |
45 FrameHookEntry *fhe, **fhep; | |
46 | |
47 if (argc < 1) { | |
48 return ENOENT; | |
49 } | |
50 | |
51 loaded = dlopen(argv[0], RTLD_NOW); | |
52 if (!loaded) { | |
815
5f9e330500d9
printf-> av_log patch by (Benjamin Larsson, banan: student ltu se)
michael
parents:
368
diff
changeset
|
53 av_log(NULL, AV_LOG_ERROR, "%s\n", dlerror()); |
0 | 54 return -1; |
55 } | |
56 | |
57 fhe = av_mallocz(sizeof(*fhe)); | |
58 if (!fhe) { | |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1742
diff
changeset
|
59 return AVERROR(ENOMEM); |
0 | 60 } |
61 | |
62 fhe->Configure = dlsym(loaded, "Configure"); | |
63 fhe->Process = dlsym(loaded, "Process"); | |
4
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
64 fhe->Release = dlsym(loaded, "Release"); /* Optional */ |
0 | 65 |
66 if (!fhe->Process) { | |
815
5f9e330500d9
printf-> av_log patch by (Benjamin Larsson, banan: student ltu se)
michael
parents:
368
diff
changeset
|
67 av_log(NULL, AV_LOG_ERROR, "Failed to find Process entrypoint in %s\n", argv[0]); |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1742
diff
changeset
|
68 return AVERROR(ENOENT); |
0 | 69 } |
70 | |
71 if (!fhe->Configure && argc > 1) { | |
815
5f9e330500d9
printf-> av_log patch by (Benjamin Larsson, banan: student ltu se)
michael
parents:
368
diff
changeset
|
72 av_log(NULL, AV_LOG_ERROR, "Failed to find Configure entrypoint in %s\n", argv[0]); |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1742
diff
changeset
|
73 return AVERROR(ENOENT); |
0 | 74 } |
75 | |
76 if (argc > 1 || fhe->Configure) { | |
77 if (fhe->Configure(&fhe->ctx, argc, argv)) { | |
815
5f9e330500d9
printf-> av_log patch by (Benjamin Larsson, banan: student ltu se)
michael
parents:
368
diff
changeset
|
78 av_log(NULL, AV_LOG_ERROR, "Failed to Configure %s\n", argv[0]); |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1742
diff
changeset
|
79 return AVERROR(EINVAL); |
0 | 80 } |
81 } | |
82 | |
83 for (fhep = &first_hook; *fhep; fhep = &((*fhep)->next)) { | |
84 } | |
85 | |
86 *fhep = fhe; | |
87 | |
88 return 0; | |
89 } | |
90 | |
1960
c0289552590f
Change the vhook code to send real timestamps to the filters instead of the
diego
parents:
1787
diff
changeset
|
91 void frame_hook_process(AVPicture *pict, enum PixelFormat pix_fmt, int width, int height, int64_t pts) |
0 | 92 { |
93 if (first_hook) { | |
94 FrameHookEntry *fhe; | |
95 | |
96 for (fhe = first_hook; fhe; fhe = fhe->next) { | |
97 fhe->Process(fhe->ctx, pict, pix_fmt, width, height, pts); | |
98 } | |
99 } | |
100 } | |
4
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
101 |
64 | 102 void frame_hook_release(void) |
4
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
103 { |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
104 FrameHookEntry *fhe; |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
105 FrameHookEntry *fhenext; |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
106 |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
107 for (fhe = first_hook; fhe; fhe = fhenext) { |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
108 fhenext = fhe->next; |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
109 if (fhe->Release) |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
110 fhe->Release(fhe->ctx); |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
111 av_free(fhe); |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
112 } |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
113 |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
114 first_hook = NULL; |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
115 } |