2 * Video processing hooks
3 * Copyright (c) 2000, 2001 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 #include "framehook.h"
31 typedef struct FrameHookEntry
{
32 struct FrameHookEntry
*next
;
33 FrameHookConfigureFn Configure
;
34 FrameHookProcessFn Process
;
35 FrameHookReleaseFn Release
;
39 static FrameHookEntry
*first_hook
;
42 int frame_hook_add(int argc
, char *argv
[])
45 FrameHookEntry
*fhe
, **fhep
;
51 loaded
= dlopen(argv
[0], RTLD_NOW
);
53 av_log(NULL
, AV_LOG_ERROR
, "%s\n", dlerror());
57 fhe
= av_mallocz(sizeof(*fhe
));
59 return AVERROR(ENOMEM
);
62 fhe
->Configure
= dlsym(loaded
, "Configure");
63 fhe
->Process
= dlsym(loaded
, "Process");
64 fhe
->Release
= dlsym(loaded
, "Release"); /* Optional */
67 av_log(NULL
, AV_LOG_ERROR
, "Failed to find Process entrypoint in %s\n", argv
[0]);
68 return AVERROR(ENOENT
);
71 if (!fhe
->Configure
&& argc
> 1) {
72 av_log(NULL
, AV_LOG_ERROR
, "Failed to find Configure entrypoint in %s\n", argv
[0]);
73 return AVERROR(ENOENT
);
76 if (argc
> 1 || fhe
->Configure
) {
77 if (fhe
->Configure(&fhe
->ctx
, argc
, argv
)) {
78 av_log(NULL
, AV_LOG_ERROR
, "Failed to Configure %s\n", argv
[0]);
79 return AVERROR(EINVAL
);
83 for (fhep
= &first_hook
; *fhep
; fhep
= &((*fhep
)->next
)) {
91 void frame_hook_process(AVPicture
*pict
, enum PixelFormat pix_fmt
, int width
, int height
, int64_t pts
)
96 for (fhe
= first_hook
; fhe
; fhe
= fhe
->next
) {
97 fhe
->Process(fhe
->ctx
, pict
, pix_fmt
, width
, height
, pts
);
102 void frame_hook_release(void)
105 FrameHookEntry
*fhenext
;
107 for (fhe
= first_hook
; fhe
; fhe
= fhenext
) {
110 fhe
->Release(fhe
->ctx
);