FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavformat
dtshddec.c
Go to the documentation of this file.
1
/*
2
* Raw DTS-HD demuxer
3
* Copyright (c) 2012 Paul B Mahol
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include "
libavutil/intreadwrite.h
"
23
#include "
libavutil/dict.h
"
24
#include "
avformat.h
"
25
26
#define AUPR_HDR 0x415550522D484452
27
#define AUPRINFO 0x41555052494E464F
28
#define BITSHVTB 0x4249545348565442
29
#define BLACKOUT 0x424C41434B4F5554
30
#define BRANCHPT 0x4252414E43485054
31
#define BUILDVER 0x4255494C44564552
32
#define CORESSMD 0x434F524553534D44
33
#define DTSHDHDR 0x4454534844484452
34
#define EXTSS_MD 0x45585453535f4d44
35
#define FILEINFO 0x46494C45494E464F
36
#define NAVI_TBL 0x4E4156492D54424C
37
#define STRMDATA 0x5354524D44415441
38
#define TIMECODE 0x54494D45434F4445
39
40
typedef
struct
DTSHDDemuxContext
{
41
uint64_t
data_end
;
42
}
DTSHDDemuxContext
;
43
44
static
int
dtshd_probe
(
AVProbeData
*p)
45
{
46
if
(
AV_RB64
(p->
buf
) ==
DTSHDHDR
)
47
return
AVPROBE_SCORE_MAX
;
48
return
0;
49
}
50
51
static
int
dtshd_read_header
(
AVFormatContext
*
s
)
52
{
53
DTSHDDemuxContext
*dtshd = s->
priv_data
;
54
AVIOContext
*pb = s->
pb
;
55
uint64_t chunk_type, chunk_size;
56
AVStream
*st;
57
int
ret
;
58
char
*
value
;
59
60
st =
avformat_new_stream
(s, NULL);
61
if
(!st)
62
return
AVERROR
(ENOMEM);
63
st->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
64
st->
codec
->
codec_id
=
AV_CODEC_ID_DTS
;
65
st->
need_parsing
=
AVSTREAM_PARSE_FULL_RAW
;
66
67
while
(!
url_feof
(pb)) {
68
chunk_type =
avio_rb64
(pb);
69
chunk_size =
avio_rb64
(pb);
70
71
if
(chunk_size < 4) {
72
av_log
(s,
AV_LOG_ERROR
,
"chunk size too small\n"
);
73
return
AVERROR_INVALIDDATA
;
74
}
75
if
(chunk_size > ((uint64_t)1 << 61)) {
76
av_log
(s,
AV_LOG_ERROR
,
"chunk size too big\n"
);
77
return
AVERROR_INVALIDDATA
;
78
}
79
80
switch
(chunk_type) {
81
case
STRMDATA
:
82
dtshd->
data_end
= chunk_size +
avio_tell
(pb);
83
if
(dtshd->
data_end
<= chunk_size)
84
return
AVERROR_INVALIDDATA
;
85
return
0;
86
break
;
87
case
FILEINFO
:
88
if
(chunk_size > INT_MAX)
89
goto
skip;
90
value =
av_malloc
(chunk_size);
91
if
(!value)
92
goto
skip;
93
avio_read
(pb, value, chunk_size);
94
value[chunk_size - 1] = 0;
95
av_dict_set
(&s->
metadata
,
"fileinfo"
, value,
96
AV_DICT_DONT_STRDUP_VAL
);
97
break
;
98
default
:
99
skip:
100
ret =
avio_skip
(pb, chunk_size);
101
if
(ret < 0)
102
return
ret
;
103
};
104
}
105
106
return
AVERROR_EOF
;
107
}
108
109
static
int
raw_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
110
{
111
DTSHDDemuxContext
*dtshd = s->
priv_data
;
112
int64_t
size
, left;
113
int
ret
;
114
115
left = dtshd->
data_end
-
avio_tell
(s->
pb
);
116
size =
FFMIN
(left, 1024);
117
if
(size <= 0)
118
return
AVERROR_EOF
;
119
120
ret =
av_get_packet
(s->
pb
, pkt, size);
121
if
(ret < 0)
122
return
ret
;
123
124
pkt->
stream_index
= 0;
125
126
return
ret
;
127
}
128
129
AVInputFormat
ff_dtshd_demuxer
= {
130
.
name
=
"dtshd"
,
131
.long_name =
NULL_IF_CONFIG_SMALL
(
"raw DTS-HD"
),
132
.priv_data_size =
sizeof
(
DTSHDDemuxContext
),
133
.
read_probe
=
dtshd_probe
,
134
.
read_header
=
dtshd_read_header
,
135
.
read_packet
=
raw_read_packet
,
136
.
flags
=
AVFMT_GENERIC_INDEX
,
137
.extensions =
"dtshd"
,
138
.raw_codec_id =
AV_CODEC_ID_DTS
,
139
};
Generated on Sun Mar 23 2014 23:50:10 for FFmpeg by
1.8.2