libavformat/dv.c
Go to the documentation of this file.
1 /*
2  * General DV muxer/demuxer
3  * Copyright (c) 2003 Roman Shaposhnik
4  *
5  * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
6  * of DV technical info.
7  *
8  * Raw DV format
9  * Copyright (c) 2002 Fabrice Bellard
10  *
11  * 50 Mbps (DVCPRO50) and 100 Mbps (DVCPRO HD) support
12  * Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com>
13  * Funded by BBC Research & Development
14  *
15  * This file is part of FFmpeg.
16  *
17  * FFmpeg is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  *
22  * FFmpeg is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25  * Lesser General Public License for more details.
26  *
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with FFmpeg; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31 #include <time.h>
32 #include "avformat.h"
33 #include "internal.h"
34 #include "libavcodec/dv_profile.h"
35 #include "libavcodec/dvdata.h"
37 #include "libavutil/intreadwrite.h"
38 #include "libavutil/mathematics.h"
39 #include "libavutil/timecode.h"
40 #include "dv.h"
41 #include "libavutil/avassert.h"
42 
44  const DVprofile* sys; /* Current DV profile. E.g.: 525/60, 625/50 */
49  uint8_t audio_buf[4][8192];
50  int ach;
51  int frames;
52  uint64_t abytes;
53 };
54 
55 static inline uint16_t dv_audio_12to16(uint16_t sample)
56 {
57  uint16_t shift, result;
58 
59  sample = (sample < 0x800) ? sample : sample | 0xf000;
60  shift = (sample & 0xf00) >> 8;
61 
62  if (shift < 0x2 || shift > 0xd) {
63  result = sample;
64  } else if (shift < 0x8) {
65  shift--;
66  result = (sample - (256 * shift)) << shift;
67  } else {
68  shift = 0xe - shift;
69  result = ((sample + ((256 * shift) + 1)) << shift) - 1;
70  }
71 
72  return result;
73 }
74 
75 /*
76  * This is the dumbest implementation of all -- it simply looks at
77  * a fixed offset and if pack isn't there -- fails. We might want
78  * to have a fallback mechanism for complete search of missing packs.
79  */
81 {
82  int offs;
83 
84  switch (t) {
85  case dv_audio_source:
86  offs = (80*6 + 80*16*3 + 3);
87  break;
88  case dv_audio_control:
89  offs = (80*6 + 80*16*4 + 3);
90  break;
91  case dv_video_control:
92  offs = (80*5 + 48 + 5);
93  break;
94  case dv_timecode:
95  offs = (80*1 + 3 + 3);
96  break;
97  default:
98  return NULL;
99  }
100 
101  return frame[offs] == t ? &frame[offs] : NULL;
102 }
103 
104 static const int dv_audio_frequency[3] = {
105  48000, 44100, 32000,
106 };
107 
108 /*
109  * There's a couple of assumptions being made here:
110  * 1. By default we silence erroneous (0x8000/16bit 0x800/12bit) audio samples.
111  * We can pass them upwards when libavcodec will be ready to deal with them.
112  * 2. We don't do software emphasis.
113  * 3. Audio is always returned as 16bit linear samples: 12bit nonlinear samples
114  * are converted into 16bit linear ones.
115  */
116 static int dv_extract_audio(uint8_t* frame, uint8_t* ppcm[4],
117  const DVprofile *sys)
118 {
119  int size, chan, i, j, d, of, smpls, freq, quant, half_ch;
120  uint16_t lc, rc;
121  const uint8_t* as_pack;
122  uint8_t *pcm, ipcm;
123 
124  as_pack = dv_extract_pack(frame, dv_audio_source);
125  if (!as_pack) /* No audio ? */
126  return 0;
127 
128  smpls = as_pack[1] & 0x3f; /* samples in this frame - min. samples */
129  freq = (as_pack[4] >> 3) & 0x07; /* 0 - 48kHz, 1 - 44,1kHz, 2 - 32kHz */
130  quant = as_pack[4] & 0x07; /* 0 - 16bit linear, 1 - 12bit nonlinear */
131 
132  if (quant > 1)
133  return -1; /* unsupported quantization */
134 
135  if (freq >= FF_ARRAY_ELEMS(dv_audio_frequency))
136  return AVERROR_INVALIDDATA;
137 
138  size = (sys->audio_min_samples[freq] + smpls) * 4; /* 2ch, 2bytes */
139  half_ch = sys->difseg_size / 2;
140 
141  /* We work with 720p frames split in half, thus even frames have
142  * channels 0,1 and odd 2,3. */
143  ipcm = (sys->height == 720 && !(frame[1] & 0x0C)) ? 2 : 0;
144 
145  if (ipcm + sys->n_difchan > (quant == 1 ? 2 : 4)) {
146  av_log(NULL, AV_LOG_ERROR, "too many dv pcm frames\n");
147  return AVERROR_INVALIDDATA;
148  }
149 
150  /* for each DIF channel */
151  for (chan = 0; chan < sys->n_difchan; chan++) {
152  av_assert0(ipcm<4);
153  pcm = ppcm[ipcm++];
154  if (!pcm)
155  break;
156 
157  /* for each DIF segment */
158  for (i = 0; i < sys->difseg_size; i++) {
159  frame += 6 * 80; /* skip DIF segment header */
160  if (quant == 1 && i == half_ch) {
161  /* next stereo channel (12bit mode only) */
162  av_assert0(ipcm<4);
163  pcm = ppcm[ipcm++];
164  if (!pcm)
165  break;
166  }
167 
168  /* for each AV sequence */
169  for (j = 0; j < 9; j++) {
170  for (d = 8; d < 80; d += 2) {
171  if (quant == 0) { /* 16bit quantization */
172  of = sys->audio_shuffle[i][j] + (d - 8) / 2 * sys->audio_stride;
173  if (of*2 >= size)
174  continue;
175 
176  pcm[of*2] = frame[d+1]; // FIXME: maybe we have to admit
177  pcm[of*2+1] = frame[d]; // that DV is a big-endian PCM
178  if (pcm[of*2+1] == 0x80 && pcm[of*2] == 0x00)
179  pcm[of*2+1] = 0;
180  } else { /* 12bit quantization */
181  lc = ((uint16_t)frame[d] << 4) |
182  ((uint16_t)frame[d+2] >> 4);
183  rc = ((uint16_t)frame[d+1] << 4) |
184  ((uint16_t)frame[d+2] & 0x0f);
185  lc = (lc == 0x800 ? 0 : dv_audio_12to16(lc));
186  rc = (rc == 0x800 ? 0 : dv_audio_12to16(rc));
187 
188  of = sys->audio_shuffle[i%half_ch][j] + (d - 8) / 3 * sys->audio_stride;
189  if (of*2 >= size)
190  continue;
191 
192  pcm[of*2] = lc & 0xff; // FIXME: maybe we have to admit
193  pcm[of*2+1] = lc >> 8; // that DV is a big-endian PCM
194  of = sys->audio_shuffle[i%half_ch+half_ch][j] +
195  (d - 8) / 3 * sys->audio_stride;
196  pcm[of*2] = rc & 0xff; // FIXME: maybe we have to admit
197  pcm[of*2+1] = rc >> 8; // that DV is a big-endian PCM
198  ++d;
199  }
200  }
201 
202  frame += 16 * 80; /* 15 Video DIFs + 1 Audio DIF */
203  }
204  }
205  }
206 
207  return size;
208 }
209 
211 {
212  const uint8_t* as_pack;
213  int freq, stype, smpls, quant, i, ach;
214 
215  as_pack = dv_extract_pack(frame, dv_audio_source);
216  if (!as_pack || !c->sys) { /* No audio ? */
217  c->ach = 0;
218  return 0;
219  }
220 
221  smpls = as_pack[1] & 0x3f; /* samples in this frame - min. samples */
222  freq = (as_pack[4] >> 3) & 0x07; /* 0 - 48kHz, 1 - 44,1kHz, 2 - 32kHz */
223  stype = (as_pack[3] & 0x1f); /* 0 - 2CH, 2 - 4CH, 3 - 8CH */
224  quant = as_pack[4] & 0x07; /* 0 - 16bit linear, 1 - 12bit nonlinear */
225 
226  if (freq >= FF_ARRAY_ELEMS(dv_audio_frequency)) {
228  "Unrecognized audio sample rate index (%d)\n", freq);
229  return 0;
230  }
231 
232  if (stype > 3) {
233  av_log(c->fctx, AV_LOG_ERROR, "stype %d is invalid\n", stype);
234  c->ach = 0;
235  return 0;
236  }
237 
238  /* note: ach counts PAIRS of channels (i.e. stereo channels) */
239  ach = ((int[4]){ 1, 0, 2, 4})[stype];
240  if (ach == 1 && quant && freq == 2)
241  ach = 2;
242 
243  /* Dynamic handling of the audio streams in DV */
244  for (i = 0; i < ach; i++) {
245  if (!c->ast[i]) {
246  c->ast[i] = avformat_new_stream(c->fctx, NULL);
247  if (!c->ast[i])
248  break;
249  avpriv_set_pts_info(c->ast[i], 64, 1, 30000);
252 
253  av_init_packet(&c->audio_pkt[i]);
254  c->audio_pkt[i].size = 0;
255  c->audio_pkt[i].data = c->audio_buf[i];
256  c->audio_pkt[i].stream_index = c->ast[i]->index;
258  }
259  c->ast[i]->codec->sample_rate = dv_audio_frequency[freq];
260  c->ast[i]->codec->channels = 2;
262  c->ast[i]->codec->bit_rate = 2 * dv_audio_frequency[freq] * 16;
263  c->ast[i]->start_time = 0;
264  }
265  c->ach = i;
266 
267  return (c->sys->audio_min_samples[freq] + smpls) * 4; /* 2ch, 2bytes */;
268 }
269 
271 {
272  const uint8_t* vsc_pack;
273  AVCodecContext* avctx;
274  int apt, is16_9;
275  int size = 0;
276 
277  if (c->sys) {
278  avctx = c->vst->codec;
279 
281  c->sys->time_base.den);
282  avctx->time_base= c->sys->time_base;
283 
284  /* finding out SAR is a little bit messy */
285  vsc_pack = dv_extract_pack(frame, dv_video_control);
286  apt = frame[4] & 0x07;
287  is16_9 = (vsc_pack && ((vsc_pack[2] & 0x07) == 0x02 ||
288  (!apt && (vsc_pack[2] & 0x07) == 0x07)));
289  c->vst->sample_aspect_ratio = c->sys->sar[is16_9];
290  avctx->bit_rate = av_rescale_q(c->sys->frame_size, (AVRational){8,1},
291  c->sys->time_base);
292  size = c->sys->frame_size;
293  }
294  return size;
295 }
296 
298 {
299  const uint8_t *tc_pack;
300 
301  // For PAL systems, drop frame bit is replaced by an arbitrary
302  // bit so its value should not be considered. Drop frame timecode
303  // is only relevant for NTSC systems.
304  int prevent_df = c->sys->ltc_divisor == 25 || c->sys->ltc_divisor == 50;
305 
306  tc_pack = dv_extract_pack(frame, dv_timecode);
307  if (!tc_pack)
308  return 0;
309  av_timecode_make_smpte_tc_string(tc, AV_RB32(tc_pack + 1), prevent_df);
310  return 1;
311 }
312 
313 /*
314  * The following 3 functions constitute our interface to the world
315  */
316 
318 {
319  DVDemuxContext *c;
320 
321  c = av_mallocz(sizeof(DVDemuxContext));
322  if (!c)
323  return NULL;
324 
325  c->vst = avformat_new_stream(s, NULL);
326  if (!c->vst) {
327  av_free(c);
328  return NULL;
329  }
330 
331  c->fctx = s;
334  c->vst->codec->bit_rate = 25000000;
335  c->vst->start_time = 0;
336 
337  return c;
338 }
339 
341 {
342  int size = -1;
343  int i;
344 
345  for (i = 0; i < c->ach; i++) {
346  if (c->ast[i] && c->audio_pkt[i].size) {
347  *pkt = c->audio_pkt[i];
348  c->audio_pkt[i].size = 0;
349  size = pkt->size;
350  break;
351  }
352  }
353 
354  return size;
355 }
356 
358  uint8_t* buf, int buf_size, int64_t pos)
359 {
360  int size, i;
361  uint8_t *ppcm[4] = {0};
362 
363  if (buf_size < DV_PROFILE_BYTES ||
364  !(c->sys = avpriv_dv_frame_profile(c->sys, buf, buf_size)) ||
365  buf_size < c->sys->frame_size) {
366  return -1; /* Broken frame, or not enough data */
367  }
368 
369  /* Queueing audio packet */
370  /* FIXME: in case of no audio/bad audio we have to do something */
371  size = dv_extract_audio_info(c, buf);
372  for (i = 0; i < c->ach; i++) {
373  c->audio_pkt[i].pos = pos;
374  c->audio_pkt[i].size = size;
375  c->audio_pkt[i].pts = c->abytes * 30000 * 8 / c->ast[i]->codec->bit_rate;
376  ppcm[i] = c->audio_buf[i];
377  }
378  if (c->ach)
379  dv_extract_audio(buf, ppcm, c->sys);
380 
381  /* We work with 720p frames split in half, thus even frames have
382  * channels 0,1 and odd 2,3. */
383  if (c->sys->height == 720) {
384  if (buf[1] & 0x0C) {
385  c->audio_pkt[2].size = c->audio_pkt[3].size = 0;
386  } else {
387  c->audio_pkt[0].size = c->audio_pkt[1].size = 0;
388  c->abytes += size;
389  }
390  } else {
391  c->abytes += size;
392  }
393 
394  /* Now it's time to return video packet */
395  size = dv_extract_video_info(c, buf);
396  av_init_packet(pkt);
397  pkt->data = buf;
398  pkt->pos = pos;
399  pkt->size = size;
400  pkt->flags |= AV_PKT_FLAG_KEY;
401  pkt->stream_index = c->vst->index;
402  pkt->pts = c->frames;
403 
404  c->frames++;
405 
406  return size;
407 }
408 
410  int64_t timestamp, int flags)
411 {
412  // FIXME: sys may be wrong if last dv_read_packet() failed (buffer is junk)
414  int64_t offset;
415  int64_t size = avio_size(s->pb) - s->data_offset;
416  int64_t max_offset = ((size-1) / sys->frame_size) * sys->frame_size;
417 
418  offset = sys->frame_size * timestamp;
419 
420  if (size >= 0 && offset > max_offset) offset = max_offset;
421  else if (offset < 0) offset = 0;
422 
423  return offset + s->data_offset;
424 }
425 
426 void ff_dv_offset_reset(DVDemuxContext *c, int64_t frame_offset)
427 {
428  c->frames= frame_offset;
429  if (c->ach) {
430  if (c->sys) {
431  c->abytes= av_rescale_q(c->frames, c->sys->time_base,
432  (AVRational){8, c->ast[0]->codec->bit_rate});
433  }else
434  av_log(c->fctx, AV_LOG_ERROR, "cannot adjust audio bytes\n");
435  }
436  c->audio_pkt[0].size = c->audio_pkt[1].size = 0;
437  c->audio_pkt[2].size = c->audio_pkt[3].size = 0;
438 }
439 
440 /************************************************************
441  * Implementation of the easiest DV storage of all -- raw DV.
442  ************************************************************/
443 
444 typedef struct RawDVContext {
447 } RawDVContext;
448 
450  int ret;
451  char timecode[AV_TIMECODE_STR_SIZE];
452  int64_t pos = avio_tell(s->pb);
453 
454  // Read 3 DIF blocks: Header block and 2 Subcode blocks.
455  int partial_frame_size = 3 * 80;
456  uint8_t *partial_frame = av_mallocz(sizeof(*partial_frame) *
457  partial_frame_size);
458 
459  RawDVContext *c = s->priv_data;
460  ret = avio_read(s->pb, partial_frame, partial_frame_size);
461  if (ret < 0)
462  goto finish;
463 
464  if (ret < partial_frame_size) {
465  ret = -1;
466  goto finish;
467  }
468 
469  ret = dv_extract_timecode(c->dv_demux, partial_frame, timecode);
470  if (ret)
471  av_dict_set(&s->metadata, "timecode", timecode, 0);
472  else
473  av_log(s, AV_LOG_ERROR, "Detected timecode is invalid\n");
474 
475 finish:
476  av_free(partial_frame);
477  avio_seek(s->pb, pos, SEEK_SET);
478  return ret;
479 }
480 
482 {
483  unsigned state, marker_pos = 0;
484  RawDVContext *c = s->priv_data;
485 
487  if (!c->dv_demux)
488  return -1;
489 
490  state = avio_rb32(s->pb);
491  while ((state & 0xffffff7f) != 0x1f07003f) {
492  if (url_feof(s->pb)) {
493  av_log(s, AV_LOG_ERROR, "Cannot find DV header.\n");
494  return -1;
495  }
496  if (state == 0x003f0700 || state == 0xff3f0700)
497  marker_pos = avio_tell(s->pb);
498  if (state == 0xff3f0701 && avio_tell(s->pb) - marker_pos == 80) {
499  avio_seek(s->pb, -163, SEEK_CUR);
500  state = avio_rb32(s->pb);
501  break;
502  }
503  state = (state << 8) | avio_r8(s->pb);
504  }
505  AV_WB32(c->buf, state);
506 
507  if (avio_read(s->pb, c->buf + 4, DV_PROFILE_BYTES - 4) != DV_PROFILE_BYTES - 4 ||
508  avio_seek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0)
509  return AVERROR(EIO);
510 
512  if (!c->dv_demux->sys) {
513  av_log(s, AV_LOG_ERROR, "Can't determine profile of DV input stream.\n");
514  return -1;
515  }
516 
518  c->dv_demux->sys->time_base);
519 
520  if (s->pb->seekable)
521  dv_read_timecode(s);
522 
523  return 0;
524 }
525 
526 
528 {
529  int size;
530  RawDVContext *c = s->priv_data;
531 
532  size = avpriv_dv_get_packet(c->dv_demux, pkt);
533 
534  if (size < 0) {
535  int64_t pos = avio_tell(s->pb);
536  if (!c->dv_demux->sys)
537  return AVERROR(EIO);
538  size = c->dv_demux->sys->frame_size;
539  if (avio_read(s->pb, c->buf, size) <= 0)
540  return AVERROR(EIO);
541 
542  size = avpriv_dv_produce_packet(c->dv_demux, pkt, c->buf, size, pos);
543  }
544 
545  return size;
546 }
547 
548 static int dv_read_seek(AVFormatContext *s, int stream_index,
549  int64_t timestamp, int flags)
550 {
551  RawDVContext *r = s->priv_data;
552  DVDemuxContext *c = r->dv_demux;
553  int64_t offset = dv_frame_offset(s, c, timestamp, flags);
554 
555  if (avio_seek(s->pb, offset, SEEK_SET) < 0)
556  return -1;
557 
558  ff_dv_offset_reset(c, offset / c->sys->frame_size);
559  return 0;
560 }
561 
563 {
564  RawDVContext *c = s->priv_data;
565  av_free(c->dv_demux);
566  return 0;
567 }
568 
569 static int dv_probe(AVProbeData *p)
570 {
571  unsigned state, marker_pos = 0;
572  int i;
573  int matches = 0;
574  int secondary_matches = 0;
575 
576  if (p->buf_size < 5)
577  return 0;
578 
579  state = AV_RB32(p->buf);
580  for (i = 4; i < p->buf_size; i++) {
581  if ((state & 0xffffff7f) == 0x1f07003f)
582  matches++;
583  // any section header, also with seq/chan num != 0,
584  // should appear around every 12000 bytes, at least 10 per frame
585  if ((state & 0xff07ff7f) == 0x1f07003f)
586  secondary_matches++;
587  if (state == 0x003f0700 || state == 0xff3f0700)
588  marker_pos = i;
589  if (state == 0xff3f0701 && i - marker_pos == 80)
590  matches++;
591  state = (state << 8) | p->buf[i];
592  }
593 
594  if (matches && p->buf_size / matches < 1024*1024) {
595  if (matches > 4 || (secondary_matches >= 10 && p->buf_size / secondary_matches < 24000))
596  return AVPROBE_SCORE_MAX*3/4; // not max to avoid dv in mov to match
597  return AVPROBE_SCORE_MAX/4;
598  }
599  return 0;
600 }
601 
602 #if CONFIG_DV_DEMUXER
603 AVInputFormat ff_dv_demuxer = {
604  .name = "dv",
605  .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
606  .priv_data_size = sizeof(RawDVContext),
607  .read_probe = dv_probe,
612  .extensions = "dv,dif",
613 };
614 #endif
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
const char * s
Definition: avisynth_c.h:668
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:261
static int shift(int a, int b)
Definition: sonic.c:86
static int dv_extract_audio_info(DVDemuxContext *c, uint8_t *frame)
static int dv_read_timecode(AVFormatContext *s)
static const int dv_audio_frequency[3]
int64_t pos
byte position in stream, -1 if unknown
static int dv_read_header(AVFormatContext *s)
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.
#define DV_MAX_FRAME_SIZE
largest possible DV frame, in bytes (1080i50)
Definition: dvdata.h:89
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:153
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:709
int num
numerator
Definition: rational.h:44
int index
stream index in AVFormatContext
Definition: avformat.h:644
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:199
#define tc
Definition: regdef.h:69
AVRational sar[2]
Definition: dv_profile.h:53
#define FF_ARRAY_ELEMS(a)
int64_t data_offset
offset of the first packet
Definition: avformat.h:1242
AVFormatContext * fctx
Timecode helpers header.
#define AV_CH_LAYOUT_STEREO
#define sample
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
set threshold d
initialize output if(nPeaks >3)%at least 3 peaks in spectrum for trying to find f0 nf0peaks
Format I/O context.
Definition: avformat.h:944
static int dv_read_close(AVFormatContext *s)
#define AV_WB32(p, darg)
Definition: intreadwrite.h:265
uint8_t audio_buf[4][8192]
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
uint8_t
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:610
#define AV_RB32
static AVPacket pkt
Definition: demuxing.c:56
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
DVDemuxContext * avpriv_dv_init_demux(AVFormatContext *s)
uint8_t * data
AVPacket audio_pkt[4]
AVStream * ast[4]
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:145
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:248
int audio_stride
Definition: dv_profile.h:59
#define AV_TIMECODE_STR_SIZE
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:478
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
frame
Definition: stft.m:14
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:130
AVDictionary * metadata
Definition: avformat.h:1092
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
int height
Definition: dv_profile.h:51
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
const char * r
Definition: vf_curves.c:94
simple assert() macros that are a bit more flexible than ISO C assert().
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
static const uint8_t * dv_extract_pack(uint8_t *frame, enum dv_pack_type t)
static const uint8_t offset[127][2]
Definition: vf_spp.c:70
int n_difchan
Definition: dv_profile.h:48
int size
int flags
A combination of AV_PKT_FLAG values.
uint64_t channel_layout
Audio channel layout.
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:469
int difseg_size
Definition: dv_profile.h:47
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:337
AVRational time_base
Definition: dv_profile.h:49
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:336
const DVprofile * avpriv_dv_codec_profile(AVCodecContext *codec)
Definition: dv_profile.c:329
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:117
int bit_rate
the average bitrate
audio channel layout utility functions
void ff_dv_offset_reset(DVDemuxContext *c, int64_t frame_offset)
static int read_probe(AVProbeData *pd)
ret
Definition: avfilter.c:821
dv_pack_type
Definition: dvdata.h:57
t
Definition: genspecsines3.m:6
static int dv_extract_timecode(DVDemuxContext *c, uint8_t *frame, char *tc)
int frame_size
Definition: dv_profile.h:46
DVDemuxContext * dv_demux
int url_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
Definition: aviobuf.c:280
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:517
Stream structure.
Definition: avformat.h:643
int audio_min_samples[3]
Definition: dv_profile.h:60
NULL
Definition: eval.c:55
enum AVMediaType codec_type
int avpriv_dv_produce_packet(DVDemuxContext *c, AVPacket *pkt, uint8_t *buf, int buf_size, int64_t pos)
enum AVCodecID codec_id
int sample_rate
samples per second
AVIOContext * pb
I/O context.
Definition: avformat.h:977
main external API structure.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
void * buf
Definition: avisynth_c.h:594
static int read_packet(AVFormatContext *ctx, AVPacket *pkt)
Definition: libcdio.c:114
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:62
synthesis window for stochastic i
rational number numerator/denominator
Definition: rational.h:43
#define DV_PROFILE_BYTES
Definition: dv_profile.h:30
static int dv_probe(AVProbeData *p)
This structure contains the data a format has to probe a file.
Definition: avformat.h:334
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer 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.Buffer references ownership and permissions
const DVprofile * sys
static int dv_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
const uint8_t * quant
static uint32_t state
Definition: trasher.c:27
static int flags
Definition: cpu.c:23
#define AVPROBE_SCORE_MAX
maximum score, half of that is used for file-extension-based detection
Definition: avformat.h:340
Main libavformat public API header.
const uint8_t(* audio_shuffle)[9]
Definition: dv_profile.h:64
int64_t start_time
Decoding: pts of the first frame of the stream in presentation order, in stream time base...
Definition: avformat.h:689
static double c[64]
static uint16_t dv_audio_12to16(uint16_t sample)
uint8_t buf[DV_MAX_FRAME_SIZE]
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
Definition: avpacket.c:56
int den
denominator
Definition: rational.h:45
int avpriv_dv_get_packet(DVDemuxContext *c, AVPacket *pkt)
Constants for DV codec.
int ltc_divisor
Definition: dv_profile.h:50
char * av_timecode_make_smpte_tc_string(char *buf, uint32_t tcsmpte, int prevent_df)
Get the timecode string from the SMPTE timecode format.
int channels
number of audio channels
void * priv_data
Format private data.
Definition: avformat.h:964
const DVprofile * avpriv_dv_frame_profile(const DVprofile *sys, const uint8_t *frame, unsigned buf_size)
Definition: dv_profile.c:323
static int64_t dv_frame_offset(AVFormatContext *s, DVDemuxContext *c, int64_t timestamp, int flags)
AVStream * vst
int bit_rate
Decoding: total stream bitrate in bit/s, 0 if not available.
Definition: avformat.h:1016
static int dv_read_packet(AVFormatContext *s, AVPacket *pkt)
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:461
static int dv_extract_audio(uint8_t *frame, uint8_t *ppcm[4], const DVprofile *sys)
struct RawDVContext RawDVContext
This structure stores compressed data.
static int dv_extract_video_info(DVDemuxContext *c, uint8_t *frame)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...