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 "internal.h"
29 #include "rawdec.h"
30 #include "libavutil/intreadwrite.h"
31 #include "libavcodec/mlp.h"
32 #include "libavcodec/mlp_parse.h"
33 
34 static int av_always_inline mlp_thd_probe(const AVProbeData *p, uint32_t sync)
35 {
36  const uint8_t *buf, *last_buf = p->buf, *end = p->buf + p->buf_size;
37  int valid = 0, size = 0;
38  int nsubframes = 0;
39 
40  for (buf = p->buf; buf + 8 <= end; buf++) {
41  if (AV_RB32(buf + 4) == sync) {
42  if (last_buf + size == buf) {
43  valid += 1 + nsubframes / 8;
44  }
45  nsubframes = 0;
46  last_buf = buf;
47  size = (AV_RB16(buf) & 0xfff) * 2;
48  } else if (buf - last_buf == size) {
49  nsubframes++;
50  size += (AV_RB16(buf) & 0xfff) * 2;
51  }
52  }
53  if (valid >= 100)
54  return AVPROBE_SCORE_MAX;
55  return 0;
56 }
57 
59 {
61 
62  if (ret < 0)
63  return ret;
64 
65  ret = ffio_ensure_seekback(s->pb, 10);
66  if (ret == 0) {
67  uint8_t buffer[10];
68  int read, sample_rate = 0;
69 
70  read = avio_read(s->pb, buffer, 10);
71  if (read == 10) {
72  switch (buffer[7]) {
73  case SYNC_TRUEHD:
75  break;
76  case SYNC_MLP:
78  break;
79  }
80 
81  if (sample_rate)
82  avpriv_set_pts_info(s->streams[0], 64, 1, sample_rate);
83  }
84 
85  if (read > 0)
86  avio_seek(s->pb, -read, SEEK_CUR);
87  }
88 
89  return 0;
90 }
91 
92 #if CONFIG_MLP_DEMUXER
93 static int mlp_probe(const AVProbeData *p)
94 {
95  return mlp_thd_probe(p, 0xf8726fbb);
96 }
97 
99  .name = "mlp",
100  .long_name = NULL_IF_CONFIG_SMALL("raw MLP"),
101  .read_probe = mlp_probe,
102  .read_header = mlp_read_header,
103  .read_packet = ff_raw_read_partial_packet,
105  .extensions = "mlp",
106  .raw_codec_id = AV_CODEC_ID_MLP,
107  .priv_data_size = sizeof(FFRawDemuxerContext),
108  .priv_class = &ff_raw_demuxer_class,
109 };
110 #endif
111 
112 #if CONFIG_TRUEHD_DEMUXER
113 static int thd_probe(const AVProbeData *p)
114 {
115  return mlp_thd_probe(p, 0xf8726fba);
116 }
117 
119  .name = "truehd",
120  .long_name = NULL_IF_CONFIG_SMALL("raw TrueHD"),
121  .read_probe = thd_probe,
122  .read_header = mlp_read_header,
123  .read_packet = ff_raw_read_partial_packet,
125  .extensions = "thd",
126  .raw_codec_id = AV_CODEC_ID_TRUEHD,
127  .priv_data_size = sizeof(FFRawDemuxerContext),
128  .priv_class = &ff_raw_demuxer_class,
129 };
130 #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:34
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:482
sample_rate
sample_rate
Definition: ffmpeg_filter.c:156
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:771
ff_mlp_demuxer
const AVInputFormat ff_mlp_demuxer
SYNC_TRUEHD
#define SYNC_TRUEHD
Definition: mlp.h:30
FFRawDemuxerContext
Definition: rawdec.h:36
AVFMT_GENERIC_INDEX
#define AVFMT_GENERIC_INDEX
Use generic index building code.
Definition: avformat.h:480
AVInputFormat
Definition: avformat.h:546
ff_raw_read_partial_packet
int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
Definition: rawdec.c:34
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:256
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:551
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 AVInputFormat ff_truehd_demuxer
ff_raw_demuxer_class
const AVClass ff_raw_demuxer_class
Definition: rawdec.c:142
AVFormatContext
Format I/O context.
Definition: avformat.h:1104
internal.h
rawdec.h
ff_raw_audio_read_header
int ff_raw_audio_read_header(AVFormatContext *s)
Definition: rawdec.c:55
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:115
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
mlp_read_header
static int mlp_read_header(AVFormatContext *s)
Definition: mlpdec.c:58
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:1047
mlp_parse.h
avio_internal.h
av_always_inline
#define av_always_inline
Definition: attributes.h:49
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:252
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:633
mlp.h
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:467
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