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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * Video processing hooks
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2000, 2001 Fabrice Bellard.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21 #include <errno.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24 #include "framehook.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25
1510
d68525fe36da rename HAVE_DLFCN to HAVE_DLFCN_H
mru
parents: 1493
diff changeset
26 #ifdef HAVE_DLFCN_H
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27 #include <dlfcn.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33 FrameHookConfigureFn Configure;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
36 void *ctx;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
37 } FrameHookEntry;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
38
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39 static FrameHookEntry *first_hook;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41 /* Returns 0 on OK */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 int frame_hook_add(int argc, char *argv[])
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
43 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44 void *loaded;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45 FrameHookEntry *fhe, **fhep;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
46
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
47 if (argc < 1) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
48 return ENOENT;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51 loaded = dlopen(argv[0], RTLD_NOW);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
55 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
56
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
57 fhe = av_mallocz(sizeof(*fhe));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
60 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
61
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62 fhe->Configure = dlsym(loaded, "Configure");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
65
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
70
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76 if (argc > 1 || fhe->Configure) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
83 for (fhep = &first_hook; *fhep; fhep = &((*fhep)->next)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
85
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
86 *fhep = fhe;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
87
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 if (first_hook) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94 FrameHookEntry *fhe;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 for (fhe = first_hook; fhe; fhe = fhe->next) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97 fhe->Process(fhe->ctx, pict, pix_fmt, width, height, pts);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 }
4
dcc03a32d1bb Added support for a realease function to eliminate the context blocks used
philipjsg
parents: 0
diff changeset
101
64
b0e0eb595e29 * static,const,compiler warning cleanup
kabi
parents: 4
diff changeset
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 }