Mercurial > libavformat.hg
annotate framehook.c @ 3754:8d267b43eaba libavformat
Move malloc() down until after all initializations, so that the resource is
only allocated if initialization worked. This means that on failure, we
don't have to deallocate it.
author | rbultje |
---|---|
date | Sat, 23 Aug 2008 18:46:30 +0000 |
parents | ffb5d8bb96b3 |
children | 97a01cb166f5 |
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 { | |
1470 | 44 #ifdef CONFIG_VHOOK |
0 | 45 void *loaded; |
46 FrameHookEntry *fhe, **fhep; | |
47 | |
48 if (argc < 1) { | |
49 return ENOENT; | |
50 } | |
51 | |
52 loaded = dlopen(argv[0], RTLD_NOW); | |
53 if (!loaded) { | |
815
5f9e330500d9
printf-> av_log patch by (Benjamin Larsson, banan: student ltu se)
michael
parents:
368
diff
changeset
|
54 av_log(NULL, AV_LOG_ERROR, "%s\n", dlerror()); |
0 | 55 return -1; |
56 } | |
57 | |
58 fhe = av_mallocz(sizeof(*fhe)); | |
59 if (!fhe) { | |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1742
diff
changeset
|
60 return AVERROR(ENOMEM); |
0 | 61 } |
62 | |
63 fhe->Configure = dlsym(loaded, "Configure"); | |
64 fhe->Process = dlsym(loaded, "Process"); | |
4
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
65 fhe->Release = dlsym(loaded, "Release"); /* Optional */ |
0 | 66 |
67 if (!fhe->Process) { | |
815
5f9e330500d9
printf-> av_log patch by (Benjamin Larsson, banan: student ltu se)
michael
parents:
368
diff
changeset
|
68 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
|
69 return AVERROR(ENOENT); |
0 | 70 } |
71 | |
72 if (!fhe->Configure && argc > 1) { | |
815
5f9e330500d9
printf-> av_log patch by (Benjamin Larsson, banan: student ltu se)
michael
parents:
368
diff
changeset
|
73 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
|
74 return AVERROR(ENOENT); |
0 | 75 } |
76 | |
77 if (argc > 1 || fhe->Configure) { | |
78 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
|
79 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
|
80 return AVERROR(EINVAL); |
0 | 81 } |
82 } | |
83 | |
84 for (fhep = &first_hook; *fhep; fhep = &((*fhep)->next)) { | |
85 } | |
86 | |
87 *fhep = fhe; | |
88 | |
89 return 0; | |
90 #else | |
815
5f9e330500d9
printf-> av_log patch by (Benjamin Larsson, banan: student ltu se)
michael
parents:
368
diff
changeset
|
91 av_log(NULL, AV_LOG_ERROR, "Video hooking not compiled into this version\n"); |
0 | 92 return 1; |
93 #endif | |
94 } | |
95 | |
1960
c0289552590f
Change the vhook code to send real timestamps to the filters instead of the
diego
parents:
1787
diff
changeset
|
96 void frame_hook_process(AVPicture *pict, enum PixelFormat pix_fmt, int width, int height, int64_t pts) |
0 | 97 { |
98 if (first_hook) { | |
99 FrameHookEntry *fhe; | |
100 | |
101 for (fhe = first_hook; fhe; fhe = fhe->next) { | |
102 fhe->Process(fhe->ctx, pict, pix_fmt, width, height, pts); | |
103 } | |
104 } | |
105 } | |
4
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
106 |
64 | 107 void frame_hook_release(void) |
4
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
108 { |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
109 FrameHookEntry *fhe; |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
110 FrameHookEntry *fhenext; |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
111 |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
112 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
|
113 fhenext = fhe->next; |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
114 if (fhe->Release) |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
115 fhe->Release(fhe->ctx); |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
116 av_free(fhe); |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
117 } |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
118 |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
119 first_hook = NULL; |
dcc03a32d1bb
Added support for a realease function to eliminate the context blocks used
philipjsg
parents:
0
diff
changeset
|
120 } |