FFmpeg
dv.c
Go to the documentation of this file.
1 /*
2  * General DV 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 
32 #include "config_components.h"
33 
34 #include <time.h>
35 #include "avformat.h"
36 #include "avio_internal.h"
37 #include "demux.h"
38 #include "internal.h"
39 #include "libavcodec/dv_profile.h"
40 #include "libavcodec/dv.h"
42 #include "libavutil/intreadwrite.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/mem.h"
45 #include "libavutil/timecode.h"
46 #include "dv.h"
47 #include "libavutil/avassert.h"
48 
49 #if CONFIG_DV_DEMUXER
50 
51 // Must be kept in sync with AVPacket
52 typedef struct DVPacket {
53  int64_t pts;
54  uint8_t *data;
55  int size;
56  int stream_index;
57  int flags;
58  int64_t pos;
60 
61  int sample_rate;
62  int last_sample_rate;
63 } DVPacket;
64 
65 struct DVDemuxContext {
66  const AVDVProfile* sys; /* Current DV profile. E.g.: 525/60, 625/50 */
67  AVFormatContext* fctx;
68  AVStream* vst;
69  AVStream* ast[4];
70  struct DVPacket audio_pkt[4];
71  uint8_t audio_buf[4][8192];
72  int ach;
73  int frames;
74 
75  int64_t next_pts_video;
76  int64_t next_pts_audio;
77 };
78 
79 static inline uint16_t dv_audio_12to16(uint16_t sample)
80 {
81  uint16_t shift, result;
82 
83  sample = (sample < 0x800) ? sample : sample | 0xf000;
84  shift = (sample & 0xf00) >> 8;
85 
86  if (shift < 0x2 || shift > 0xd) {
87  result = sample;
88  } else if (shift < 0x8) {
89  shift--;
90  result = (sample - (256 * shift)) << shift;
91  } else {
92  shift = 0xe - shift;
93  result = ((sample + ((256 * shift) + 1)) << shift) - 1;
94  }
95 
96  return result;
97 }
98 
99 static const uint8_t *dv_extract_pack(const uint8_t *frame, enum DVPackType t)
100 {
101  int offs;
102  int c;
103 
104  for (c = 0; c < 10; c++) {
105  switch (t) {
106  case DV_AUDIO_SOURCE:
107  if (c&1) offs = (80 * 6 + 80 * 16 * 0 + 3 + c*12000);
108  else offs = (80 * 6 + 80 * 16 * 3 + 3 + c*12000);
109  break;
110  case DV_AUDIO_CONTROL:
111  if (c&1) offs = (80 * 6 + 80 * 16 * 1 + 3 + c*12000);
112  else offs = (80 * 6 + 80 * 16 * 4 + 3 + c*12000);
113  break;
114  case DV_VIDEO_CONTROL:
115  if (c&1) offs = (80 * 3 + 8 + c*12000);
116  else offs = (80 * 5 + 48 + 5 + c*12000);
117  break;
118  case DV_TIMECODE:
119  offs = (80*1 + 3 + 3);
120  break;
121  default:
122  return NULL;
123  }
124  if (frame[offs] == t)
125  break;
126  }
127 
128  return frame[offs] == t ? &frame[offs] : NULL;
129 }
130 
131 static const int dv_audio_frequency[3] = {
132  48000, 44100, 32000,
133 };
134 
135 /*
136  * There's a couple of assumptions being made here:
137  * 1. By default we silence erroneous (0x8000/16-bit 0x800/12-bit) audio samples.
138  * We can pass them upwards when libavcodec will be ready to deal with them.
139  * 2. We don't do software emphasis.
140  * 3. Audio is always returned as 16-bit linear samples: 12-bit nonlinear samples
141  * are converted into 16-bit linear ones.
142  */
143 static int dv_extract_audio(const uint8_t *frame, uint8_t **ppcm,
144  const AVDVProfile *sys)
145 {
146  int size, chan, i, j, d, of, smpls, freq, quant, half_ch;
147  uint16_t lc, rc;
148  const uint8_t *as_pack;
149  uint8_t *pcm, ipcm;
150 
151  as_pack = dv_extract_pack(frame, DV_AUDIO_SOURCE);
152  if (!as_pack) /* No audio ? */
153  return 0;
154 
155  smpls = as_pack[1] & 0x3f; /* samples in this frame - min. samples */
156  freq = as_pack[4] >> 3 & 0x07; /* 0 - 48kHz, 1 - 44,1kHz, 2 - 32kHz */
157  quant = as_pack[4] & 0x07; /* 0 - 16-bit linear, 1 - 12-bit nonlinear */
158 
159  if (quant > 1)
160  return -1; /* unsupported quantization */
161 
162  if (freq >= FF_ARRAY_ELEMS(dv_audio_frequency))
163  return AVERROR_INVALIDDATA;
164 
165  size = (sys->audio_min_samples[freq] + smpls) * 4; /* 2ch, 2bytes */
166  half_ch = sys->difseg_size / 2;
167 
168  /* We work with 720p frames split in half, thus even frames have
169  * channels 0,1 and odd 2,3. */
170  ipcm = (sys->height == 720 && !(frame[1] & 0x0C)) ? 2 : 0;
171 
172  if (ipcm + sys->n_difchan > (quant == 1 ? 2 : 4)) {
173  av_log(NULL, AV_LOG_ERROR, "too many dv pcm frames\n");
174  return AVERROR_INVALIDDATA;
175  }
176 
177  /* for each DIF channel */
178  for (chan = 0; chan < sys->n_difchan; chan++) {
179  av_assert0(ipcm<4);
180  pcm = ppcm[ipcm++];
181  if (!pcm)
182  break;
183 
184  /* for each DIF segment */
185  for (i = 0; i < sys->difseg_size; i++) {
186  frame += 6 * 80; /* skip DIF segment header */
187  if (quant == 1 && i == half_ch) {
188  /* next stereo channel (12-bit mode only) */
189  av_assert0(ipcm<4);
190  pcm = ppcm[ipcm++];
191  if (!pcm)
192  break;
193  }
194 
195  /* for each AV sequence */
196  for (j = 0; j < 9; j++) {
197  for (d = 8; d < 80; d += 2) {
198  if (quant == 0) { /* 16-bit quantization */
199  of = sys->audio_shuffle[i][j] +
200  (d - 8) / 2 * sys->audio_stride;
201  if (of * 2 >= size)
202  continue;
203 
204  /* FIXME: maybe we have to admit that DV is a
205  * big-endian PCM */
206  pcm[of * 2] = frame[d + 1];
207  pcm[of * 2 + 1] = frame[d];
208 
209  if (pcm[of * 2 + 1] == 0x80 && pcm[of * 2] == 0x00)
210  pcm[of * 2 + 1] = 0;
211  } else { /* 12-bit quantization */
212  lc = ((uint16_t)frame[d] << 4) |
213  ((uint16_t)frame[d + 2] >> 4);
214  rc = ((uint16_t)frame[d + 1] << 4) |
215  ((uint16_t)frame[d + 2] & 0x0f);
216  lc = (lc == 0x800 ? 0 : dv_audio_12to16(lc));
217  rc = (rc == 0x800 ? 0 : dv_audio_12to16(rc));
218 
219  of = sys->audio_shuffle[i % half_ch][j] +
220  (d - 8) / 3 * sys->audio_stride;
221  if (of * 2 >= size)
222  continue;
223 
224  /* FIXME: maybe we have to admit that DV is a
225  * big-endian PCM */
226  pcm[of * 2] = lc & 0xff;
227  pcm[of * 2 + 1] = lc >> 8;
228  of = sys->audio_shuffle[i % half_ch + half_ch][j] +
229  (d - 8) / 3 * sys->audio_stride;
230  /* FIXME: maybe we have to admit that DV is a
231  * big-endian PCM */
232  pcm[of * 2] = rc & 0xff;
233  pcm[of * 2 + 1] = rc >> 8;
234  ++d;
235  }
236  }
237 
238  frame += 16 * 80; /* 15 Video DIFs + 1 Audio DIF */
239  }
240  }
241  }
242 
243  return size;
244 }
245 
246 static int dv_extract_audio_info(DVDemuxContext *c, const uint8_t *frame)
247 {
248  const uint8_t *as_pack;
249  int freq, stype, smpls, quant, i, ach, sr;
250 
251  as_pack = dv_extract_pack(frame, DV_AUDIO_SOURCE);
252  if (!as_pack || !c->sys) { /* No audio ? */
253  c->ach = 0;
254  return 0;
255  }
256 
257  smpls = as_pack[1] & 0x3f; /* samples in this frame - min. samples */
258  freq = as_pack[4] >> 3 & 0x07; /* 0 - 48kHz, 1 - 44,1kHz, 2 - 32kHz */
259  stype = as_pack[3] & 0x1f; /* 0 - 2CH, 2 - 4CH, 3 - 8CH */
260  quant = as_pack[4] & 0x07; /* 0 - 16-bit linear, 1 - 12-bit nonlinear */
261 
262  if (freq >= FF_ARRAY_ELEMS(dv_audio_frequency)) {
263  av_log(c->fctx, AV_LOG_ERROR,
264  "Unrecognized audio sample rate index (%d)\n", freq);
265  return 0;
266  }
267  sr = dv_audio_frequency[freq];
268 
269  if (stype > 3) {
270  av_log(c->fctx, AV_LOG_ERROR, "stype %d is invalid\n", stype);
271  c->ach = 0;
272  return 0;
273  }
274 
275  /* note: ach counts PAIRS of channels (i.e. stereo channels) */
276  ach = ((int[4]) { 1, 0, 2, 4 })[stype];
277  if (ach == 1 && quant && freq == 2)
278  ach = 2;
279 
280  /* Dynamic handling of the audio streams in DV */
281  c->ach = 0;
282  for (i = 0; i < ach; i++) {
283  if (!c->ast[i]) {
284  c->ast[i] = avformat_new_stream(c->fctx, NULL);
285  if (!c->ast[i])
286  return AVERROR(ENOMEM);
287 
288  avpriv_set_pts_info(c->ast[i], 64, 1, DV_TIMESCALE_AUDIO);
289  c->ast[i]->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
290  c->ast[i]->codecpar->codec_id = AV_CODEC_ID_PCM_S16LE;
291  c->ast[i]->codecpar->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO;
292  c->ast[i]->start_time = 0;
293  c->ast[i]->codecpar->bit_rate = 2 * sr * 16;
294 
295  c->ast[i]->codecpar->sample_rate = sr;
296  c->audio_pkt[i].last_sample_rate = sr;
297 
298  c->audio_pkt[i].size = 0;
299  c->audio_pkt[i].data = c->audio_buf[i];
300  c->audio_pkt[i].stream_index = c->ast[i]->index;
301  c->audio_pkt[i].flags |= AV_PKT_FLAG_KEY;
302  c->audio_pkt[i].pts = AV_NOPTS_VALUE;
303  c->audio_pkt[i].duration = 0;
304  c->audio_pkt[i].pos = -1;
305  }
306 
307  c->audio_pkt[i].sample_rate = sr;
308  }
309  c->ach = ach;
310 
311  return (c->sys->audio_min_samples[freq] + smpls) * 4; /* 2ch, 2bytes */
312 }
313 
314 static int dv_extract_video_info(DVDemuxContext *c, const uint8_t *frame)
315 {
316  const uint8_t *vsc_pack;
317  AVCodecParameters *par;
318  int apt, is16_9;
319 
320  par = c->vst->codecpar;
321 
322  c->vst->avg_frame_rate = av_inv_q(c->vst->time_base);
323 
324  /* finding out SAR is a little bit messy */
325  vsc_pack = dv_extract_pack(frame, DV_VIDEO_CONTROL);
326  apt = frame[4] & 0x07;
327  is16_9 = (vsc_pack && ((vsc_pack[2] & 0x07) == 0x02 ||
328  (!apt && (vsc_pack[2] & 0x07) == 0x07)));
329  c->vst->sample_aspect_ratio = c->sys->sar[is16_9];
330  par->bit_rate = av_rescale_q(c->sys->frame_size,
331  (AVRational) { 8, 1 },
332  c->sys->time_base);
333  return c->sys->frame_size;
334 }
335 
336 static int dv_extract_timecode(DVDemuxContext* c, const uint8_t* frame, char *tc)
337 {
338  const uint8_t *tc_pack;
339 
340  // For PAL systems, drop frame bit is replaced by an arbitrary
341  // bit so its value should not be considered. Drop frame timecode
342  // is only relevant for NTSC systems.
343  int prevent_df = c->sys->ltc_divisor == 25 || c->sys->ltc_divisor == 50;
344 
345  tc_pack = dv_extract_pack(frame, DV_TIMECODE);
346  if (!tc_pack)
347  return 0;
348  av_timecode_make_smpte_tc_string2(tc, av_inv_q(c->sys->time_base), AV_RB32(tc_pack + 1), prevent_df, 1);
349  return 1;
350 }
351 
352 /* The following 3 functions constitute our interface to the world */
353 
354 static int dv_init_demux(AVFormatContext *s, DVDemuxContext *c)
355 {
356  c->vst = avformat_new_stream(s, NULL);
357  if (!c->vst)
358  return AVERROR(ENOMEM);
359 
360  c->fctx = s;
361  c->vst->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
362  c->vst->codecpar->codec_id = AV_CODEC_ID_DVVIDEO;
363  c->vst->start_time = 0;
364 
366 
367  /* Audio streams are added later as they are encountered. */
368  s->ctx_flags |= AVFMTCTX_NOHEADER;
369 
370  return 0;
371 }
372 
374 {
375  DVDemuxContext *c;
376 
377  c = av_mallocz(sizeof(DVDemuxContext));
378  if (!c)
379  return NULL;
380 
381  if (dv_init_demux(s, c)) {
382  av_free(c);
383  return NULL;
384  }
385 
386  return c;
387 }
388 
390 {
391  int size = -1;
392  int i;
393 
394  for (i = 0; i < c->ach; i++) {
395  if (c->ast[i] && c->audio_pkt[i].size) {
396  DVPacket *dpkt = &c->audio_pkt[i];
397 
398  pkt->size = dpkt->size;
399  pkt->data = dpkt->data;
400  pkt->stream_index = dpkt->stream_index;
401  pkt->flags = dpkt->flags;
402  pkt->pts = dpkt->pts;
403  pkt->duration = dpkt->duration;
404  pkt->pos = dpkt->pos;
405 
406  dpkt->size = 0;
407  size = pkt->size;
408 
409  if (dpkt->last_sample_rate != dpkt->sample_rate) {
410  int ret = ff_add_param_change(pkt, 0, 0, dpkt->sample_rate, 0, 0);
411  if (ret < 0)
412  return ret;
413  dpkt->last_sample_rate = dpkt->sample_rate;
414  }
415 
416  break;
417  }
418  }
419 
420  return size;
421 }
422 
424  uint8_t *buf, int buf_size, int64_t pos)
425 {
427  int size, i;
428  uint8_t *ppcm[5] = { 0 };
429 
430  if (buf_size < DV_PROFILE_BYTES ||
431  !(c->sys = av_dv_frame_profile(c->sys, buf, buf_size)) ||
432  buf_size < c->sys->frame_size) {
433  return AVERROR_INVALIDDATA;
434  }
435 
436  /* Queueing audio packet */
437  /* FIXME: in case of no audio/bad audio we have to do something */
438  size = dv_extract_audio_info(c, buf);
439  if (size < 0)
440  return size;
441 
442  if (c->ach) {
443  int64_t next_pts_video = av_rescale_q(c->next_pts_video, c->vst->time_base,
444  c->ast[0]->time_base);
445 
446  duration = av_rescale_q(size / 4,
447  (AVRational){ 1, c->audio_pkt[0].sample_rate },
448  c->ast[0]->time_base);
449 
450  // if audio timestamps are more than one frame away from video,
451  // assume desync happened (e.g. due to dropped audio frames) and
452  // resynchronize
453  pts = (FFABS(next_pts_video - c->next_pts_audio) >= duration) ?
454  next_pts_video : c->next_pts_audio;
455 
456  c->next_pts_audio = pts + duration;
457  }
458 
459  for (i = 0; i < c->ach; i++) {
460  DVPacket *dpkt = &c->audio_pkt[i];
461 
462  dpkt->pos = pos;
463  dpkt->size = size;
464  dpkt->pts = pts;
465  dpkt->duration = duration;
466 
467  ppcm[i] = c->audio_buf[i];
468  }
469  if (c->ach)
470  dv_extract_audio(buf, ppcm, c->sys);
471 
472  /* We work with 720p frames split in half, thus even frames have
473  * channels 0,1 and odd 2,3. */
474  if (c->sys->height == 720) {
475  if (buf[1] & 0x0C) {
476  c->audio_pkt[2].size = c->audio_pkt[3].size = 0;
477  } else {
478  c->audio_pkt[0].size = c->audio_pkt[1].size = 0;
479  }
480  }
481 
482  /* return the video packet, if the caller wants it */
483  if (pkt) {
484  size = dv_extract_video_info(c, buf);
485 
486  pkt->data = buf;
487  pkt->pos = pos;
488  pkt->size = size;
490  pkt->stream_index = c->vst->index;
491  pkt->pts = c->next_pts_video;
492  pkt->duration = av_rescale_q(1, c->sys->time_base, c->vst->time_base);
493 
494  c->next_pts_video += pkt->duration;
495  }
496 
497  c->frames++;
498 
499  return size;
500 }
501 
502 static int64_t dv_frame_offset(AVFormatContext *s, DVDemuxContext *c,
503  int64_t *timestamp)
504 {
505  // FIXME: sys may be wrong if last dv_read_packet() failed (buffer is junk)
506  FFFormatContext *const si = ffformatcontext(s);
507  const int frame_size = c->sys->frame_size;
508  int64_t frame_count = av_rescale_q(*timestamp, c->vst->time_base, c->sys->time_base);
509  int64_t offset;
510  int64_t size = avio_size(s->pb) - si->data_offset;
511  int64_t max_offset = ((size - 1) / frame_size) * frame_size;
512 
513  offset = frame_size * frame_count;
514 
515  if (size >= 0 && offset > max_offset)
516  offset = max_offset;
517  else if (offset < 0)
518  offset = 0;
519 
520  *timestamp = av_rescale_q(offset / frame_size, c->sys->time_base, c->vst->time_base);
521 
522  return offset + si->data_offset;
523 }
524 
526 {
527  c->frames = !c->sys ? 0 :
528  av_rescale_q(ts, c->vst->time_base, c->sys->time_base);
529  c->next_pts_video = ts;
530  c->next_pts_audio = (!c->sys || !c->ast[0]) ? AV_NOPTS_VALUE :
531  av_rescale_q(ts, c->vst->time_base, c->ast[0]->time_base);
532 
533  c->audio_pkt[0].size = c->audio_pkt[1].size = 0;
534  c->audio_pkt[2].size = c->audio_pkt[3].size = 0;
535 }
536 
537 /************************************************************
538  * Implementation of the easiest DV storage of all -- raw DV.
539  ************************************************************/
540 
541 typedef struct RawDVContext {
542  DVDemuxContext dv_demux;
543  uint8_t buf[DV_MAX_FRAME_SIZE];
544 } RawDVContext;
545 
546 static int dv_read_timecode(AVFormatContext *s) {
547  int ret;
548  char timecode[AV_TIMECODE_STR_SIZE];
549  int64_t pos = avio_tell(s->pb);
550 
551  // Read 3 DIF blocks: Header block and 2 Subcode blocks.
552 #define PARTIAL_FRAME_SIZE (3 * 80)
553  uint8_t partial_frame[PARTIAL_FRAME_SIZE];
554  RawDVContext *c = s->priv_data;
555 
556  ret = avio_read(s->pb, partial_frame, PARTIAL_FRAME_SIZE);
557  if (ret < 0)
558  goto finish;
559 
560  if (ret < PARTIAL_FRAME_SIZE) {
561  ret = -1;
562  goto finish;
563  }
564 
565  ret = dv_extract_timecode(&c->dv_demux, partial_frame, timecode);
566  if (ret)
567  av_dict_set(&s->metadata, "timecode", timecode, 0);
568  else
569  av_log(s, AV_LOG_ERROR, "Detected timecode is invalid\n");
570 
571 finish:
572  avio_seek(s->pb, pos, SEEK_SET);
573  return ret;
574 }
575 
576 static int dv_read_header(AVFormatContext *s)
577 {
578  unsigned state, marker_pos = 0;
579  RawDVContext *c = s->priv_data;
580  int64_t ret64;
581  int ret;
582 
583  if ((ret = dv_init_demux(s, &c->dv_demux)) < 0)
584  return ret;
585 
586  state = avio_rb32(s->pb);
587  while ((state & 0xffffff7f) != 0x1f07003f) {
588  if (avio_feof(s->pb)) {
589  av_log(s, AV_LOG_ERROR, "Cannot find DV header.\n");
590  return AVERROR_INVALIDDATA;
591  }
592  if (state == 0x003f0700 || state == 0xff3f0700)
593  marker_pos = avio_tell(s->pb);
594  if (state == 0xff3f0701 && avio_tell(s->pb) - marker_pos == 80) {
595  avio_seek(s->pb, -163, SEEK_CUR);
596  state = avio_rb32(s->pb);
597  break;
598  }
599  state = (state << 8) | avio_r8(s->pb);
600  }
601  AV_WB32(c->buf, state);
602 
603  if ((ret = ffio_read_size(s->pb, c->buf + 4, DV_PROFILE_BYTES - 4)) < 0)
604  return ret;
605  if ((ret64 = avio_seek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR)) < 0)
606  return (int)ret64;
607 
608  c->dv_demux.sys = av_dv_frame_profile(c->dv_demux.sys,
609  c->buf,
611  if (!c->dv_demux.sys) {
613  "Can't determine profile of DV input stream.\n");
614  return AVERROR_INVALIDDATA;
615  }
616 
617  s->bit_rate = av_rescale_q(c->dv_demux.sys->frame_size,
618  (AVRational) { 8, 1 },
619  c->dv_demux.sys->time_base);
620 
621  if (s->pb->seekable & AVIO_SEEKABLE_NORMAL)
622  dv_read_timecode(s);
623 
624  return 0;
625 }
626 
627 static int dv_read_packet(AVFormatContext *s, AVPacket *pkt)
628 {
629  int size;
630  RawDVContext *c = s->priv_data;
631 
632  size = avpriv_dv_get_packet(&c->dv_demux, pkt);
633 
634  if (size < 0) {
635  int ret;
636  int64_t pos = avio_tell(s->pb);
637  if (!c->dv_demux.sys)
638  return AVERROR_INVALIDDATA;
639  size = c->dv_demux.sys->frame_size;
640  ret = avio_read(s->pb, c->buf, size);
641  if (ret < 0) {
642  return ret;
643  } else if (ret == 0) {
644  return AVERROR_INVALIDDATA;
645  }
646 
647  size = avpriv_dv_produce_packet(&c->dv_demux, pkt, c->buf, size, pos);
648  }
649 
650  return size;
651 }
652 
653 static int dv_read_seek(AVFormatContext *s, int stream_index,
654  int64_t timestamp, int flags)
655 {
656  RawDVContext *r = s->priv_data;
657  DVDemuxContext *c = &r->dv_demux;
658  int64_t offset;
659 
660  // seek using the video stream
661  if (stream_index != c->vst->index)
662  timestamp = av_rescale_q(timestamp, s->streams[stream_index]->time_base,
663  c->vst->time_base);
664 
665  offset = dv_frame_offset(s, c, &timestamp);
666 
667  if (avio_seek(s->pb, offset, SEEK_SET) < 0)
668  return -1;
669 
670  ff_dv_ts_reset(c, timestamp);
671  return 0;
672 }
673 
674 static int dv_probe(const AVProbeData *p)
675 {
676  unsigned marker_pos = 0;
677  int i;
678  int matches = 0;
679  int firstmatch = 0;
680  int secondary_matches = 0;
681 
682  if (p->buf_size < 5)
683  return 0;
684 
685  for (i = 0; i < p->buf_size-4; i++) {
686  unsigned state = AV_RB32(p->buf+i);
687  if ((state & 0x0007f840) == 0x00070000) {
688  // any section header, also with seq/chan num != 0,
689  // should appear around every 12000 bytes, at least 10 per frame
690  if ((state & 0xff07ff7f) == 0x1f07003f) {
691  secondary_matches++;
692  if ((state & 0xffffff7f) == 0x1f07003f) {
693  matches++;
694  if (!i)
695  firstmatch = 1;
696  }
697  }
698  if (state == 0x003f0700 || state == 0xff3f0700)
699  marker_pos = i;
700  if (state == 0xff3f0701 && i - marker_pos == 80)
701  matches++;
702  }
703  }
704 
705  if (matches && p->buf_size / matches < 1024 * 1024) {
706  if (matches > 4 || firstmatch ||
707  (secondary_matches >= 10 &&
708  p->buf_size / secondary_matches < 24000))
709  // not max to avoid dv in mov to match
710  return AVPROBE_SCORE_MAX * 3 / 4;
711  return AVPROBE_SCORE_MAX / 4;
712  }
713  return 0;
714 }
715 
717  .p.name = "dv",
718  .p.long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
719  .p.extensions = "dv,dif",
720  .priv_data_size = sizeof(RawDVContext),
721  .read_probe = dv_probe,
722  .read_header = dv_read_header,
723  .read_packet = dv_read_packet,
724  .read_seek = dv_read_seek,
725 };
726 
727 #else // CONFIG_DV_DEMUXER
729 {
730  return NULL;
731 }
732 
734 {
735  return AVERROR(ENOSYS);
736 }
737 
739  uint8_t *buf, int buf_size, int64_t pos)
740 {
741  return AVERROR(ENOSYS);
742 }
743 #endif // CONFIG_DV_DEMUXER
AV_CODEC_ID_PCM_S16LE
@ AV_CODEC_ID_PCM_S16LE
Definition: codec_id.h:337
flags
const SwsFlags flags[]
Definition: swscale.c:61
AV_TIMECODE_STR_SIZE
#define AV_TIMECODE_STR_SIZE
Definition: timecode.h:33
DV_AUDIO_CONTROL
@ DV_AUDIO_CONTROL
Definition: dv.h:43
r
const char * r
Definition: vf_curves.c:127
AVERROR
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
AV_CHANNEL_LAYOUT_STEREO
#define AV_CHANNEL_LAYOUT_STEREO
Definition: channel_layout.h:395
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
ffformatcontext
static av_always_inline FFFormatContext * ffformatcontext(AVFormatContext *s)
Definition: internal.h:123
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
int64_t
long long int64_t
Definition: coverity.c:34
DVPacket
For DV, one packet corresponds exactly to one frame.
Definition: iec61883.c:56
AVPacket::data
uint8_t * data
Definition: packet.h:588
data
const char data[16]
Definition: mxf.c:149
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:606
mathematics.h
DV_PROFILE_BYTES
#define DV_PROFILE_BYTES
Definition: dv_profile.h:29
avio_size
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:326
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:643
DVDemuxContext
struct DVDemuxContext DVDemuxContext
Definition: dv.h:33
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:463
DVPackType
DVPackType
Definition: dv.h:38
AVDVProfile::difseg_size
int difseg_size
Definition: dv_profile.h:42
avpriv_dv_produce_packet
int avpriv_dv_produce_packet(DVDemuxContext *c, AVPacket *pkt, uint8_t *buf, int buf_size, int64_t pos)
Definition: dv.c:738
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: avformat.c:777
finish
static void finish(void)
Definition: movenc.c:374
read_seek
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:151
frames
if it could not because there are no more frames
Definition: filter_design.txt:267
timecode.h
DV_VIDEO_CONTROL
@ DV_VIDEO_CONTROL
Definition: dv.h:47
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:494
dv_profile.h
pts
static int64_t pts
Definition: transcode_aac.c:644
DV_TIMESCALE_AUDIO
#define DV_TIMESCALE_AUDIO
Definition: dv.h:67
quant
static const uint8_t quant[64]
Definition: vmixdec.c:71
avassert.h
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:764
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
duration
int64_t duration
Definition: movenc.c:65
read_packet
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_read_callback.c:42
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:198
DV_TIMECODE
@ DV_TIMECODE
Definition: dv.h:41
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:549
frame_size
int frame_size
Definition: mxfenc.c:2487
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
FFFormatContext::data_offset
int64_t data_offset
offset of the first packet
Definition: internal.h:89
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
if
if(ret)
Definition: filter_design.txt:179
FFFormatContext
Definition: internal.h:64
DV_TIMESCALE_VIDEO
#define DV_TIMESCALE_VIDEO
Definition: dv.h:64
AVFormatContext
Format I/O context.
Definition: avformat.h:1264
internal.h
avpriv_dv_get_packet
int avpriv_dv_get_packet(DVDemuxContext *c, AVPacket *pkt)
Definition: dv.c:733
result
and forward the result(frame or status change) to the corresponding input. If nothing is possible
NULL
#define NULL
Definition: coverity.c:32
AVFMTCTX_NOHEADER
#define AVFMTCTX_NOHEADER
signal that no header is present (streams are added dynamically)
Definition: avformat.h:1215
AVDVProfile::n_difchan
int n_difchan
Definition: dv_profile.h:43
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:451
time.h
state
static struct @543 state
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
AV_WB32
#define AV_WB32(p, v)
Definition: intreadwrite.h:415
dv.h
AVDVProfile::audio_stride
int audio_stride
Definition: dv_profile.h:52
AVPacket::size
int size
Definition: packet.h:589
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:319
shift
static int shift(int a, int b)
Definition: bonk.c:261
sample
#define sample
Definition: flacdsp_template.c:44
av_dv_frame_profile
const AVDVProfile * av_dv_frame_profile(const AVDVProfile *sys, const uint8_t *frame, unsigned buf_size)
Get a DV profile for the provided compressed frame.
Definition: dv_profile.c:299
size
int size
Definition: twinvq_data.h:10344
ff_add_param_change
int ff_add_param_change(AVPacket *pkt, int32_t channels, uint64_t channel_layout, int32_t sample_rate, int32_t width, int32_t height)
Add side data to a packet for changing parameters to the given values.
Definition: demux_utils.c:142
dv_audio_12to16
static uint16_t dv_audio_12to16(uint16_t sample)
Definition: dvaudiodec.c:68
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:96
AVDVProfile::height
int height
Definition: dv_profile.h:46
FFInputFormat::p
AVInputFormat p
The public AVInputFormat.
Definition: demux.h:51
DV_MAX_FRAME_SIZE
#define DV_MAX_FRAME_SIZE
largest possible DV frame, in bytes (1080i50)
Definition: dv.h:61
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:606
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:594
read_header
static int read_header(FFV1Context *f, RangeCoder *c)
Definition: ffv1dec.c:498
DV_AUDIO_SOURCE
@ DV_AUDIO_SOURCE
Definition: dv.h:42
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:581
av_timecode_make_smpte_tc_string2
char * av_timecode_make_smpte_tc_string2(char *buf, AVRational rate, uint32_t tcsmpte, int prevent_df, int skip_field)
Get the timecode string from the SMPTE timecode format.
Definition: timecode.c:131
avio_internal.h
ff_dv_demuxer
const FFInputFormat ff_dv_demuxer
ff_dv_ts_reset
void ff_dv_ts_reset(DVDemuxContext *c, int64_t ts_video)
AV_CODEC_ID_DVVIDEO
@ AV_CODEC_ID_DVVIDEO
Definition: codec_id.h:76
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
demux.h
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:236
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:265
DVPacket::buf
uint8_t * buf
actual buffer data
Definition: iec61883.c:57
pos
unsigned int pos
Definition: spdifenc.c:414
avformat.h
avpriv_dv_init_demux
DVDemuxContext * avpriv_dv_init_demux(AVFormatContext *s)
Definition: dv.c:728
AVDVProfile::audio_min_samples
int audio_min_samples[3]
Definition: dv_profile.h:53
channel_layout.h
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:41
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:615
AVDVProfile
Definition: dv_profile.h:38
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
AVPacket::stream_index
int stream_index
Definition: packet.h:590
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
read_probe
static int read_probe(const AVProbeData *p)
Definition: cdg.c:30
AVDVProfile::audio_shuffle
const uint8_t(* audio_shuffle)[9]
Definition: dv_profile.h:57
mem.h
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVPacket
This structure stores compressed data.
Definition: packet.h:565
av_dict_set
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:86
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:608
FFInputFormat
Definition: demux.h:47
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:97
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
ffio_read_size
int ffio_read_size(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:665
AVDVProfile::frame_size
int frame_size
Definition: dv_profile.h:41
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:349