FFmpeg
mlpdec.c
Go to the documentation of this file.
1 /*
2  * MLP and TrueHD demuxer
3  * Copyright (c) 2001 Fabrice Bellard
4  * Copyright (c) 2005 Alex Beregszaszi
5  * Copyright (c) 2015 Carl Eugen Hoyos
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include "config_components.h"
25 
26 #include "avformat.h"
27 #include "avio_internal.h"
28 #include "demux.h"
29 #include "internal.h"
30 #include "rawdec.h"
31 #include "libavutil/intreadwrite.h"
32 #include "libavcodec/mlp.h"
33 #include "libavcodec/mlp_parse.h"
34 
35 static int av_always_inline mlp_thd_probe(const AVProbeData *p, uint32_t sync)
36 {
37  const uint8_t *buf, *last_buf = p->buf, *end = p->buf + p->buf_size;
38  int valid = 0, size = 0;
39  int nsubframes = 0;
40 
41  for (buf = p->buf; buf + 8 <= end; buf++) {
42  if (AV_RB32(buf + 4) == sync) {
43  if (last_buf + size == buf) {
44  valid += 1 + nsubframes / 8;
45  }
46  nsubframes = 0;
47  last_buf = buf;
48  size = (AV_RB16(buf) & 0xfff) * 2;
49  } else if (buf - last_buf == size) {
50  nsubframes++;
51  size += (AV_RB16(buf) & 0xfff) * 2;
52  }
53  }
54  if (valid >= 100)
55  return AVPROBE_SCORE_MAX;
56  return 0;
57 }
58 
60 {
62 
63  if (ret < 0)
64  return ret;
65 
66  ret = ffio_ensure_seekback(s->pb, 10);
67  if (ret == 0) {
68  uint8_t buffer[10];
69  int read, sample_rate = 0;
70 
71  read = avio_read(s->pb, buffer, 10);
72  if (read == 10) {
73  switch (buffer[7]) {
74  case SYNC_TRUEHD:
75  sample_rate = mlp_samplerate(buffer[8] >> 4);
76  break;
77  case SYNC_MLP:
78  sample_rate = mlp_samplerate(buffer[9] >> 4);
79  break;
80  }
81 
82  if (sample_rate)
83  avpriv_set_pts_info(s->streams[0], 64, 1, sample_rate);
84  }
85 
86  if (read > 0)
87  avio_seek(s->pb, -read, SEEK_CUR);
88  }
89 
90  return 0;
91 }
92 
93 #if CONFIG_MLP_DEMUXER
94 static int mlp_probe(const AVProbeData *p)
95 {
96  return mlp_thd_probe(p, 0xf8726fbb);
97 }
98 
100  .p.name = "mlp",
101  .p.long_name = NULL_IF_CONFIG_SMALL("raw MLP"),
103  .p.extensions = "mlp",
104  .p.priv_class = &ff_raw_demuxer_class,
105  .read_probe = mlp_probe,
106  .read_header = mlp_read_header,
107  .read_packet = ff_raw_read_partial_packet,
108  .raw_codec_id = AV_CODEC_ID_MLP,
109  .priv_data_size = sizeof(FFRawDemuxerContext),
110 };
111 #endif
112 
113 #if CONFIG_TRUEHD_DEMUXER
114 static int thd_probe(const AVProbeData *p)
115 {
116  return mlp_thd_probe(p, 0xf8726fba);
117 }
118 
120  .p.name = "truehd",
121  .p.long_name = NULL_IF_CONFIG_SMALL("raw TrueHD"),
123  .p.extensions = "thd",
124  .p.priv_class = &ff_raw_demuxer_class,
125  .read_probe = thd_probe,
126  .read_header = mlp_read_header,
127  .read_packet = ff_raw_read_partial_packet,
128  .raw_codec_id = AV_CODEC_ID_TRUEHD,
129  .priv_data_size = sizeof(FFRawDemuxerContext),
130 };
131 #endif
AVFMT_NOTIMESTAMPS
#define AVFMT_NOTIMESTAMPS
Format does not need / have any timestamps.
Definition: avformat.h:479
mlp_thd_probe
static int av_always_inline mlp_thd_probe(const AVProbeData *p, uint32_t sync)
Definition: mlpdec.c:35
AVProbeData::buf_size
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:454
AV_CODEC_ID_TRUEHD
@ AV_CODEC_ID_TRUEHD
Definition: codec_id.h:490
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:463
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:867
SYNC_TRUEHD
#define SYNC_TRUEHD
Definition: mlp.h:30
FFRawDemuxerContext
Definition: rawdec.h:37
AVFMT_GENERIC_INDEX
#define AVFMT_GENERIC_INDEX
Use generic index building code.
Definition: avformat.h:480
ff_raw_read_partial_packet
int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
Definition: rawdec.c:33
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:198
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:553
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:453
ff_truehd_demuxer
const FFInputFormat ff_truehd_demuxer
ff_raw_demuxer_class
const AVClass ff_raw_demuxer_class
Definition: rawdec.c:141
AVFormatContext
Format I/O context.
Definition: avformat.h:1300
internal.h
rawdec.h
ff_raw_audio_read_header
int ff_raw_audio_read_header(AVFormatContext *s)
Definition: rawdec.c:54
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:451
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
size
int size
Definition: twinvq_data.h:10344
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
FFInputFormat::p
AVInputFormat p
The public AVInputFormat.
Definition: demux.h:46
mlp_read_header
static int mlp_read_header(AVFormatContext *s)
Definition: mlpdec.c:59
ffio_ensure_seekback
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
Definition: aviobuf.c:1023
mlp_parse.h
avio_internal.h
av_always_inline
#define av_always_inline
Definition: attributes.h:49
demux.h
ret
ret
Definition: filter_design.txt:187
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:231
avformat.h
SYNC_MLP
#define SYNC_MLP
Definition: mlp.h:29
mlp_samplerate
static int mlp_samplerate(int in)
Definition: mlp_parse.h:87
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:612
mlp.h
FFInputFormat
Definition: demux.h:42
ff_mlp_demuxer
const FFInputFormat ff_mlp_demuxer
read
static uint32_t BS_FUNC() read(BSCTX *bc, unsigned int n)
Return n bits from the buffer, n has to be in the 0-32 range.
Definition: bitstream_template.h:231
AV_CODEC_ID_MLP
@ AV_CODEC_ID_MLP
Definition: codec_id.h:475
AV_RB16
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_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
Definition: bytestream.h:98