2 * General DV muxer/demuxer
3 * Copyright (c) 2003 Roman Shaposhnik
5 * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
6 * of DV technical info.
9 * Copyright (c) 2002 Fabrice Bellard
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
15 * This file is part of Libav.
17 * Libav 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.
22 * Libav 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.
27 * You should have received a copy of the GNU Lesser General Public
28 * License along with Libav; if not, write to the Free Software
29 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
34 #include "libavcodec/dv_profile.h"
35 #include "libavcodec/dvdata.h"
36 #include "libavutil/channel_layout.h"
37 #include "libavutil/intreadwrite.h"
38 #include "libavutil/mathematics.h"
41 struct DVDemuxContext
{
42 const DVprofile
* sys
; /* Current DV profile. E.g.: 525/60, 625/50 */
43 AVFormatContext
* fctx
;
46 AVPacket audio_pkt
[4];
47 uint8_t audio_buf
[4][8192];
53 static inline uint16_t dv_audio_12to16(uint16_t sample
)
55 uint16_t shift
, result
;
57 sample
= (sample
< 0x800) ? sample
: sample
| 0xf000;
58 shift
= (sample
& 0xf00) >> 8;
60 if (shift
< 0x2 || shift
> 0xd) {
62 } else if (shift
< 0x8) {
64 result
= (sample
- (256 * shift
)) << shift
;
67 result
= ((sample
+ ((256 * shift
) + 1)) << shift
) - 1;
74 * This is the dumbest implementation of all -- it simply looks at
75 * a fixed offset and if pack isn't there -- fails. We might want
76 * to have a fallback mechanism for complete search of missing packs.
78 static const uint8_t* dv_extract_pack(uint8_t* frame
, enum dv_pack_type t
)
84 offs
= (80*6 + 80*16*3 + 3);
86 case dv_audio_control
:
87 offs
= (80*6 + 80*16*4 + 3);
89 case dv_video_control
:
90 offs
= (80*5 + 48 + 5);
96 return frame
[offs
] == t
? &frame
[offs
] : NULL
;
99 static const int dv_audio_frequency
[3] = {
104 * There's a couple of assumptions being made here:
105 * 1. By default we silence erroneous (0x8000/16bit 0x800/12bit) audio samples.
106 * We can pass them upwards when libavcodec will be ready to deal with them.
107 * 2. We don't do software emphasis.
108 * 3. Audio is always returned as 16bit linear samples: 12bit nonlinear samples
109 * are converted into 16bit linear ones.
111 static int dv_extract_audio(uint8_t* frame
, uint8_t* ppcm
[4],
112 const DVprofile
*sys
)
114 int size
, chan
, i
, j
, d
, of
, smpls
, freq
, quant
, half_ch
;
116 const uint8_t* as_pack
;
119 as_pack
= dv_extract_pack(frame
, dv_audio_source
);
120 if (!as_pack
) /* No audio ? */
123 smpls
= as_pack
[1] & 0x3f; /* samples in this frame - min. samples */
124 freq
= (as_pack
[4] >> 3) & 0x07; /* 0 - 48kHz, 1 - 44,1kHz, 2 - 32kHz */
125 quant
= as_pack
[4] & 0x07; /* 0 - 16bit linear, 1 - 12bit nonlinear */
128 return -1; /* unsupported quantization */
130 if (freq
>= FF_ARRAY_ELEMS(dv_audio_frequency
))
131 return AVERROR_INVALIDDATA
;
133 size
= (sys
->audio_min_samples
[freq
] + smpls
) * 4; /* 2ch, 2bytes */
134 half_ch
= sys
->difseg_size
/ 2;
136 /* We work with 720p frames split in half, thus even frames have
137 * channels 0,1 and odd 2,3. */
138 ipcm
= (sys
->height
== 720 && !(frame
[1] & 0x0C)) ? 2 : 0;
140 /* for each DIF channel */
141 for (chan
= 0; chan
< sys
->n_difchan
; chan
++) {
142 /* next stereo channel (50Mbps and 100Mbps only) */
147 /* for each DIF segment */
148 for (i
= 0; i
< sys
->difseg_size
; i
++) {
149 frame
+= 6 * 80; /* skip DIF segment header */
150 if (quant
== 1 && i
== half_ch
) {
151 /* next stereo channel (12bit mode only) */
157 /* for each AV sequence */
158 for (j
= 0; j
< 9; j
++) {
159 for (d
= 8; d
< 80; d
+= 2) {
160 if (quant
== 0) { /* 16bit quantization */
161 of
= sys
->audio_shuffle
[i
][j
] + (d
- 8) / 2 * sys
->audio_stride
;
165 pcm
[of
*2] = frame
[d
+1]; // FIXME: maybe we have to admit
166 pcm
[of
*2+1] = frame
[d
]; // that DV is a big-endian PCM
167 if (pcm
[of
*2+1] == 0x80 && pcm
[of
*2] == 0x00)
169 } else { /* 12bit quantization */
170 lc
= ((uint16_t)frame
[d
] << 4) |
171 ((uint16_t)frame
[d
+2] >> 4);
172 rc
= ((uint16_t)frame
[d
+1] << 4) |
173 ((uint16_t)frame
[d
+2] & 0x0f);
174 lc
= (lc
== 0x800 ? 0 : dv_audio_12to16(lc
));
175 rc
= (rc
== 0x800 ? 0 : dv_audio_12to16(rc
));
177 of
= sys
->audio_shuffle
[i
%half_ch
][j
] + (d
- 8) / 3 * sys
->audio_stride
;
181 pcm
[of
*2] = lc
& 0xff; // FIXME: maybe we have to admit
182 pcm
[of
*2+1] = lc
>> 8; // that DV is a big-endian PCM
183 of
= sys
->audio_shuffle
[i
%half_ch
+half_ch
][j
] +
184 (d
- 8) / 3 * sys
->audio_stride
;
185 pcm
[of
*2] = rc
& 0xff; // FIXME: maybe we have to admit
186 pcm
[of
*2+1] = rc
>> 8; // that DV is a big-endian PCM
191 frame
+= 16 * 80; /* 15 Video DIFs + 1 Audio DIF */
199 static int dv_extract_audio_info(DVDemuxContext
* c
, uint8_t* frame
)
201 const uint8_t* as_pack
;
202 int freq
, stype
, smpls
, quant
, i
, ach
;
204 as_pack
= dv_extract_pack(frame
, dv_audio_source
);
205 if (!as_pack
|| !c
->sys
) { /* No audio ? */
210 smpls
= as_pack
[1] & 0x3f; /* samples in this frame - min. samples */
211 freq
= (as_pack
[4] >> 3) & 0x07; /* 0 - 48kHz, 1 - 44,1kHz, 2 - 32kHz */
212 stype
= (as_pack
[3] & 0x1f); /* 0 - 2CH, 2 - 4CH, 3 - 8CH */
213 quant
= as_pack
[4] & 0x07; /* 0 - 16bit linear, 1 - 12bit nonlinear */
215 if (freq
>= FF_ARRAY_ELEMS(dv_audio_frequency
)) {
216 av_log(c
->fctx
, AV_LOG_ERROR
,
217 "Unrecognized audio sample rate index (%d)\n", freq
);
222 av_log(c
->fctx
, AV_LOG_ERROR
, "stype %d is invalid\n", stype
);
227 /* note: ach counts PAIRS of channels (i.e. stereo channels) */
228 ach
= ((int[4]){ 1, 0, 2, 4})[stype
];
229 if (ach
== 1 && quant
&& freq
== 2)
232 /* Dynamic handling of the audio streams in DV */
233 for (i
= 0; i
< ach
; i
++) {
235 c
->ast
[i
] = avformat_new_stream(c
->fctx
, NULL
);
238 avpriv_set_pts_info(c
->ast
[i
], 64, 1, 30000);
239 c
->ast
[i
]->codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
240 c
->ast
[i
]->codec
->codec_id
= AV_CODEC_ID_PCM_S16LE
;
242 av_init_packet(&c
->audio_pkt
[i
]);
243 c
->audio_pkt
[i
].size
= 0;
244 c
->audio_pkt
[i
].data
= c
->audio_buf
[i
];
245 c
->audio_pkt
[i
].stream_index
= c
->ast
[i
]->index
;
246 c
->audio_pkt
[i
].flags
|= AV_PKT_FLAG_KEY
;
248 c
->ast
[i
]->codec
->sample_rate
= dv_audio_frequency
[freq
];
249 c
->ast
[i
]->codec
->channels
= 2;
250 c
->ast
[i
]->codec
->channel_layout
= AV_CH_LAYOUT_STEREO
;
251 c
->ast
[i
]->codec
->bit_rate
= 2 * dv_audio_frequency
[freq
] * 16;
252 c
->ast
[i
]->start_time
= 0;
256 return (c
->sys
->audio_min_samples
[freq
] + smpls
) * 4; /* 2ch, 2bytes */;
259 static int dv_extract_video_info(DVDemuxContext
*c
, uint8_t* frame
)
261 const uint8_t* vsc_pack
;
262 AVCodecContext
* avctx
;
267 avctx
= c
->vst
->codec
;
269 avpriv_set_pts_info(c
->vst
, 64, c
->sys
->time_base
.num
,
270 c
->sys
->time_base
.den
);
271 avctx
->time_base
= c
->sys
->time_base
;
273 avctx
->width
= c
->sys
->width
;
274 avctx
->height
= c
->sys
->height
;
276 avctx
->pix_fmt
= c
->sys
->pix_fmt
;
278 /* finding out SAR is a little bit messy */
279 vsc_pack
= dv_extract_pack(frame
, dv_video_control
);
280 apt
= frame
[4] & 0x07;
281 is16_9
= (vsc_pack
&& ((vsc_pack
[2] & 0x07) == 0x02 ||
282 (!apt
&& (vsc_pack
[2] & 0x07) == 0x07)));
283 c
->vst
->sample_aspect_ratio
= c
->sys
->sar
[is16_9
];
284 avctx
->bit_rate
= av_rescale_q(c
->sys
->frame_size
, (AVRational
){8,1},
286 size
= c
->sys
->frame_size
;
292 * The following 3 functions constitute our interface to the world
295 DVDemuxContext
* avpriv_dv_init_demux(AVFormatContext
*s
)
299 c
= av_mallocz(sizeof(DVDemuxContext
));
303 c
->vst
= avformat_new_stream(s
, NULL
);
310 c
->vst
->codec
->codec_type
= AVMEDIA_TYPE_VIDEO
;
311 c
->vst
->codec
->codec_id
= AV_CODEC_ID_DVVIDEO
;
312 c
->vst
->codec
->bit_rate
= 25000000;
313 c
->vst
->start_time
= 0;
318 int avpriv_dv_get_packet(DVDemuxContext
*c
, AVPacket
*pkt
)
323 for (i
= 0; i
< c
->ach
; i
++) {
324 if (c
->ast
[i
] && c
->audio_pkt
[i
].size
) {
325 *pkt
= c
->audio_pkt
[i
];
326 c
->audio_pkt
[i
].size
= 0;
335 int avpriv_dv_produce_packet(DVDemuxContext
*c
, AVPacket
*pkt
,
336 uint8_t* buf
, int buf_size
)
339 uint8_t *ppcm
[4] = {0};
341 if (buf_size
< DV_PROFILE_BYTES
||
342 !(c
->sys
= avpriv_dv_frame_profile(c
->sys
, buf
, buf_size
)) ||
343 buf_size
< c
->sys
->frame_size
) {
344 return -1; /* Broken frame, or not enough data */
347 /* Queueing audio packet */
348 /* FIXME: in case of no audio/bad audio we have to do something */
349 size
= dv_extract_audio_info(c
, buf
);
350 for (i
= 0; i
< c
->ach
; i
++) {
351 c
->audio_pkt
[i
].size
= size
;
352 c
->audio_pkt
[i
].pts
= c
->abytes
* 30000 * 8 / c
->ast
[i
]->codec
->bit_rate
;
353 ppcm
[i
] = c
->audio_buf
[i
];
356 dv_extract_audio(buf
, ppcm
, c
->sys
);
358 /* We work with 720p frames split in half, thus even frames have
359 * channels 0,1 and odd 2,3. */
360 if (c
->sys
->height
== 720) {
362 c
->audio_pkt
[2].size
= c
->audio_pkt
[3].size
= 0;
364 c
->audio_pkt
[0].size
= c
->audio_pkt
[1].size
= 0;
371 /* Now it's time to return video packet */
372 size
= dv_extract_video_info(c
, buf
);
376 pkt
->flags
|= AV_PKT_FLAG_KEY
;
377 pkt
->stream_index
= c
->vst
->index
;
378 pkt
->pts
= c
->frames
;
385 static int64_t dv_frame_offset(AVFormatContext
*s
, DVDemuxContext
*c
,
386 int64_t timestamp
, int flags
)
388 // FIXME: sys may be wrong if last dv_read_packet() failed (buffer is junk)
389 const DVprofile
* sys
= avpriv_dv_codec_profile(c
->vst
->codec
);
391 int64_t size
= avio_size(s
->pb
) - s
->data_offset
;
392 int64_t max_offset
= ((size
-1) / sys
->frame_size
) * sys
->frame_size
;
394 offset
= sys
->frame_size
* timestamp
;
396 if (size
>= 0 && offset
> max_offset
) offset
= max_offset
;
397 else if (offset
< 0) offset
= 0;
399 return offset
+ s
->data_offset
;
402 void ff_dv_offset_reset(DVDemuxContext
*c
, int64_t frame_offset
)
404 c
->frames
= frame_offset
;
406 c
->abytes
= av_rescale_q(c
->frames
, c
->sys
->time_base
,
407 (AVRational
){8, c
->ast
[0]->codec
->bit_rate
});
408 c
->audio_pkt
[0].size
= c
->audio_pkt
[1].size
= 0;
409 c
->audio_pkt
[2].size
= c
->audio_pkt
[3].size
= 0;
412 /************************************************************
413 * Implementation of the easiest DV storage of all -- raw DV.
414 ************************************************************/
416 typedef struct RawDVContext
{
417 DVDemuxContext
* dv_demux
;
418 uint8_t buf
[DV_MAX_FRAME_SIZE
];
421 static int dv_read_header(AVFormatContext
*s
)
423 unsigned state
, marker_pos
= 0;
424 RawDVContext
*c
= s
->priv_data
;
426 c
->dv_demux
= avpriv_dv_init_demux(s
);
430 state
= avio_rb32(s
->pb
);
431 while ((state
& 0xffffff7f) != 0x1f07003f) {
432 if (s
->pb
->eof_reached
) {
433 av_log(s
, AV_LOG_ERROR
, "Cannot find DV header.\n");
436 if (state
== 0x003f0700 || state
== 0xff3f0700)
437 marker_pos
= avio_tell(s
->pb
);
438 if (state
== 0xff3f0701 && avio_tell(s
->pb
) - marker_pos
== 80) {
439 avio_seek(s
->pb
, -163, SEEK_CUR
);
440 state
= avio_rb32(s
->pb
);
443 state
= (state
<< 8) | avio_r8(s
->pb
);
445 AV_WB32(c
->buf
, state
);
447 if (avio_read(s
->pb
, c
->buf
+ 4, DV_PROFILE_BYTES
- 4) <= 0 ||
448 avio_seek(s
->pb
, -DV_PROFILE_BYTES
, SEEK_CUR
) < 0)
451 c
->dv_demux
->sys
= avpriv_dv_frame_profile(c
->dv_demux
->sys
, c
->buf
, DV_PROFILE_BYTES
);
452 if (!c
->dv_demux
->sys
) {
453 av_log(s
, AV_LOG_ERROR
, "Can't determine profile of DV input stream.\n");
457 s
->bit_rate
= av_rescale_q(c
->dv_demux
->sys
->frame_size
, (AVRational
){8,1},
458 c
->dv_demux
->sys
->time_base
);
464 static int dv_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
467 RawDVContext
*c
= s
->priv_data
;
469 size
= avpriv_dv_get_packet(c
->dv_demux
, pkt
);
472 if (!c
->dv_demux
->sys
)
474 size
= c
->dv_demux
->sys
->frame_size
;
475 if (avio_read(s
->pb
, c
->buf
, size
) <= 0)
478 size
= avpriv_dv_produce_packet(c
->dv_demux
, pkt
, c
->buf
, size
);
484 static int dv_read_seek(AVFormatContext
*s
, int stream_index
,
485 int64_t timestamp
, int flags
)
487 RawDVContext
*r
= s
->priv_data
;
488 DVDemuxContext
*c
= r
->dv_demux
;
489 int64_t offset
= dv_frame_offset(s
, c
, timestamp
, flags
);
491 if (avio_seek(s
->pb
, offset
, SEEK_SET
) < 0)
494 ff_dv_offset_reset(c
, offset
/ c
->sys
->frame_size
);
498 static int dv_read_close(AVFormatContext
*s
)
500 RawDVContext
*c
= s
->priv_data
;
501 av_free(c
->dv_demux
);
505 static int dv_probe(AVProbeData
*p
)
507 unsigned state
, marker_pos
= 0;
510 int secondary_matches
= 0;
515 state
= AV_RB32(p
->buf
);
516 for (i
= 4; i
< p
->buf_size
; i
++) {
517 if ((state
& 0xffffff7f) == 0x1f07003f)
519 // any section header, also with seq/chan num != 0,
520 // should appear around every 12000 bytes, at least 10 per frame
521 if ((state
& 0xff07ff7f) == 0x1f07003f)
523 if (state
== 0x003f0700 || state
== 0xff3f0700)
525 if (state
== 0xff3f0701 && i
- marker_pos
== 80)
527 state
= (state
<< 8) | p
->buf
[i
];
530 if (matches
&& p
->buf_size
/ matches
< 1024*1024) {
531 if (matches
> 4 || (secondary_matches
>= 10 && p
->buf_size
/ secondary_matches
< 24000))
532 return AVPROBE_SCORE_MAX
*3/4; // not max to avoid dv in mov to match
533 return AVPROBE_SCORE_MAX
/4;
538 #if CONFIG_DV_DEMUXER
539 AVInputFormat ff_dv_demuxer
= {
541 .long_name
= NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
542 .priv_data_size
= sizeof(RawDVContext
),
543 .read_probe
= dv_probe
,
544 .read_header
= dv_read_header
,
545 .read_packet
= dv_read_packet
,
546 .read_close
= dv_read_close
,
547 .read_seek
= dv_read_seek
,
548 .extensions
= "dv,dif",