File: ve.c

package info (click to toggle)
mplayer 2%3A1.5%2Bsvn38674-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 32,232 kB
  • sloc: ansic: 332,435; xml: 116,512; sh: 9,876; perl: 1,154; objc: 1,073; makefile: 1,030; cpp: 875; asm: 346; awk: 223; python: 98; cs: 10
file content (129 lines) | stat: -rw-r--r-- 3,815 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
 * This file is part of MPlayer.
 *
 * MPlayer is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * MPlayer is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "config.h"
#include "mp_msg.h"

#include "img_format.h"
#include "mp_image.h"
#include "vf.h"
#include "ve.h"

extern const vf_info_t ve_info_lavc;
extern const vf_info_t ve_info_vfw;
extern const vf_info_t ve_info_raw;
extern const vf_info_t ve_info_libdv;
extern const vf_info_t ve_info_xvid;
extern const vf_info_t ve_info_qtvideo;
extern const vf_info_t ve_info_nuv;
extern const vf_info_t ve_info_x264;

/* Please do not add any new encoders here. If you want to implement a new
 * encoder, add it to libavcodec, except for wrappers around external
 * libraries and encoders requiring binary support. */

static const vf_info_t * const encoder_list[] = {
#ifdef CONFIG_FFMPEG
    &ve_info_lavc,
#endif
#ifdef CONFIG_WIN32DLL
    &ve_info_vfw,
#ifdef CONFIG_QTX_CODECS_WIN32
    &ve_info_qtvideo,
#endif
#endif
#ifdef CONFIG_LIBDV095
    &ve_info_libdv,
#endif
    &ve_info_raw,
#ifdef CONFIG_XVID4
    &ve_info_xvid,
#endif
#ifdef CONFIG_LIBLZO
    &ve_info_nuv,
#endif
#ifdef CONFIG_X264
    &ve_info_x264,
#endif
    /* Please do not add any new encoders here. If you want to implement a new
     * encoder, add it to libavcodec, except for wrappers around external
     * libraries and encoders requiring binary support. */
    NULL
};

vf_instance_t* vf_open_encoder(vf_instance_t* next, const char *name, char *args){
    char* vf_args[] = { "_oldargs_", args, NULL };
    return vf_open_plugin(encoder_list,next,name,vf_args);
}

static double *forced_key_frames_ts;
static int forced_key_frames_number;
static int forced_key_frames_idx;

int parse_forced_key_frames(const m_option_t *opt, const char *arg)
{
    double ts;
    const char *p;
    int nts = 1, idx = 0, len;

    for (p = arg; *p; p++)
        nts += *p == ',';
    free(forced_key_frames_ts);
    forced_key_frames_ts = calloc(sizeof(*forced_key_frames_ts), nts);
    p = arg;
    while (1) {
        len = parse_timestring(p, &ts, ',');
        if (!len) {
            mp_msg(MSGT_CFGPARSER, MSGL_ERR,
                   "Option force-key-frames: invalid time: '%s'\n", p);
            return M_OPT_INVALID;
        }
        forced_key_frames_ts[idx++] = ts;
        if (!p[len])
            break;
        p += len + 1;
    }
    forced_key_frames_number = idx;
    forced_key_frames_idx = 0;
    for (idx = 1; idx < forced_key_frames_number; idx++) {
        if (forced_key_frames_ts[idx - 1] >= forced_key_frames_ts[idx]) {
            mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option force-key-frames: "
                   "timestamps are not in ascending order\n");
            return M_OPT_INVALID;
        }
    }
    return 0;
}

int is_forced_key_frame(double pts)
{
    if (forced_key_frames_idx < forced_key_frames_number &&
        pts >= forced_key_frames_ts[forced_key_frames_idx]) {
        forced_key_frames_idx++;
        if (forced_key_frames_idx >= forced_key_frames_number) {
            free(forced_key_frames_ts);
            forced_key_frames_number = 0;
        }
        return 1;
    }
    return 0;
}