FFmpeg
libmodplug.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 /**
20 * @file
21 * ModPlug demuxer
22 * @todo better probing than extensions matching
23 */
24 
25 #define MODPLUG_STATIC
26 #include <libmodplug/modplug.h>
27 #include "libavutil/avstring.h"
28 #include "libavutil/eval.h"
29 #include "libavutil/opt.h"
30 #include "avformat.h"
31 #include "internal.h"
32 
33 typedef struct ModPlugContext {
34  const AVClass *class;
35  ModPlugFile *f;
36  uint8_t *buf; ///< input file content
37 
38  /* options */
46 
47  int max_size; ///< max file size to allocate
48 
49  /* optional video stream */
50  double ts_per_packet; ///< used to define the pts/dts using packet_count;
51  int packet_count; ///< total number of audio packets
52  int print_textinfo; ///< bool flag for printing speed, tempo, order, ...
53  int video_stream; ///< 1 if the user want a video stream, otherwise 0
54  int w; ///< video stream width in char (one char = 8x8px)
55  int h; ///< video stream height in char (one char = 8x8px)
56  int video_switch; ///< 1 if current packet is video, otherwise 0
57  int fsize; ///< constant frame size
58  int linesize; ///< line size in bytes
59  char *color_eval; ///< color eval user input expression
60  AVExpr *expr; ///< parsed color eval expression
62 
63 static const char * const var_names[] = {
64  "x", "y",
65  "w", "h",
66  "t",
67  "speed", "tempo", "order", "pattern", "row",
68  NULL
69 };
70 
71 enum var_name {
77 };
78 
79 #define FF_MODPLUG_MAX_FILE_SIZE (100 * 1<<20) // 100M
80 #define FF_MODPLUG_DEF_FILE_SIZE ( 5 * 1<<20) // 5M
81 
82 #define OFFSET(x) offsetof(ModPlugContext, x)
83 #define D AV_OPT_FLAG_DECODING_PARAM
84 static const AVOption options[] = {
85  {"noise_reduction", "Enable noise reduction 0(off)-1(on)", OFFSET(noise_reduction), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, D},
86  {"reverb_depth", "Reverb level 0(quiet)-100(loud)", OFFSET(reverb_depth), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 100, D},
87  {"reverb_delay", "Reverb delay in ms, usually 40-200ms", OFFSET(reverb_delay), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, D},
88  {"bass_amount", "XBass level 0(quiet)-100(loud)", OFFSET(bass_amount), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 100, D},
89  {"bass_range", "XBass cutoff in Hz 10-100", OFFSET(bass_range), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 100, D},
90  {"surround_depth", "Surround level 0(quiet)-100(heavy)", OFFSET(surround_depth), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 100, D},
91  {"surround_delay", "Surround delay in ms, usually 5-40ms", OFFSET(surround_delay), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, D},
92  {"max_size", "Max file size supported (in bytes). Default is 5MB. Set to 0 for no limit (not recommended)",
94  {"video_stream_expr", "Color formula", OFFSET(color_eval), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, D},
95  {"video_stream", "Make demuxer output a video stream", OFFSET(video_stream), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, D},
96  {"video_stream_w", "Video stream width in char (one char = 8x8px)", OFFSET(w), AV_OPT_TYPE_INT, {.i64 = 30}, 20, 512, D},
97  {"video_stream_h", "Video stream height in char (one char = 8x8px)", OFFSET(h), AV_OPT_TYPE_INT, {.i64 = 30}, 20, 512, D},
98  {"video_stream_ptxt", "Print speed, tempo, order, ... in video stream", OFFSET(print_textinfo), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, D},
99  {NULL},
100 };
101 
102 #define SET_OPT_IF_REQUESTED(libopt, opt, flag) do { \
103  if (modplug->opt) { \
104  settings.libopt = modplug->opt; \
105  settings.mFlags |= flag; \
106  } \
107 } while (0)
108 
109 #define ADD_META_MULTIPLE_ENTRIES(entry_name, fname) do { \
110  if (n_## entry_name ##s) { \
111  unsigned i, n = 0; \
112  \
113  for (i = 0; i < n_## entry_name ##s; i++) { \
114  char item_name[64] = {0}; \
115  fname(f, i, item_name); \
116  if (!*item_name) \
117  continue; \
118  if (n) \
119  av_dict_set(&s->metadata, #entry_name, "\n", AV_DICT_APPEND); \
120  av_dict_set(&s->metadata, #entry_name, item_name, AV_DICT_APPEND); \
121  n++; \
122  } \
123  \
124  extra = av_asprintf(", %u/%u " #entry_name "%s", \
125  n, n_## entry_name ##s, n > 1 ? "s" : ""); \
126  if (!extra) \
127  return AVERROR(ENOMEM); \
128  av_dict_set(&s->metadata, "extra info", extra, AV_DICT_APPEND); \
129  av_free(extra); \
130  } \
131 } while (0)
132 
134 {
135  ModPlugContext *modplug = s->priv_data;
136  ModPlugFile *f = modplug->f;
137  char *extra;
138  const char *name = ModPlug_GetName(f);
139  const char *msg = ModPlug_GetMessage(f);
140 
141  unsigned n_instruments = ModPlug_NumInstruments(f);
142  unsigned n_samples = ModPlug_NumSamples(f);
143  unsigned n_patterns = ModPlug_NumPatterns(f);
144  unsigned n_channels = ModPlug_NumChannels(f);
145 
146  if (name && *name) av_dict_set(&s->metadata, "name", name, 0);
147  if (msg && *msg) av_dict_set(&s->metadata, "message", msg, 0);
148 
149  extra = av_asprintf("%u pattern%s, %u channel%s",
150  n_patterns, n_patterns > 1 ? "s" : "",
151  n_channels, n_channels > 1 ? "s" : "");
152  if (!extra)
153  return AVERROR(ENOMEM);
154  av_dict_set(&s->metadata, "extra info", extra, AV_DICT_DONT_STRDUP_VAL);
155 
156  ADD_META_MULTIPLE_ENTRIES(instrument, ModPlug_InstrumentName);
157  ADD_META_MULTIPLE_ENTRIES(sample, ModPlug_SampleName);
158 
159  return 0;
160 }
161 
162 #define AUDIO_PKT_SIZE 512
163 
165 {
166  AVStream *st;
167  AVIOContext *pb = s->pb;
168  ModPlug_Settings settings;
169  ModPlugContext *modplug = s->priv_data;
170  int64_t sz = avio_size(pb);
171 
172  if (sz < 0) {
173  av_log(s, AV_LOG_WARNING, "Could not determine file size\n");
174  sz = modplug->max_size;
175  } else if (modplug->max_size && sz > modplug->max_size) {
176  sz = modplug->max_size;
177  av_log(s, AV_LOG_WARNING, "Max file size reach%s, allocating %"PRIi64"B "
178  "but demuxing is likely to fail due to incomplete buffer\n",
179  sz == FF_MODPLUG_DEF_FILE_SIZE ? " (see -max_size)" : "", sz);
180  }
181 
182  if (modplug->color_eval) {
183  int r = av_expr_parse(&modplug->expr, modplug->color_eval, var_names,
184  NULL, NULL, NULL, NULL, 0, s);
185  if (r < 0)
186  return r;
187  }
188 
189  modplug->buf = av_malloc(modplug->max_size);
190  if (!modplug->buf)
191  return AVERROR(ENOMEM);
192  sz = avio_read(pb, modplug->buf, sz);
193 
194  ModPlug_GetSettings(&settings);
195  settings.mChannels = 2;
196  settings.mBits = 16;
197  settings.mFrequency = 44100;
198  settings.mResamplingMode = MODPLUG_RESAMPLE_FIR; // best quality
199  settings.mLoopCount = 0; // prevents looping forever
200 
201  if (modplug->noise_reduction) settings.mFlags |= MODPLUG_ENABLE_NOISE_REDUCTION;
202  SET_OPT_IF_REQUESTED(mReverbDepth, reverb_depth, MODPLUG_ENABLE_REVERB);
203  SET_OPT_IF_REQUESTED(mReverbDelay, reverb_delay, MODPLUG_ENABLE_REVERB);
204  SET_OPT_IF_REQUESTED(mBassAmount, bass_amount, MODPLUG_ENABLE_MEGABASS);
205  SET_OPT_IF_REQUESTED(mBassRange, bass_range, MODPLUG_ENABLE_MEGABASS);
206  SET_OPT_IF_REQUESTED(mSurroundDepth, surround_depth, MODPLUG_ENABLE_SURROUND);
207  SET_OPT_IF_REQUESTED(mSurroundDelay, surround_delay, MODPLUG_ENABLE_SURROUND);
208 
209  if (modplug->reverb_depth) settings.mReverbDepth = modplug->reverb_depth;
210  if (modplug->reverb_delay) settings.mReverbDelay = modplug->reverb_delay;
211  if (modplug->bass_amount) settings.mBassAmount = modplug->bass_amount;
212  if (modplug->bass_range) settings.mBassRange = modplug->bass_range;
213  if (modplug->surround_depth) settings.mSurroundDepth = modplug->surround_depth;
214  if (modplug->surround_delay) settings.mSurroundDelay = modplug->surround_delay;
215 
216  ModPlug_SetSettings(&settings);
217 
218  modplug->f = ModPlug_Load(modplug->buf, sz);
219  if (!modplug->f) {
220  av_freep(&modplug->buf);
221  return AVERROR_INVALIDDATA;
222  }
223  st = avformat_new_stream(s, NULL);
224  if (!st)
225  return AVERROR(ENOMEM);
226  avpriv_set_pts_info(st, 64, 1, 1000);
227  st->duration = ModPlug_GetLength(modplug->f);
230  st->codecpar->channels = settings.mChannels;
231  st->codecpar->sample_rate = settings.mFrequency;
232 
233  // timebase = 1/1000, 2ch 16bits 44.1kHz-> 2*2*44100
234  modplug->ts_per_packet = 1000*AUDIO_PKT_SIZE / (4*44100.);
235 
236  if (modplug->video_stream) {
237  AVStream *vst = avformat_new_stream(s, NULL);
238  if (!vst)
239  return AVERROR(ENOMEM);
240  avpriv_set_pts_info(vst, 64, 1, 1000);
241  vst->duration = st->duration;
244  vst->codecpar->width = modplug->w << 3;
245  vst->codecpar->height = modplug->h << 3;
246  modplug->linesize = modplug->w * 3;
247  modplug->fsize = modplug->linesize * modplug->h;
248  }
249 
250  return modplug_load_metadata(s);
251 }
252 
253 static void write_text(uint8_t *dst, const char *s, int linesize, int x, int y)
254 {
255  int i;
256  dst += y*linesize + x*3;
257  for (i = 0; s[i]; i++, dst += 3) {
258  dst[0] = 0x0; // count - 1
259  dst[1] = s[i]; // char
260  dst[2] = 0x0f; // background / foreground
261  }
262 }
263 
264 #define PRINT_INFO(line, name, idvalue) do { \
265  snprintf(intbuf, sizeof(intbuf), "%.0f", var_values[idvalue]); \
266  write_text(pkt->data, name ":", modplug->linesize, 0+1, line+1); \
267  write_text(pkt->data, intbuf, modplug->linesize, 10+1, line+1); \
268 } while (0)
269 
271 {
272  ModPlugContext *modplug = s->priv_data;
273 
274  if (modplug->video_stream) {
275  modplug->video_switch ^= 1; // one video packet for one audio packet
276  if (modplug->video_switch) {
277  double var_values[VAR_VARS_NB];
278 
279  var_values[VAR_W ] = modplug->w;
280  var_values[VAR_H ] = modplug->h;
281  var_values[VAR_TIME ] = modplug->packet_count * modplug->ts_per_packet;
282  var_values[VAR_SPEED ] = ModPlug_GetCurrentSpeed (modplug->f);
283  var_values[VAR_TEMPO ] = ModPlug_GetCurrentTempo (modplug->f);
284  var_values[VAR_ORDER ] = ModPlug_GetCurrentOrder (modplug->f);
285  var_values[VAR_PATTERN] = ModPlug_GetCurrentPattern(modplug->f);
286  var_values[VAR_ROW ] = ModPlug_GetCurrentRow (modplug->f);
287 
288  if (av_new_packet(pkt, modplug->fsize) < 0)
289  return AVERROR(ENOMEM);
290  pkt->stream_index = 1;
291  memset(pkt->data, 0, modplug->fsize);
292 
293  if (modplug->print_textinfo) {
294  char intbuf[32];
295  PRINT_INFO(0, "speed", VAR_SPEED);
296  PRINT_INFO(1, "tempo", VAR_TEMPO);
297  PRINT_INFO(2, "order", VAR_ORDER);
298  PRINT_INFO(3, "pattern", VAR_PATTERN);
299  PRINT_INFO(4, "row", VAR_ROW);
300  PRINT_INFO(5, "ts", VAR_TIME);
301  }
302 
303  if (modplug->expr) {
304  int x, y;
305  for (y = 0; y < modplug->h; y++) {
306  for (x = 0; x < modplug->w; x++) {
307  double color;
308  var_values[VAR_X] = x;
309  var_values[VAR_Y] = y;
310  color = av_expr_eval(modplug->expr, var_values, NULL);
311  pkt->data[y*modplug->linesize + x*3 + 2] |= av_clip((int)color, 0, 0xf)<<4;
312  }
313  }
314  }
315  pkt->pts = pkt->dts = var_values[VAR_TIME];
316  pkt->flags |= AV_PKT_FLAG_KEY;
317  return 0;
318  }
319  }
320 
321  if (av_new_packet(pkt, AUDIO_PKT_SIZE) < 0)
322  return AVERROR(ENOMEM);
323 
324  if (modplug->video_stream)
325  pkt->pts = pkt->dts = modplug->packet_count++ * modplug->ts_per_packet;
326 
327  pkt->size = ModPlug_Read(modplug->f, pkt->data, AUDIO_PKT_SIZE);
328  if (pkt->size <= 0) {
329  av_packet_unref(pkt);
330  return pkt->size == 0 ? AVERROR_EOF : AVERROR(EIO);
331  }
332  return 0;
333 }
334 
336 {
337  ModPlugContext *modplug = s->priv_data;
338  ModPlug_Unload(modplug->f);
339  av_freep(&modplug->buf);
340  return 0;
341 }
342 
343 static int modplug_read_seek(AVFormatContext *s, int stream_idx, int64_t ts, int flags)
344 {
345  ModPlugContext *modplug = s->priv_data;
346  ModPlug_Seek(modplug->f, (int)ts);
347  if (modplug->video_stream)
348  modplug->packet_count = ts / modplug->ts_per_packet;
349  return 0;
350 }
351 
352 static const char modplug_extensions[] = "669,abc,amf,ams,dbm,dmf,dsm,far,it,mdl,med,mid,mod,mt2,mtm,okt,psm,ptm,s3m,stm,ult,umx,xm,itgz,itr,itz,mdgz,mdr,mdz,s3gz,s3r,s3z,xmgz,xmr,xmz";
353 
354 static int modplug_probe(const AVProbeData *p)
355 {
357  if (p->buf_size < 16384)
358  return AVPROBE_SCORE_EXTENSION/2-1;
359  else
361  }
362  return 0;
363 }
364 
365 static const AVClass modplug_class = {
366  .class_name = "ModPlug demuxer",
367  .item_name = av_default_item_name,
368  .option = options,
369  .version = LIBAVUTIL_VERSION_INT,
370 };
371 
373  .name = "libmodplug",
374  .long_name = NULL_IF_CONFIG_SMALL("ModPlug demuxer"),
375  .priv_data_size = sizeof(ModPlugContext),
381  .extensions = modplug_extensions,
382  .priv_class = &modplug_class,
383 };
#define NULL
Definition: coverity.c:32
Bytestream IO Context.
Definition: avio.h:161
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
#define FF_MODPLUG_DEF_FILE_SIZE
Definition: libmodplug.c:80
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:339
int h
video stream height in char (one char = 8x8px)
Definition: libmodplug.c:55
AVOption.
Definition: opt.h:246
int linesize
line size in bytes
Definition: libmodplug.c:58
int fsize
constant frame size
Definition: libmodplug.c:57
static int modplug_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: libmodplug.c:270
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
const char * filename
Definition: avformat.h:447
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: utils.c:4929
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:153
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: avcodec.h:3968
int size
Definition: avcodec.h:1481
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191
int av_expr_parse(AVExpr **expr, const char *s, const char *const *const_names, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), int log_offset, void *log_ctx)
Parse an expression.
Definition: eval.c:683
static AVPacket pkt
#define sample
Format I/O context.
Definition: avformat.h:1358
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:72
AVInputFormat ff_libmodplug_demuxer
Definition: libmodplug.c:372
uint8_t
#define av_malloc(s)
static const char *const var_names[]
Definition: libmodplug.c:63
int width
Video only.
Definition: avcodec.h:4034
AVOptions.
static const uint32_t color[16+AV_CLASS_CATEGORY_NB]
Definition: log.c:92
int packet_count
total number of audio packets
Definition: libmodplug.c:51
Definition: eval.c:157
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
Definition: utils.c:4502
uint8_t * data
Definition: avcodec.h:1480
#define AVERROR_EOF
End of file.
Definition: error.h:55
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:145
int av_match_ext(const char *filename, const char *extensions)
Return a positive value if the given filename has one of the given extensions, 0 otherwise.
Definition: format.c:38
static const AVOption options[]
Definition: libmodplug.c:84
int video_stream
1 if the user want a video stream, otherwise 0
Definition: libmodplug.c:53
#define SET_OPT_IF_REQUESTED(libopt, opt, flag)
Definition: libmodplug.c:102
#define av_log(a,...)
static int modplug_load_metadata(AVFormatContext *s)
Definition: libmodplug.c:133
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:650
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: avcodec.h:1512
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: avpacket.c:86
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
int print_textinfo
bool flag for printing speed, tempo, order, ...
Definition: libmodplug.c:52
AVDictionary * metadata
Metadata that applies to the whole file.
Definition: avformat.h:1598
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:186
const char * r
Definition: vf_curves.c:114
enum AVMediaType codec_type
General type of the encoded data.
Definition: avcodec.h:3964
int surround_delay
Definition: libmodplug.c:45
int flags
A combination of AV_PKT_FLAG values.
Definition: avcodec.h:1486
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:449
char * av_asprintf(const char *fmt,...)
Definition: avstring.c:113
var_name
Definition: aeval.c:46
static const AVClass modplug_class
Definition: libmodplug.c:365
uint8_t * buf
input file content
Definition: libmodplug.c:36
#define FF_MODPLUG_MAX_FILE_SIZE
Definition: libmodplug.c:79
AVExpr * expr
parsed color eval expression
Definition: libmodplug.c:60
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that&#39;s been allocated with av_malloc() or another memory allocation functio...
Definition: dict.h:76
char * color_eval
color eval user input expression
Definition: libmodplug.c:59
#define D
Definition: libmodplug.c:83
#define s(width, name)
Definition: cbs_vp9.c:257
static int modplug_read_header(AVFormatContext *s)
Definition: libmodplug.c:164
static const char modplug_extensions[]
Definition: libmodplug.c:352
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:530
int video_switch
1 if current packet is video, otherwise 0
Definition: libmodplug.c:56
Stream structure.
Definition: avformat.h:881
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_reading.c:42
int noise_reduction
Definition: libmodplug.c:39
static void write_text(uint8_t *dst, const char *s, int linesize, int x, int y)
Definition: libmodplug.c:253
AVIOContext * pb
I/O context.
Definition: avformat.h:1400
int max_size
max file size to allocate
Definition: libmodplug.c:47
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:599
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:70
Describe the class of an AVClass context structure.
Definition: log.h:67
#define AVPROBE_SCORE_EXTENSION
score for file extension
Definition: avformat.h:456
This structure contains the data a format has to probe a file.
Definition: avformat.h:446
int w
video stream width in char (one char = 8x8px)
Definition: libmodplug.c:54
#define flags(name, subs,...)
Definition: cbs_av1.c:561
ModPlugFile * f
Definition: libmodplug.c:35
static int read_probe(const AVProbeData *pd)
Definition: jvdec.c:55
#define PRINT_INFO(line, name, idvalue)
Definition: libmodplug.c:264
int64_t duration
Decoding: duration of the stream, in stream time base.
Definition: avformat.h:930
int sample_rate
Audio only.
Definition: avcodec.h:4078
Main libavformat public API header.
static int modplug_probe(const AVProbeData *p)
Definition: libmodplug.c:354
int surround_depth
Definition: libmodplug.c:44
double ts_per_packet
used to define the pts/dts using packet_count;
Definition: libmodplug.c:50
#define AUDIO_PKT_SIZE
Definition: libmodplug.c:162
#define xf(width, name, var, range_min, range_max, subs,...)
Definition: cbs_av1.c:664
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
Evaluate a previously parsed expression.
Definition: eval.c:738
void * priv_data
Format private data.
Definition: avformat.h:1386
int channels
Audio only.
Definition: avcodec.h:4074
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
Definition: avcodec.h:1479
static int modplug_read_close(AVFormatContext *s)
Definition: libmodplug.c:335
#define OFFSET(x)
Definition: libmodplug.c:82
#define av_freep(p)
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:654
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:1028
int stream_index
Definition: avcodec.h:1482
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
#define ADD_META_MULTIPLE_ENTRIES(entry_name, fname)
Definition: libmodplug.c:109
This structure stores compressed data.
Definition: avcodec.h:1457
static int modplug_read_seek(AVFormatContext *s, int stream_idx, int64_t ts, int flags)
Definition: libmodplug.c:343
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: avcodec.h:1473
simple arithmetic expression evaluator
const char * name
Definition: opengl_enc.c:102