Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
21732063
Commit
21732063
authored
Jul 07, 2013
by
Martin Storsjö
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
movenc: K&R formatting cosmetics
Signed-off-by:
Martin Storsjö
<
martin@martin.st
>
parent
38e9585d
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
198 additions
and
197 deletions
+198
-197
movenc.c
libavformat/movenc.c
+189
-189
movenchint.c
libavformat/movenchint.c
+9
-8
No files found.
libavformat/movenc.c
View file @
21732063
...
...
@@ -95,8 +95,8 @@ static int mov_write_stco_tag(AVIOContext *pb, MOVTrack *track)
ffio_wfourcc
(
pb
,
"stco"
);
avio_wb32
(
pb
,
0
);
/* version & flags */
avio_wb32
(
pb
,
track
->
entry
);
/* entry count */
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
if
(
mode64
==
1
)
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
if
(
mode64
==
1
)
avio_wb64
(
pb
,
track
->
cluster
[
i
].
pos
+
track
->
data_offset
);
else
avio_wb32
(
pb
,
track
->
cluster
[
i
].
pos
+
track
->
data_offset
);
...
...
@@ -115,27 +115,25 @@ static int mov_write_stsz_tag(AVIOContext *pb, MOVTrack *track)
ffio_wfourcc
(
pb
,
"stsz"
);
avio_wb32
(
pb
,
0
);
/* version & flags */
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
tst
=
track
->
cluster
[
i
].
size
/
track
->
cluster
[
i
].
entries
;
if
(
oldtst
!=
-
1
&&
tst
!=
oldtst
)
{
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
tst
=
track
->
cluster
[
i
].
size
/
track
->
cluster
[
i
].
entries
;
if
(
oldtst
!=
-
1
&&
tst
!=
oldtst
)
equalChunks
=
0
;
}
oldtst
=
tst
;
entries
+=
track
->
cluster
[
i
].
entries
;
}
if
(
equalChunks
&&
track
->
entry
)
{
int
sSize
=
track
->
entry
?
track
->
cluster
[
0
].
size
/
track
->
cluster
[
0
].
entries
:
0
;
int
sSize
=
track
->
entry
?
track
->
cluster
[
0
].
size
/
track
->
cluster
[
0
].
entries
:
0
;
sSize
=
FFMAX
(
1
,
sSize
);
// adpcm mono case could make sSize == 0
avio_wb32
(
pb
,
sSize
);
// sample size
avio_wb32
(
pb
,
entries
);
// sample count
}
else
{
}
else
{
avio_wb32
(
pb
,
0
);
// sample size
avio_wb32
(
pb
,
entries
);
// sample count
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
for
(
j
=
0
;
j
<
track
->
cluster
[
i
].
entries
;
j
++
)
{
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
for
(
j
=
0
;
j
<
track
->
cluster
[
i
].
entries
;
j
++
)
{
avio_wb32
(
pb
,
track
->
cluster
[
i
].
size
/
track
->
cluster
[
i
].
entries
);
track
->
cluster
[
i
].
entries
);
}
}
}
...
...
@@ -154,10 +152,9 @@ static int mov_write_stsc_tag(AVIOContext *pb, MOVTrack *track)
avio_wb32
(
pb
,
0
);
// version & flags
entryPos
=
avio_tell
(
pb
);
avio_wb32
(
pb
,
track
->
entry
);
// entry count
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
if
(
oldval
!=
track
->
cluster
[
i
].
samples_in_chunk
)
{
avio_wb32
(
pb
,
i
+
1
);
// first chunk
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
if
(
oldval
!=
track
->
cluster
[
i
].
samples_in_chunk
)
{
avio_wb32
(
pb
,
i
+
1
);
// first chunk
avio_wb32
(
pb
,
track
->
cluster
[
i
].
samples_in_chunk
);
// samples per chunk
avio_wb32
(
pb
,
0x1
);
// sample description index
oldval
=
track
->
cluster
[
i
].
samples_in_chunk
;
...
...
@@ -183,9 +180,9 @@ static int mov_write_stss_tag(AVIOContext *pb, MOVTrack *track, uint32_t flag)
avio_wb32
(
pb
,
0
);
// version & flags
entryPos
=
avio_tell
(
pb
);
avio_wb32
(
pb
,
track
->
entry
);
// entry count
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
if
(
track
->
cluster
[
i
].
flags
&
flag
)
{
avio_wb32
(
pb
,
i
+
1
);
avio_wb32
(
pb
,
i
+
1
);
index
++
;
}
}
...
...
@@ -245,7 +242,7 @@ static int mov_write_ac3_tag(AVIOContext *pb, MOVTrack *track)
put_bits
(
&
pbc
,
3
,
bsmod
);
put_bits
(
&
pbc
,
3
,
acmod
);
put_bits
(
&
pbc
,
1
,
lfeon
);
put_bits
(
&
pbc
,
5
,
frmsizecod
>>
1
);
// bit_rate_code
put_bits
(
&
pbc
,
5
,
frmsizecod
>>
1
);
// bit_rate_code
put_bits
(
&
pbc
,
5
,
0
);
// reserved
flush_put_bits
(
&
pbc
);
...
...
@@ -268,8 +265,8 @@ static void put_descr(AVIOContext *pb, int tag, unsigned int size)
{
int
i
=
3
;
avio_w8
(
pb
,
tag
);
for
(;
i
>
0
;
i
--
)
avio_w8
(
pb
,
(
size
>>
(
7
*
i
))
|
0x80
);
for
(;
i
>
0
;
i
--
)
avio_w8
(
pb
,
(
size
>>
(
7
*
i
))
|
0x80
);
avio_w8
(
pb
,
size
&
0x7F
);
}
...
...
@@ -300,7 +297,7 @@ static int mov_write_esds_tag(AVIOContext *pb, MOVTrack *track) // Basic
// the following fields is made of 6 bits to identify the streamtype (4 for video, 5 for audio)
// plus 1 bit to indicate upstream and 1 bit set to 1 (reserved)
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
avio_w8
(
pb
,
0x15
);
// flags (= Audiostream)
else
avio_w8
(
pb
,
0x11
);
// flags (= Visualstream)
...
...
@@ -308,7 +305,8 @@ static int mov_write_esds_tag(AVIOContext *pb, MOVTrack *track) // Basic
avio_wb24
(
pb
,
track
->
enc
->
rc_buffer_size
>>
3
);
// Buffersize DB
avio_wb32
(
pb
,
FFMAX
(
track
->
enc
->
bit_rate
,
track
->
enc
->
rc_max_rate
));
// maxbitrate (FIXME should be max rate in any 1 sec window)
if
(
track
->
enc
->
rc_max_rate
!=
track
->
enc
->
rc_min_rate
||
track
->
enc
->
rc_min_rate
==
0
)
if
(
track
->
enc
->
rc_max_rate
!=
track
->
enc
->
rc_min_rate
||
track
->
enc
->
rc_min_rate
==
0
)
avio_wb32
(
pb
,
0
);
// vbr
else
avio_wb32
(
pb
,
track
->
enc
->
rc_max_rate
);
// avg bitrate
...
...
@@ -615,21 +613,21 @@ static int mov_write_audio_tag(AVIOContext *pb, MOVTrack *track)
avio_wb16
(
pb
,
0
);
/* Reserved */
}
if
(
track
->
mode
==
MODE_MOV
&&
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_AAC
||
track
->
enc
->
codec_id
==
AV_CODEC_ID_AC3
||
track
->
enc
->
codec_id
==
AV_CODEC_ID_AMR_NB
||
track
->
enc
->
codec_id
==
AV_CODEC_ID_ALAC
||
track
->
enc
->
codec_id
==
AV_CODEC_ID_ADPCM_MS
||
track
->
enc
->
codec_id
==
AV_CODEC_ID_ADPCM_IMA_WAV
))
if
(
track
->
mode
==
MODE_MOV
&&
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_AAC
||
track
->
enc
->
codec_id
==
AV_CODEC_ID_AC3
||
track
->
enc
->
codec_id
==
AV_CODEC_ID_AMR_NB
||
track
->
enc
->
codec_id
==
AV_CODEC_ID_ALAC
||
track
->
enc
->
codec_id
==
AV_CODEC_ID_ADPCM_MS
||
track
->
enc
->
codec_id
==
AV_CODEC_ID_ADPCM_IMA_WAV
))
mov_write_wave_tag
(
pb
,
track
);
else
if
(
track
->
tag
==
MKTAG
(
'm'
,
'p'
,
'4'
,
'a'
))
else
if
(
track
->
tag
==
MKTAG
(
'm'
,
'p'
,
'4'
,
'a'
))
mov_write_esds_tag
(
pb
,
track
);
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_AMR_NB
)
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_AMR_NB
)
mov_write_amr_tag
(
pb
,
track
);
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_AC3
)
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_AC3
)
mov_write_ac3_tag
(
pb
,
track
);
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_ALAC
)
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_ALAC
)
mov_write_extradata_tag
(
pb
,
track
);
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_WMAPRO
)
mov_write_wfex_tag
(
pb
,
track
);
...
...
@@ -703,7 +701,7 @@ static int mov_write_avid_tag(AVIOContext *pb, MOVTrack *track)
avio_wb32
(
pb
,
track
->
enc
->
width
);
/* values below are based on samples created with quicktime and avid codecs */
if
(
track
->
vos_data
[
5
]
&
2
)
{
// interlaced
avio_wb32
(
pb
,
track
->
enc
->
height
/
2
);
avio_wb32
(
pb
,
track
->
enc
->
height
/
2
);
avio_wb32
(
pb
,
2
);
/* unknown */
avio_wb32
(
pb
,
0
);
/* unknown */
avio_wb32
(
pb
,
4
);
/* unknown */
...
...
@@ -737,18 +735,18 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_DIRAC
)
tag
=
MKTAG
(
'd'
,
'r'
,
'a'
,
'c'
);
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_MOV_TEXT
)
tag
=
MKTAG
(
't'
,
'x'
,
'3'
,
'g'
);
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_VC1
)
tag
=
MKTAG
(
'v'
,
'c'
,
'-'
,
'1'
);
else
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_VIDEO
)
tag
=
MKTAG
(
'm'
,
'p'
,
'4'
,
'v'
);
else
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
tag
=
MKTAG
(
'm'
,
'p'
,
'4'
,
'a'
);
else
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_VIDEO
)
tag
=
MKTAG
(
'm'
,
'p'
,
'4'
,
'v'
);
else
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
tag
=
MKTAG
(
'm'
,
'p'
,
'4'
,
'a'
);
return
tag
;
}
static
const
AVCodecTag
codec_ipod_tags
[]
=
{
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'v'
,
'c'
,
'1'
)
},
{
AV_CODEC_ID_MPEG4
,
MKTAG
(
'm'
,
'p'
,
'4'
,
'v'
)
},
{
AV_CODEC_ID_AAC
,
MKTAG
(
'm'
,
'p'
,
'4'
,
'a'
)
},
{
AV_CODEC_ID_ALAC
,
MKTAG
(
'a'
,
'l'
,
'a'
,
'c'
)
},
{
AV_CODEC_ID_AC3
,
MKTAG
(
'a'
,
'c'
,
'-'
,
'3'
)
},
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'v'
,
'c'
,
'1'
)
},
{
AV_CODEC_ID_MPEG4
,
MKTAG
(
'm'
,
'p'
,
'4'
,
'v'
)
},
{
AV_CODEC_ID_AAC
,
MKTAG
(
'm'
,
'p'
,
'4'
,
'a'
)
},
{
AV_CODEC_ID_ALAC
,
MKTAG
(
'a'
,
'l'
,
'a'
,
'c'
)
},
{
AV_CODEC_ID_AC3
,
MKTAG
(
'a'
,
'c'
,
'-'
,
'3'
)
},
{
AV_CODEC_ID_MOV_TEXT
,
MKTAG
(
't'
,
'x'
,
'3'
,
'g'
)
},
{
AV_CODEC_ID_MOV_TEXT
,
MKTAG
(
't'
,
'e'
,
'x'
,
't'
)
},
{
AV_CODEC_ID_NONE
,
0
},
...
...
@@ -760,8 +758,8 @@ static int ipod_get_codec_tag(AVFormatContext *s, MOVTrack *track)
// keep original tag for subs, ipod supports both formats
if
(
!
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_SUBTITLE
&&
(
tag
==
MKTAG
(
't'
,
'x'
,
'3'
,
'g'
)
||
tag
==
MKTAG
(
't'
,
'e'
,
'x'
,
't'
))))
(
tag
==
MKTAG
(
't'
,
'x'
,
'3'
,
'g'
)
||
tag
==
MKTAG
(
't'
,
'e'
,
'x'
,
't'
))))
tag
=
ff_codec_get_tag
(
codec_ipod_tags
,
track
->
enc
->
codec_id
);
if
(
!
av_match_ext
(
s
->
filename
,
"m4a"
)
&&
!
av_match_ext
(
s
->
filename
,
"m4v"
))
...
...
@@ -778,16 +776,16 @@ static int mov_get_dv_codec_tag(AVFormatContext *s, MOVTrack *track)
if
(
track
->
enc
->
width
==
720
)
/* SD */
if
(
track
->
enc
->
height
==
480
)
/* NTSC */
if
(
track
->
enc
->
pix_fmt
==
AV_PIX_FMT_YUV422P
)
tag
=
MKTAG
(
'd'
,
'v'
,
'5'
,
'n'
);
else
tag
=
MKTAG
(
'd'
,
'v'
,
'c'
,
' '
);
else
tag
=
MKTAG
(
'd'
,
'v'
,
'c'
,
' '
);
else
if
(
track
->
enc
->
pix_fmt
==
AV_PIX_FMT_YUV422P
)
tag
=
MKTAG
(
'd'
,
'v'
,
'5'
,
'p'
);
else
if
(
track
->
enc
->
pix_fmt
==
AV_PIX_FMT_YUV420P
)
tag
=
MKTAG
(
'd'
,
'v'
,
'c'
,
'p'
);
else
tag
=
MKTAG
(
'd'
,
'v'
,
'p'
,
'p'
);
else
tag
=
MKTAG
(
'd'
,
'v'
,
'p'
,
'p'
);
else
if
(
track
->
enc
->
height
==
720
)
/* HD 720 line */
if
(
track
->
enc
->
time_base
.
den
==
50
)
tag
=
MKTAG
(
'd'
,
'v'
,
'h'
,
'q'
);
else
tag
=
MKTAG
(
'd'
,
'v'
,
'h'
,
'p'
);
if
(
track
->
enc
->
time_base
.
den
==
50
)
tag
=
MKTAG
(
'd'
,
'v'
,
'h'
,
'q'
);
else
tag
=
MKTAG
(
'd'
,
'v'
,
'h'
,
'p'
);
else
if
(
track
->
enc
->
height
==
1080
)
/* HD 1080 line */
if
(
track
->
enc
->
time_base
.
den
==
25
)
tag
=
MKTAG
(
'd'
,
'v'
,
'h'
,
'5'
);
else
tag
=
MKTAG
(
'd'
,
'v'
,
'h'
,
'6'
);
if
(
track
->
enc
->
time_base
.
den
==
25
)
tag
=
MKTAG
(
'd'
,
'v'
,
'h'
,
'5'
);
else
tag
=
MKTAG
(
'd'
,
'v'
,
'h'
,
'6'
);
else
{
av_log
(
s
,
AV_LOG_ERROR
,
"unsupported height for dv codec
\n
"
);
return
0
;
...
...
@@ -872,12 +870,12 @@ static int mov_get_codec_tag(AVFormatContext *s, MOVTrack *track)
}
static
const
AVCodecTag
codec_3gp_tags
[]
=
{
{
AV_CODEC_ID_H263
,
MKTAG
(
's'
,
'2'
,
'6'
,
'3'
)
},
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'v'
,
'c'
,
'1'
)
},
{
AV_CODEC_ID_MPEG4
,
MKTAG
(
'm'
,
'p'
,
'4'
,
'v'
)
},
{
AV_CODEC_ID_AAC
,
MKTAG
(
'm'
,
'p'
,
'4'
,
'a'
)
},
{
AV_CODEC_ID_AMR_NB
,
MKTAG
(
's'
,
'a'
,
'm'
,
'r'
)
},
{
AV_CODEC_ID_AMR_WB
,
MKTAG
(
's'
,
'a'
,
'w'
,
'b'
)
},
{
AV_CODEC_ID_H263
,
MKTAG
(
's'
,
'2'
,
'6'
,
'3'
)
},
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'v'
,
'c'
,
'1'
)
},
{
AV_CODEC_ID_MPEG4
,
MKTAG
(
'm'
,
'p'
,
'4'
,
'v'
)
},
{
AV_CODEC_ID_AAC
,
MKTAG
(
'm'
,
'p'
,
'4'
,
'a'
)
},
{
AV_CODEC_ID_AMR_NB
,
MKTAG
(
's'
,
'a'
,
'm'
,
'r'
)
},
{
AV_CODEC_ID_AMR_WB
,
MKTAG
(
's'
,
'a'
,
'w'
,
'b'
)
},
{
AV_CODEC_ID_MOV_TEXT
,
MKTAG
(
't'
,
'x'
,
'3'
,
'g'
)
},
{
AV_CODEC_ID_NONE
,
0
},
};
...
...
@@ -978,7 +976,7 @@ static int mov_write_video_tag(AVIOContext *pb, MOVTrack *track)
avio_wb16
(
pb
,
0
);
/* Codec stream revision (=0) */
if
(
track
->
mode
==
MODE_MOV
)
{
ffio_wfourcc
(
pb
,
"FFMP"
);
/* Vendor */
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_RAWVIDEO
)
{
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_RAWVIDEO
)
{
avio_wb32
(
pb
,
0
);
/* Temporal Quality */
avio_wb32
(
pb
,
0x400
);
/* Spatial Quality = lossless*/
}
else
{
...
...
@@ -999,7 +997,7 @@ static int mov_write_video_tag(AVIOContext *pb, MOVTrack *track)
/* FIXME not sure, ISO 14496-1 draft where it shall be set to 0 */
if
(
track
->
mode
==
MODE_MOV
&&
track
->
enc
->
codec
&&
track
->
enc
->
codec
->
name
)
av_strlcpy
(
compressor_name
,
track
->
enc
->
codec
->
name
,
32
);
av_strlcpy
(
compressor_name
,
track
->
enc
->
codec
->
name
,
32
);
avio_w8
(
pb
,
strlen
(
compressor_name
));
avio_write
(
pb
,
compressor_name
,
31
);
...
...
@@ -1008,17 +1006,17 @@ static int mov_write_video_tag(AVIOContext *pb, MOVTrack *track)
else
avio_wb16
(
pb
,
0x18
);
/* Reserved */
avio_wb16
(
pb
,
0xffff
);
/* Reserved */
if
(
track
->
tag
==
MKTAG
(
'm'
,
'p'
,
'4'
,
'v'
))
if
(
track
->
tag
==
MKTAG
(
'm'
,
'p'
,
'4'
,
'v'
))
mov_write_esds_tag
(
pb
,
track
);
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_H263
)
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_H263
)
mov_write_d263_tag
(
pb
);
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_SVQ3
)
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_SVQ3
)
mov_write_svq3_tag
(
pb
);
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_DNXHD
)
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_DNXHD
)
mov_write_avid_tag
(
pb
,
track
);
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_H264
)
{
else
if
(
track
->
enc
->
codec_id
==
AV_CODEC_ID_H264
)
{
mov_write_avcc_tag
(
pb
,
track
);
if
(
track
->
mode
==
MODE_IPOD
)
if
(
track
->
mode
==
MODE_IPOD
)
mov_write_uuid_tag_ipod
(
pb
);
}
else
if
(
track
->
enc
->
field_order
!=
AV_FIELD_UNKNOWN
)
mov_write_fiel_tag
(
pb
,
track
);
...
...
@@ -1083,7 +1081,7 @@ static int mov_write_ctts_tag(AVIOContext *pb, MOVTrack *track)
ctts_entries
=
av_malloc
((
track
->
entry
+
1
)
*
sizeof
(
*
ctts_entries
));
/* worst case */
ctts_entries
[
0
].
count
=
1
;
ctts_entries
[
0
].
duration
=
track
->
cluster
[
0
].
cts
;
for
(
i
=
1
;
i
<
track
->
entry
;
i
++
)
{
for
(
i
=
1
;
i
<
track
->
entry
;
i
++
)
{
if
(
track
->
cluster
[
i
].
cts
==
ctts_entries
[
entries
].
duration
)
{
ctts_entries
[
entries
].
count
++
;
/* compress */
}
else
{
...
...
@@ -1098,7 +1096,7 @@ static int mov_write_ctts_tag(AVIOContext *pb, MOVTrack *track)
ffio_wfourcc
(
pb
,
"ctts"
);
avio_wb32
(
pb
,
0
);
/* version & flags */
avio_wb32
(
pb
,
entries
);
/* entry count */
for
(
i
=
0
;
i
<
entries
;
i
++
)
{
for
(
i
=
0
;
i
<
entries
;
i
++
)
{
avio_wb32
(
pb
,
ctts_entries
[
i
].
count
);
avio_wb32
(
pb
,
ctts_entries
[
i
].
duration
);
}
...
...
@@ -1123,7 +1121,7 @@ static int mov_write_stts_tag(AVIOContext *pb, MOVTrack *track)
stts_entries
=
track
->
entry
?
av_malloc
(
track
->
entry
*
sizeof
(
*
stts_entries
))
:
/* worst case */
NULL
;
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
int
duration
=
get_cluster_duration
(
track
,
i
);
if
(
i
&&
duration
==
stts_entries
[
entries
].
duration
)
{
stts_entries
[
entries
].
count
++
;
/* compress */
...
...
@@ -1140,7 +1138,7 @@ static int mov_write_stts_tag(AVIOContext *pb, MOVTrack *track)
ffio_wfourcc
(
pb
,
"stts"
);
avio_wb32
(
pb
,
0
);
/* version & flags */
avio_wb32
(
pb
,
entries
);
/* entry count */
for
(
i
=
0
;
i
<
entries
;
i
++
)
{
for
(
i
=
0
;
i
<
entries
;
i
++
)
{
avio_wb32
(
pb
,
stts_entries
[
i
].
count
);
avio_wb32
(
pb
,
stts_entries
[
i
].
duration
);
}
...
...
@@ -1242,24 +1240,24 @@ static int mov_write_hdlr_tag(AVIOContext *pb, MOVTrack *track)
int64_t
pos
=
avio_tell
(
pb
);
if
(
!
track
)
{
/* no media --> data handler */
hdlr
=
"dhlr"
;
hdlr
=
"dhlr"
;
hdlr_type
=
"url "
;
descr
=
"DataHandler"
;
descr
=
"DataHandler"
;
}
else
{
hdlr
=
(
track
->
mode
==
MODE_MOV
)
?
"mhlr"
:
"
\0\0\0\0
"
;
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_VIDEO
)
{
hdlr_type
=
"vide"
;
descr
=
"VideoHandler"
;
descr
=
"VideoHandler"
;
}
else
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
{
hdlr_type
=
"soun"
;
descr
=
"SoundHandler"
;
descr
=
"SoundHandler"
;
}
else
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_SUBTITLE
)
{
if
(
track
->
tag
==
MKTAG
(
't'
,
'x'
,
'3'
,
'g'
))
hdlr_type
=
"sbtl"
;
else
hdlr_type
=
"text"
;
descr
=
"SubtitleHandler"
;
}
else
if
(
track
->
enc
->
codec_tag
==
MKTAG
(
'r'
,
't'
,
'p'
,
' '
))
{
hdlr_type
=
"hint"
;
descr
=
"HintHandler"
;
descr
=
"HintHandler"
;
}
}
...
...
@@ -1268,9 +1266,9 @@ static int mov_write_hdlr_tag(AVIOContext *pb, MOVTrack *track)
avio_wb32
(
pb
,
0
);
/* Version & flags */
avio_write
(
pb
,
hdlr
,
4
);
/* handler */
ffio_wfourcc
(
pb
,
hdlr_type
);
/* handler type */
avio_wb32
(
pb
,
0
);
/* reserved */
avio_wb32
(
pb
,
0
);
/* reserved */
avio_wb32
(
pb
,
0
);
/* reserved */
avio_wb32
(
pb
,
0
);
/* reserved */
avio_wb32
(
pb
,
0
);
/* reserved */
avio_wb32
(
pb
,
0
);
/* reserved */
if
(
!
track
||
track
->
mode
==
MODE_MOV
)
avio_w8
(
pb
,
strlen
(
descr
));
/* pascal string */
avio_write
(
pb
,
descr
,
strlen
(
descr
));
/* handler description */
...
...
@@ -1299,7 +1297,7 @@ static int mov_write_minf_tag(AVIOContext *pb, MOVTrack *track)
int64_t
pos
=
avio_tell
(
pb
);
avio_wb32
(
pb
,
0
);
/* size */
ffio_wfourcc
(
pb
,
"minf"
);
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_VIDEO
)
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_VIDEO
)
mov_write_vmhd_tag
(
pb
);
else
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
mov_write_smhd_tag
(
pb
);
...
...
@@ -1342,11 +1340,11 @@ static int mov_write_mdhd_tag(AVIOContext *pb, MOVTrack *track)
avio_wb16
(
pb
,
track
->
language
);
/* language */
avio_wb16
(
pb
,
0
);
/* reserved (quality) */
if
(
version
!=
0
&&
track
->
mode
==
MODE_MOV
)
{
if
(
version
!=
0
&&
track
->
mode
==
MODE_MOV
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"FATAL error, file duration too long for timebase, this file will not be
\n
"
"playable with quicktime. Choose a different timebase or a different
\n
"
"container format
\n
"
);
"FATAL error, file duration too long for timebase, this file will not be
\n
"
"playable with quicktime. Choose a different timebase or a different
\n
"
"container format
\n
"
);
}
return
32
;
...
...
@@ -1395,7 +1393,7 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVTrack *track, AVStream *st)
avio_wb16
(
pb
,
0
);
/* layer */
avio_wb16
(
pb
,
st
?
st
->
codec
->
codec_type
:
0
);
/* alternate group) */
/* Volume, only for audio */
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
avio_wb16
(
pb
,
0x0100
);
else
avio_wb16
(
pb
,
0
);
...
...
@@ -1413,20 +1411,19 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVTrack *track, AVStream *st)
avio_wb32
(
pb
,
0x40000000
);
/* reserved */
/* Track width and height, for visual only */
if
(
st
&&
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_VIDEO
||
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_SUBTITLE
))
{
if
(
track
->
mode
==
MODE_MOV
)
{
if
(
st
&&
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_VIDEO
||
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_SUBTITLE
))
{
if
(
track
->
mode
==
MODE_MOV
)
{
avio_wb32
(
pb
,
track
->
enc
->
width
<<
16
);
avio_wb32
(
pb
,
track
->
height
<<
16
);
}
else
{
double
sample_aspect_ratio
=
av_q2d
(
st
->
sample_aspect_ratio
);
if
(
!
sample_aspect_ratio
||
track
->
height
!=
track
->
enc
->
height
)
if
(
!
sample_aspect_ratio
||
track
->
height
!=
track
->
enc
->
height
)
sample_aspect_ratio
=
1
;
avio_wb32
(
pb
,
sample_aspect_ratio
*
track
->
enc
->
width
*
0x10000
);
avio_wb32
(
pb
,
track
->
height
*
0x10000
);
avio_wb32
(
pb
,
sample_aspect_ratio
*
track
->
enc
->
width
*
0x10000
);
avio_wb32
(
pb
,
track
->
height
*
0x10000
);
}
}
else
{
}
else
{
avio_wb32
(
pb
,
0
);
avio_wb32
(
pb
,
0
);
}
...
...
@@ -1537,7 +1534,6 @@ static int mov_write_uuid_tag_psp(AVIOContext *pb, MOVTrack *mov)
static
int
mov_write_udta_sdp
(
AVIOContext
*
pb
,
MOVTrack
*
track
)
{
AVFormatContext
*
ctx
=
track
->
rtp_ctx
;
char
buf
[
1000
]
=
""
;
int
len
;
...
...
@@ -1573,14 +1569,14 @@ static int mov_write_trak_tag(AVIOContext *pb, MOVMuxContext *mov,
mov_write_tref_tag
(
pb
,
track
);
mov_write_mdia_tag
(
pb
,
track
);
if
(
track
->
mode
==
MODE_PSP
)
mov_write_uuid_tag_psp
(
pb
,
track
);
// PSP Movies require this uuid box
mov_write_uuid_tag_psp
(
pb
,
track
);
// PSP Movies require this uuid box
if
(
track
->
tag
==
MKTAG
(
'r'
,
't'
,
'p'
,
' '
))
mov_write_udta_sdp
(
pb
,
track
);
if
(
track
->
enc
->
codec_type
==
AVMEDIA_TYPE_VIDEO
&&
track
->
mode
==
MODE_MOV
)
{
double
sample_aspect_ratio
=
av_q2d
(
st
->
sample_aspect_ratio
);
if
(
0
.
0
!=
sample_aspect_ratio
&&
1
.
0
!=
sample_aspect_ratio
)
mov_write_tapt_tag
(
pb
,
track
);
}
;
}
return
update_size
(
pb
,
pos
);
}
...
...
@@ -1591,7 +1587,7 @@ static int mov_write_iods_tag(AVIOContext *pb, MOVMuxContext *mov)
int
audio_profile
=
mov
->
iods_audio_profile
;
int
video_profile
=
mov
->
iods_video_profile
;
for
(
i
=
0
;
i
<
mov
->
nb_streams
;
i
++
)
{
if
(
mov
->
tracks
[
i
].
entry
>
0
)
{
if
(
mov
->
tracks
[
i
].
entry
>
0
)
{
has_audio
|=
mov
->
tracks
[
i
].
enc
->
codec_type
==
AVMEDIA_TYPE_AUDIO
;
has_video
|=
mov
->
tracks
[
i
].
enc
->
codec_type
==
AVMEDIA_TYPE_VIDEO
;
}
...
...
@@ -1643,8 +1639,8 @@ static int mov_write_mvhd_tag(AVIOContext *pb, MOVMuxContext *mov)
int64_t
max_track_len_temp
,
max_track_len
=
0
;
int
version
;
for
(
i
=
0
;
i
<
mov
->
nb_streams
;
i
++
)
{
if
(
mov
->
tracks
[
i
].
entry
>
0
)
{
for
(
i
=
0
;
i
<
mov
->
nb_streams
;
i
++
)
{
if
(
mov
->
tracks
[
i
].
entry
>
0
)
{
max_track_len_temp
=
av_rescale_rnd
(
mov
->
tracks
[
i
].
track_duration
,
MOV_TIMESCALE
,
mov
->
tracks
[
i
].
timescale
,
...
...
@@ -1716,7 +1712,7 @@ static int mov_write_itunes_hdlr_tag(AVIOContext *pb, MOVMuxContext *mov,
/* helper function to write a data tag with the specified string as data */
static
int
mov_write_string_data_tag
(
AVIOContext
*
pb
,
const
char
*
data
,
int
lang
,
int
long_style
)
{
if
(
long_style
)
{
if
(
long_style
)
{
int
size
=
16
+
strlen
(
data
);
avio_wb32
(
pb
,
size
);
/* size */
ffio_wfourcc
(
pb
,
"data"
);
...
...
@@ -1724,7 +1720,7 @@ static int mov_write_string_data_tag(AVIOContext *pb, const char *data, int lang
avio_wb32
(
pb
,
0
);
avio_write
(
pb
,
data
,
strlen
(
data
));
return
size
;
}
else
{
}
else
{
if
(
!
lang
)
lang
=
ff_mov_iso639_to_lang
(
"und"
,
1
);
avio_wb16
(
pb
,
strlen
(
data
));
/* string length */
...
...
@@ -1734,7 +1730,9 @@ static int mov_write_string_data_tag(AVIOContext *pb, const char *data, int lang
}
}
static
int
mov_write_string_tag
(
AVIOContext
*
pb
,
const
char
*
name
,
const
char
*
value
,
int
lang
,
int
long_style
){
static
int
mov_write_string_tag
(
AVIOContext
*
pb
,
const
char
*
name
,
const
char
*
value
,
int
lang
,
int
long_style
)
{
int
size
=
0
;
if
(
value
&&
value
[
0
])
{
int64_t
pos
=
avio_tell
(
pb
);
...
...
@@ -1761,8 +1759,8 @@ static int mov_write_string_metadata(AVFormatContext *s, AVIOContext *pb,
snprintf
(
tag2
,
sizeof
(
tag2
),
"%s-"
,
tag
);
while
((
t2
=
av_dict_get
(
s
->
metadata
,
tag2
,
t2
,
AV_DICT_IGNORE_SUFFIX
)))
{
len2
=
strlen
(
t2
->
key
);
if
(
len2
==
len
+
4
&&
!
strcmp
(
t
->
value
,
t2
->
value
)
&&
(
l
=
ff_mov_iso639_to_lang
(
&
t2
->
key
[
len2
-
3
],
1
))
>=
0
)
{
if
(
len2
==
len
+
4
&&
!
strcmp
(
t
->
value
,
t2
->
value
)
&&
(
l
=
ff_mov_iso639_to_lang
(
&
t2
->
key
[
len2
-
3
],
1
))
>=
0
)
{
lang
=
l
;
break
;
}
...
...
@@ -1779,14 +1777,14 @@ static int mov_write_trkn_tag(AVIOContext *pb, MOVMuxContext *mov,
if
(
track
)
{
avio_wb32
(
pb
,
32
);
/* size */
ffio_wfourcc
(
pb
,
"trkn"
);
avio_wb32
(
pb
,
24
);
/* size */
ffio_wfourcc
(
pb
,
"data"
);
avio_wb32
(
pb
,
0
);
// 8 bytes empty
avio_wb32
(
pb
,
0
);
avio_wb16
(
pb
,
0
);
// empty
avio_wb16
(
pb
,
track
);
// track number
avio_wb16
(
pb
,
0
);
// total track number
avio_wb16
(
pb
,
0
);
// empty
avio_wb32
(
pb
,
24
);
/* size */
ffio_wfourcc
(
pb
,
"data"
);
avio_wb32
(
pb
,
0
);
// 8 bytes empty
avio_wb32
(
pb
,
0
);
avio_wb16
(
pb
,
0
);
// empty
avio_wb16
(
pb
,
track
);
// track number
avio_wb16
(
pb
,
0
);
// total track number
avio_wb16
(
pb
,
0
);
// empty
size
=
32
;
}
return
size
;
...
...
@@ -1837,9 +1835,9 @@ static int mov_write_meta_tag(AVIOContext *pb, MOVMuxContext *mov,
static
int
utf8len
(
const
uint8_t
*
b
)
{
int
len
=
0
;
int
len
=
0
;
int
val
;
while
(
*
b
)
{
while
(
*
b
)
{
GET_UTF8
(
val
,
*
b
++
,
return
-
1
;)
len
++
;
}
...
...
@@ -1849,7 +1847,7 @@ static int utf8len(const uint8_t *b)
static
int
ascii_to_wc
(
AVIOContext
*
pb
,
const
uint8_t
*
b
)
{
int
val
;
while
(
*
b
)
{
while
(
*
b
)
{
GET_UTF8
(
val
,
*
b
++
,
return
-
1
;)
avio_wb16
(
pb
,
val
);
}
...
...
@@ -1859,7 +1857,9 @@ static int ascii_to_wc(AVIOContext *pb, const uint8_t *b)
static
uint16_t
language_code
(
const
char
*
str
)
{
return
(((
str
[
0
]
-
0x60
)
&
0x1F
)
<<
10
)
+
(((
str
[
1
]
-
0x60
)
&
0x1F
)
<<
5
)
+
((
str
[
2
]
-
0x60
)
&
0x1F
);
return
(((
str
[
0
]
-
0x60
)
&
0x1F
)
<<
10
)
+
(((
str
[
1
]
-
0x60
)
&
0x1F
)
<<
5
)
+
((
str
[
2
]
-
0x60
)
&
0x1F
);
}
static
int
mov_write_3gp_udta_tag
(
AVIOContext
*
pb
,
AVFormatContext
*
s
,
...
...
@@ -1876,7 +1876,7 @@ static int mov_write_3gp_udta_tag(AVIOContext *pb, AVFormatContext *s,
avio_wb16
(
pb
,
atoi
(
t
->
value
));
else
{
avio_wb16
(
pb
,
language_code
(
"eng"
));
/* language */
avio_write
(
pb
,
t
->
value
,
strlen
(
t
->
value
)
+
1
);
/* UTF8 string value */
avio_write
(
pb
,
t
->
value
,
strlen
(
t
->
value
)
+
1
);
/* UTF8 string value */
if
(
!
strcmp
(
tag
,
"albm"
)
&&
(
t
=
av_dict_get
(
s
->
metadata
,
"track"
,
NULL
,
0
)))
avio_w8
(
pb
,
atoi
(
t
->
value
));
...
...
@@ -1923,38 +1923,38 @@ static int mov_write_udta_tag(AVIOContext *pb, MOVMuxContext *mov,
}
ret
=
avio_open_dyn_buf
(
&
pb_buf
);
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
if
(
mov
->
mode
&
MODE_3GP
)
{
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"perf"
,
"artist"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"titl"
,
"title"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"auth"
,
"author"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"gnre"
,
"genre"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"dscp"
,
"comment"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"albm"
,
"album"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"cprt"
,
"copyright"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"yrrc"
,
"date"
);
}
else
if
(
mov
->
mode
==
MODE_MOV
)
{
// the title field breaks gtkpod with mp4 and my suspicion is that stuff is not valid in mp4
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
ART"
,
"artist"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
nam"
,
"title"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
aut"
,
"author"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
alb"
,
"album"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
day"
,
"date"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
swr"
,
"encoder"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
des"
,
"comment"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
gen"
,
"genre"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
cpy"
,
"copyright"
,
0
);
}
else
{
/* iTunes meta data */
mov_write_meta_tag
(
pb_buf
,
mov
,
s
);
}
if
(
mov
->
mode
&
MODE_3GP
)
{
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"perf"
,
"artist"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"titl"
,
"title"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"auth"
,
"author"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"gnre"
,
"genre"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"dscp"
,
"comment"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"albm"
,
"album"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"cprt"
,
"copyright"
);
mov_write_3gp_udta_tag
(
pb_buf
,
s
,
"yrrc"
,
"date"
);
}
else
if
(
mov
->
mode
==
MODE_MOV
)
{
// the title field breaks gtkpod with mp4 and my suspicion is that stuff is not valid in mp4
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
ART"
,
"artist"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
nam"
,
"title"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
aut"
,
"author"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
alb"
,
"album"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
day"
,
"date"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
swr"
,
"encoder"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
des"
,
"comment"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
gen"
,
"genre"
,
0
);
mov_write_string_metadata
(
s
,
pb_buf
,
"
\251
cpy"
,
"copyright"
,
0
);
}
else
{
/* iTunes meta data */
mov_write_meta_tag
(
pb_buf
,
mov
,
s
);
}
if
(
s
->
nb_chapters
)
mov_write_chpl_tag
(
pb_buf
,
s
);
if
(
s
->
nb_chapters
)
mov_write_chpl_tag
(
pb_buf
,
s
);
if
((
size
=
avio_close_dyn_buf
(
pb_buf
,
&
buf
))
>
0
)
{
avio_wb32
(
pb
,
size
+
8
);
avio_wb32
(
pb
,
size
+
8
);
ffio_wfourcc
(
pb
,
"udta"
);
avio_write
(
pb
,
buf
,
size
);
}
...
...
@@ -1964,12 +1964,12 @@ static int mov_write_udta_tag(AVIOContext *pb, MOVMuxContext *mov,
}
static
void
mov_write_psp_udta_tag
(
AVIOContext
*
pb
,
const
char
*
str
,
const
char
*
lang
,
int
type
)
const
char
*
str
,
const
char
*
lang
,
int
type
)
{
int
len
=
utf8len
(
str
)
+
1
;
if
(
len
<=
0
)
int
len
=
utf8len
(
str
)
+
1
;
if
(
len
<=
0
)
return
;
avio_wb16
(
pb
,
len
*
2
+
10
);
/* size */
avio_wb16
(
pb
,
len
*
2
+
10
);
/* size */
avio_wb32
(
pb
,
type
);
/* type */
avio_wb16
(
pb
,
language_code
(
lang
));
/* language */
avio_wb16
(
pb
,
0x01
);
/* ? */
...
...
@@ -2021,18 +2021,18 @@ static int mov_write_moov_tag(AVIOContext *pb, MOVMuxContext *mov,
avio_wb32
(
pb
,
0
);
/* size placeholder*/
ffio_wfourcc
(
pb
,
"moov"
);
for
(
i
=
0
;
i
<
mov
->
nb_streams
;
i
++
)
{
for
(
i
=
0
;
i
<
mov
->
nb_streams
;
i
++
)
{
if
(
mov
->
tracks
[
i
].
entry
<=
0
&&
!
(
mov
->
flags
&
FF_MOV_FLAG_FRAGMENT
))
continue
;
mov
->
tracks
[
i
].
time
=
mov
->
time
;
mov
->
tracks
[
i
].
track_id
=
i
+
1
;
mov
->
tracks
[
i
].
time
=
mov
->
time
;
mov
->
tracks
[
i
].
track_id
=
i
+
1
;
}
if
(
mov
->
chapter_track
)
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
mov
->
tracks
[
i
].
tref_tag
=
MKTAG
(
'c'
,
'h'
,
'a'
,
'p'
);
mov
->
tracks
[
i
].
tref_id
=
mov
->
tracks
[
mov
->
chapter_track
].
track_id
;
mov
->
tracks
[
i
].
tref_id
=
mov
->
tracks
[
mov
->
chapter_track
].
track_id
;
}
for
(
i
=
0
;
i
<
mov
->
nb_streams
;
i
++
)
{
if
(
mov
->
tracks
[
i
].
tag
==
MKTAG
(
'r'
,
't'
,
'p'
,
' '
))
{
...
...
@@ -2045,7 +2045,7 @@ static int mov_write_moov_tag(AVIOContext *pb, MOVMuxContext *mov,
mov_write_mvhd_tag
(
pb
,
mov
);
if
(
mov
->
mode
!=
MODE_MOV
&&
!
mov
->
iods_skip
)
mov_write_iods_tag
(
pb
,
mov
);
for
(
i
=
0
;
i
<
mov
->
nb_streams
;
i
++
)
{
for
(
i
=
0
;
i
<
mov
->
nb_streams
;
i
++
)
{
if
(
mov
->
tracks
[
i
].
entry
>
0
||
mov
->
flags
&
FF_MOV_FLAG_FRAGMENT
)
{
mov_write_trak_tag
(
pb
,
mov
,
&
(
mov
->
tracks
[
i
]),
i
<
s
->
nb_streams
?
s
->
streams
[
i
]
:
NULL
);
}
...
...
@@ -2074,9 +2074,9 @@ static void param_write_string(AVIOContext *pb, const char *name, const char *va
static
void
param_write_hex
(
AVIOContext
*
pb
,
const
char
*
name
,
const
uint8_t
*
value
,
int
len
)
{
char
buf
[
150
];
len
=
FFMIN
(
sizeof
(
buf
)
/
2
-
1
,
len
);
len
=
FFMIN
(
sizeof
(
buf
)
/
2
-
1
,
len
);
ff_data_to_hex
(
buf
,
value
,
len
,
0
);
buf
[
2
*
len
]
=
'\0'
;
buf
[
2
*
len
]
=
'\0'
;
avio_printf
(
pb
,
"<param name=
\"
%s
\"
value=
\"
%s
\"
valuetype=
\"
data
\"
/>
\n
"
,
name
,
buf
);
}
...
...
@@ -2150,7 +2150,7 @@ static int mov_write_isml_manifest(AVIOContext *pb, MOVMuxContext *mov)
param_write_hex
(
pb
,
"CodecPrivateData"
,
track
->
enc
->
extradata
,
track
->
enc
->
extradata_size
);
param_write_int
(
pb
,
"AudioTag"
,
ff_codec_get_tag
(
ff_codec_wav_tags
,
track
->
enc
->
codec_id
));
track
->
enc
->
codec_id
));
param_write_int
(
pb
,
"Channels"
,
track
->
enc
->
channels
);
param_write_int
(
pb
,
"SamplingRate"
,
track
->
enc
->
sample_rate
);
param_write_int
(
pb
,
"BitsPerSample"
,
16
);
...
...
@@ -2320,7 +2320,7 @@ static int mov_write_tfrf_tag(AVIOContext *pb, MOVMuxContext *mov,
avio_wb64
(
pb
,
track
->
frag_info
[
index
].
duration
);
}
if
(
n
<
mov
->
ism_lookahead
)
{
int
free_size
=
16
*
(
mov
->
ism_lookahead
-
n
);
int
free_size
=
16
*
(
mov
->
ism_lookahead
-
n
);
avio_wb32
(
pb
,
free_size
);
ffio_wfourcc
(
pb
,
"free"
);
for
(
i
=
0
;
i
<
free_size
-
8
;
i
++
)
...
...
@@ -2357,7 +2357,7 @@ static int mov_write_traf_tag(AVIOContext *pb, MOVMuxContext *mov,
mov_write_tfxd_tag
(
pb
,
track
);
if
(
mov
->
ism_lookahead
)
{
int
i
,
size
=
16
+
4
+
1
+
16
*
mov
->
ism_lookahead
;
int
i
,
size
=
16
+
4
+
1
+
16
*
mov
->
ism_lookahead
;
track
->
tfrf_offset
=
avio_tell
(
pb
);
avio_wb32
(
pb
,
8
+
size
);
...
...
@@ -2491,7 +2491,7 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s)
}
else
if
(
mov
->
mode
&
MODE_3G2
)
{
ffio_wfourcc
(
pb
,
has_h264
?
"3g2b"
:
"3g2a"
);
minor
=
has_h264
?
0x20000
:
0x10000
;
}
else
if
(
mov
->
mode
==
MODE_PSP
)
}
else
if
(
mov
->
mode
==
MODE_PSP
)
ffio_wfourcc
(
pb
,
"MSNV"
);
else
if
(
mov
->
mode
==
MODE_MP4
)
ffio_wfourcc
(
pb
,
"isom"
);
...
...
@@ -2504,7 +2504,7 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s)
avio_wb32
(
pb
,
minor
);
if
(
mov
->
mode
==
MODE_MOV
)
if
(
mov
->
mode
==
MODE_MOV
)
ffio_wfourcc
(
pb
,
"qt "
);
else
if
(
mov
->
mode
==
MODE_ISM
)
{
ffio_wfourcc
(
pb
,
"piff"
);
...
...
@@ -2512,7 +2512,7 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s)
}
else
{
ffio_wfourcc
(
pb
,
"isom"
);
ffio_wfourcc
(
pb
,
"iso2"
);
if
(
has_h264
)
if
(
has_h264
)
ffio_wfourcc
(
pb
,
"avc1"
);
}
...
...
@@ -2532,7 +2532,7 @@ static void mov_write_uuidprof_tag(AVIOContext *pb, AVFormatContext *s)
AVCodecContext
*
video_codec
=
s
->
streams
[
0
]
->
codec
;
AVCodecContext
*
audio_codec
=
s
->
streams
[
1
]
->
codec
;
int
audio_rate
=
audio_codec
->
sample_rate
;
int
frame_rate
=
((
video_codec
->
time_base
.
den
)
*
(
0x10000
))
/
(
video_codec
->
time_base
.
num
);
int
frame_rate
=
((
video_codec
->
time_base
.
den
)
*
(
0x10000
))
/
(
video_codec
->
time_base
.
num
);
int
audio_kbitrate
=
audio_codec
->
bit_rate
/
1000
;
int
video_kbitrate
=
FFMIN
(
video_codec
->
bit_rate
/
1000
,
800
-
audio_kbitrate
);
...
...
@@ -2554,7 +2554,7 @@ static void mov_write_uuidprof_tag(AVIOContext *pb, AVFormatContext *s)
avio_wb32
(
pb
,
0x0
);
/* ? */
avio_wb32
(
pb
,
0x2c
);
/* size */
ffio_wfourcc
(
pb
,
"APRF"
);
/* audio */
ffio_wfourcc
(
pb
,
"APRF"
);
/* audio */
avio_wb32
(
pb
,
0x0
);
avio_wb32
(
pb
,
0x2
);
/* TrackID */
ffio_wfourcc
(
pb
,
"mp4a"
);
...
...
@@ -2594,11 +2594,11 @@ static int mov_parse_mpeg2_frame(AVPacket *pkt, uint32_t *flags)
int
i
,
closed_gop
=
0
;
for
(
i
=
0
;
i
<
pkt
->
size
-
4
;
i
++
)
{
c
=
(
c
<<
8
)
+
pkt
->
data
[
i
];
c
=
(
c
<<
8
)
+
pkt
->
data
[
i
];
if
(
c
==
0x1b8
)
{
// gop
closed_gop
=
pkt
->
data
[
i
+
4
]
>>
6
&
0x01
;
closed_gop
=
pkt
->
data
[
i
+
4
]
>>
6
&
0x01
;
}
else
if
(
c
==
0x100
)
{
// pic
int
temp_ref
=
(
pkt
->
data
[
i
+
1
]
<<
2
)
|
(
pkt
->
data
[
i
+
2
]
>>
6
);
int
temp_ref
=
(
pkt
->
data
[
i
+
1
]
<<
2
)
|
(
pkt
->
data
[
i
+
2
]
>>
6
);
if
(
!
temp_ref
||
closed_gop
)
// I picture is not reordered
*
flags
=
MOV_SYNC_SAMPLE
;
else
...
...
@@ -2804,7 +2804,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
MOVTrack
*
trk
=
&
mov
->
tracks
[
pkt
->
stream_index
];
AVCodecContext
*
enc
=
trk
->
enc
;
unsigned
int
samples_in_chunk
=
0
;
int
size
=
pkt
->
size
;
int
size
=
pkt
->
size
;
uint8_t
*
reformatted_data
=
NULL
;
if
(
mov
->
flags
&
FF_MOV_FLAG_FRAGMENT
)
{
...
...
@@ -2845,7 +2845,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
/* copy extradata if it exists */
if
(
trk
->
vos_len
==
0
&&
enc
->
extradata_size
>
0
)
{
trk
->
vos_len
=
enc
->
extradata_size
;
trk
->
vos_len
=
enc
->
extradata_size
;
trk
->
vos_data
=
av_malloc
(
trk
->
vos_len
);
memcpy
(
trk
->
vos_data
,
enc
->
extradata
,
trk
->
vos_len
);
}
...
...
@@ -2867,7 +2867,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
if
((
enc
->
codec_id
==
AV_CODEC_ID_DNXHD
||
enc
->
codec_id
==
AV_CODEC_ID_AC3
)
&&
!
trk
->
vos_len
)
{
/* copy frame to create needed atoms */
trk
->
vos_len
=
size
;
trk
->
vos_len
=
size
;
trk
->
vos_data
=
av_malloc
(
size
);
if
(
!
trk
->
vos_data
)
return
AVERROR
(
ENOMEM
);
...
...
@@ -2875,18 +2875,18 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
}
if
(
trk
->
entry
>=
trk
->
cluster_capacity
)
{
unsigned
new_capacity
=
2
*
(
trk
->
entry
+
MOV_INDEX_CLUSTER_SIZE
);
unsigned
new_capacity
=
2
*
(
trk
->
entry
+
MOV_INDEX_CLUSTER_SIZE
);
if
(
av_reallocp_array
(
&
trk
->
cluster
,
new_capacity
,
sizeof
(
*
trk
->
cluster
)))
return
AVERROR
(
ENOMEM
);
trk
->
cluster_capacity
=
new_capacity
;
}
trk
->
cluster
[
trk
->
entry
].
pos
=
avio_tell
(
pb
)
-
size
;
trk
->
cluster
[
trk
->
entry
].
pos
=
avio_tell
(
pb
)
-
size
;
trk
->
cluster
[
trk
->
entry
].
samples_in_chunk
=
samples_in_chunk
;
trk
->
cluster
[
trk
->
entry
].
size
=
size
;
trk
->
cluster
[
trk
->
entry
].
entries
=
samples_in_chunk
;
trk
->
cluster
[
trk
->
entry
].
dts
=
pkt
->
dts
;
trk
->
cluster
[
trk
->
entry
].
size
=
size
;
trk
->
cluster
[
trk
->
entry
].
entries
=
samples_in_chunk
;
trk
->
cluster
[
trk
->
entry
].
dts
=
pkt
->
dts
;
if
(
!
trk
->
entry
&&
trk
->
start_dts
!=
AV_NOPTS_VALUE
)
{
/* First packet of a new fragment. We already wrote the duration
* of the last packet of the previous fragment based on track_duration,
...
...
@@ -2904,7 +2904,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
}
if
(
pkt
->
dts
!=
pkt
->
pts
)
trk
->
flags
|=
MOV_TRACK_CTTS
;
trk
->
cluster
[
trk
->
entry
].
cts
=
pkt
->
pts
-
pkt
->
dts
;
trk
->
cluster
[
trk
->
entry
].
cts
=
pkt
->
pts
-
pkt
->
dts
;
trk
->
cluster
[
trk
->
entry
].
flags
=
0
;
if
(
enc
->
codec_id
==
AV_CODEC_ID_VC1
)
{
mov_parse_vc1_frame
(
pkt
,
trk
,
mov
->
fragments
);
...
...
@@ -2922,7 +2922,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
}
trk
->
entry
++
;
trk
->
sample_count
+=
samples_in_chunk
;
mov
->
mdat_size
+=
size
;
mov
->
mdat_size
+=
size
;
avio_flush
(
pb
);
...
...
@@ -2945,7 +2945,8 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)
int64_t
frag_duration
=
0
;
int
size
=
pkt
->
size
;
if
(
!
pkt
->
size
)
return
0
;
/* Discard 0 sized packets */
if
(
!
pkt
->
size
)
return
0
;
/* Discard 0 sized packets */
if
(
trk
->
entry
)
frag_duration
=
av_rescale_q
(
pkt
->
dts
-
trk
->
cluster
[
0
].
dts
,
...
...
@@ -2989,11 +2990,11 @@ static void mov_create_chapter_track(AVFormatContext *s, int tracknum)
pkt
.
duration
=
end
-
pkt
.
dts
;
if
((
t
=
av_dict_get
(
c
->
metadata
,
"title"
,
NULL
,
0
)))
{
len
=
strlen
(
t
->
value
);
pkt
.
size
=
len
+
2
;
len
=
strlen
(
t
->
value
);
pkt
.
size
=
len
+
2
;
pkt
.
data
=
av_malloc
(
pkt
.
size
);
AV_WB16
(
pkt
.
data
,
len
);
memcpy
(
pkt
.
data
+
2
,
t
->
value
,
len
);
memcpy
(
pkt
.
data
+
2
,
t
->
value
,
len
);
ff_mov_write_packet
(
s
,
&
pkt
);
av_freep
(
&
pkt
.
data
);
}
...
...
@@ -3042,7 +3043,7 @@ static int mov_write_header(AVFormatContext *s)
av_log
(
s
,
AV_LOG_ERROR
,
"PSP mode need one video and one audio stream
\n
"
);
return
-
1
;
}
mov_write_uuidprof_tag
(
pb
,
s
);
mov_write_uuidprof_tag
(
pb
,
s
);
}
}
...
...
@@ -3062,11 +3063,11 @@ static int mov_write_header(AVFormatContext *s)
}
}
mov
->
tracks
=
av_mallocz
(
mov
->
nb_streams
*
sizeof
(
*
mov
->
tracks
));
mov
->
tracks
=
av_mallocz
(
mov
->
nb_streams
*
sizeof
(
*
mov
->
tracks
));
if
(
!
mov
->
tracks
)
return
AVERROR
(
ENOMEM
);
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
AVStream
*
st
=
s
->
streams
[
i
];
MOVTrack
*
track
=
&
mov
->
tracks
[
i
];
AVDictionaryEntry
*
lang
=
av_dict_get
(
st
->
metadata
,
"language"
,
NULL
,
0
);
...
...
@@ -3076,7 +3077,7 @@ static int mov_write_header(AVFormatContext *s)
if
(
track
->
language
<
0
)
track
->
language
=
0
;
track
->
mode
=
mov
->
mode
;
track
->
tag
=
mov_find_codec_tag
(
s
,
track
);
track
->
tag
=
mov_find_codec_tag
(
s
,
track
);
if
(
!
track
->
tag
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"track %d: could not find tag, "
"codec not currently supported in container
\n
"
,
i
);
...
...
@@ -3085,8 +3086,8 @@ static int mov_write_header(AVFormatContext *s)
/* If hinting of this track is enabled by a later hint track,
* this is updated. */
track
->
hint_track
=
-
1
;
track
->
start_dts
=
AV_NOPTS_VALUE
;
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_VIDEO
)
{
track
->
start_dts
=
AV_NOPTS_VALUE
;
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_VIDEO
)
{
if
(
track
->
tag
==
MKTAG
(
'm'
,
'x'
,
'3'
,
'p'
)
||
track
->
tag
==
MKTAG
(
'm'
,
'x'
,
'3'
,
'n'
)
||
track
->
tag
==
MKTAG
(
'm'
,
'x'
,
'4'
,
'p'
)
||
track
->
tag
==
MKTAG
(
'm'
,
'x'
,
'4'
,
'n'
)
||
track
->
tag
==
MKTAG
(
'm'
,
'x'
,
'5'
,
'p'
)
||
track
->
tag
==
MKTAG
(
'm'
,
'x'
,
'5'
,
'n'
))
{
...
...
@@ -3094,7 +3095,7 @@ static int mov_write_header(AVFormatContext *s)
av_log
(
s
,
AV_LOG_ERROR
,
"D-10/IMX must use 720x608 or 720x512 video resolution
\n
"
);
goto
error
;
}
track
->
height
=
track
->
tag
>>
24
==
'n'
?
486
:
576
;
track
->
height
=
track
->
tag
>>
24
==
'n'
?
486
:
576
;
}
track
->
timescale
=
st
->
codec
->
time_base
.
den
;
if
(
track
->
mode
==
MODE_MOV
&&
track
->
timescale
>
100000
)
...
...
@@ -3102,7 +3103,7 @@ static int mov_write_header(AVFormatContext *s)
"WARNING codec timebase is very high. If duration is too long,
\n
"
"file may not be playable by quicktime. Specify a shorter timebase
\n
"
"or choose different container.
\n
"
);
}
else
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
{
}
else
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_AUDIO
)
{
track
->
timescale
=
st
->
codec
->
sample_rate
;
/* set sample_size for PCM and ADPCM */
if
(
av_get_bits_per_sample
(
st
->
codec
->
codec_id
)
||
...
...
@@ -3123,7 +3124,7 @@ static int mov_write_header(AVFormatContext *s)
i
,
track
->
enc
->
sample_rate
);
goto
error
;
}
}
else
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_SUBTITLE
)
{
}
else
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_SUBTITLE
)
{
track
->
timescale
=
st
->
codec
->
time_base
.
den
;
}
if
(
!
track
->
height
)
...
...
@@ -3226,7 +3227,7 @@ static int mov_write_trailer(AVFormatContext *s)
if
(
mov
->
chapter_track
)
av_freep
(
&
mov
->
tracks
[
mov
->
chapter_track
].
enc
);
for
(
i
=
0
;
i
<
mov
->
nb_streams
;
i
++
)
{
for
(
i
=
0
;
i
<
mov
->
nb_streams
;
i
++
)
{
if
(
mov
->
tracks
[
i
].
tag
==
MKTAG
(
'r'
,
't'
,
'p'
,
' '
))
ff_mov_close_hinting
(
&
mov
->
tracks
[
i
]);
if
(
mov
->
flags
&
FF_MOV_FLAG_FRAGMENT
&&
...
...
@@ -3244,7 +3245,6 @@ static int mov_write_trailer(AVFormatContext *s)
if
(
mov
->
tracks
[
i
].
vos_len
)
av_free
(
mov
->
tracks
[
i
].
vos_data
);
}
av_freep
(
&
mov
->
tracks
);
...
...
libavformat/movenchint.c
View file @
21732063
...
...
@@ -87,7 +87,7 @@ static void sample_queue_free(HintSampleQueue *queue)
if
(
queue
->
samples
[
i
].
own_data
)
av_free
(
queue
->
samples
[
i
].
data
);
av_freep
(
&
queue
->
samples
);
queue
->
len
=
0
;
queue
->
len
=
0
;
queue
->
size
=
0
;
}
...
...
@@ -104,7 +104,7 @@ static void sample_queue_push(HintSampleQueue *queue, uint8_t *data, int size,
if
(
size
<=
14
)
return
;
if
(
!
queue
->
samples
||
queue
->
len
>=
queue
->
size
)
{
HintSample
*
samples
;
HintSample
*
samples
;
queue
->
size
+=
10
;
samples
=
av_realloc
(
queue
->
samples
,
sizeof
(
HintSample
)
*
queue
->
size
);
if
(
!
samples
)
...
...
@@ -114,7 +114,7 @@ static void sample_queue_push(HintSampleQueue *queue, uint8_t *data, int size,
queue
->
samples
[
queue
->
len
].
data
=
data
;
queue
->
samples
[
queue
->
len
].
size
=
size
;
queue
->
samples
[
queue
->
len
].
sample_number
=
sample
;
queue
->
samples
[
queue
->
len
].
offset
=
0
;
queue
->
samples
[
queue
->
len
].
offset
=
0
;
queue
->
samples
[
queue
->
len
].
own_data
=
0
;
queue
->
len
++
;
}
...
...
@@ -128,7 +128,7 @@ static void sample_queue_retain(HintSampleQueue *queue)
for
(
i
=
0
;
i
<
queue
->
len
;
)
{
HintSample
*
sample
=
&
queue
->
samples
[
i
];
if
(
!
sample
->
own_data
)
{
uint8_t
*
ptr
=
av_malloc
(
sample
->
size
);
uint8_t
*
ptr
=
av_malloc
(
sample
->
size
);
if
(
!
ptr
)
{
/* Unable to allocate memory for this one, remove it */
memmove
(
queue
->
samples
+
i
,
queue
->
samples
+
i
+
1
,
...
...
@@ -344,7 +344,7 @@ static int write_hint_packets(AVIOContext *out, const uint8_t *data,
trk
->
max_packet_size
=
packet_len
;
seq
=
AV_RB16
(
&
data
[
2
]);
ts
=
AV_RB32
(
&
data
[
4
]);
ts
=
AV_RB32
(
&
data
[
4
]);
if
(
trk
->
prev_rtp_ts
==
0
)
trk
->
prev_rtp_ts
=
ts
;
...
...
@@ -417,7 +417,7 @@ int ff_mov_add_hinted_packet(AVFormatContext *s, AVPacket *pkt,
* for next time. */
size
=
avio_close_dyn_buf
(
rtp_ctx
->
pb
,
&
buf
);
if
((
ret
=
ffio_open_dyn_packet_buf
(
&
rtp_ctx
->
pb
,
RTP_MAX_PACKET_SIZE
))
<
0
)
RTP_MAX_PACKET_SIZE
))
<
0
)
goto
done
;
if
(
size
<=
0
)
...
...
@@ -445,8 +445,9 @@ done:
return
ret
;
}
void
ff_mov_close_hinting
(
MOVTrack
*
track
)
{
AVFormatContext
*
rtp_ctx
=
track
->
rtp_ctx
;
void
ff_mov_close_hinting
(
MOVTrack
*
track
)
{
AVFormatContext
*
rtp_ctx
=
track
->
rtp_ctx
;
uint8_t
*
ptr
;
av_freep
(
&
track
->
enc
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment