Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
0aec3c5c
Commit
0aec3c5c
authored
Jun 24, 2006
by
Baptiste Coudurier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
simplify
Originally committed as revision 5517 to
svn://svn.ffmpeg.org/ffmpeg/trunk
parent
d1015e88
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
28 additions
and
53 deletions
+28
-53
movenc.c
libavformat/movenc.c
+28
-53
No files found.
libavformat/movenc.c
View file @
0aec3c5c
...
@@ -47,7 +47,6 @@ typedef struct MOVIentry {
...
@@ -47,7 +47,6 @@ typedef struct MOVIentry {
typedef
struct
MOVIndex
{
typedef
struct
MOVIndex
{
int
mode
;
int
mode
;
int
entry
;
int
entry
;
int
ents_allocated
;
long
timescale
;
long
timescale
;
long
time
;
long
time
;
int64_t
trackDuration
;
int64_t
trackDuration
;
...
@@ -62,7 +61,7 @@ typedef struct MOVIndex {
...
@@ -62,7 +61,7 @@ typedef struct MOVIndex {
int
vosLen
;
int
vosLen
;
uint8_t
*
vosData
;
uint8_t
*
vosData
;
MOVIentry
**
cluster
;
MOVIentry
*
cluster
;
}
MOVTrack
;
}
MOVTrack
;
typedef
struct
MOVContext
{
typedef
struct
MOVContext
{
...
@@ -101,12 +100,10 @@ static int mov_write_stco_tag(ByteIOContext *pb, MOVTrack* track)
...
@@ -101,12 +100,10 @@ static int mov_write_stco_tag(ByteIOContext *pb, MOVTrack* track)
put_be32
(
pb
,
0
);
/* version & flags */
put_be32
(
pb
,
0
);
/* version & flags */
put_be32
(
pb
,
track
->
entry
);
/* entry count */
put_be32
(
pb
,
track
->
entry
);
/* entry count */
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
int
cl
=
i
/
MOV_INDEX_CLUSTER_SIZE
;
int
id
=
i
%
MOV_INDEX_CLUSTER_SIZE
;
if
(
mode64
==
1
)
if
(
mode64
==
1
)
put_be64
(
pb
,
track
->
cluster
[
cl
][
id
].
pos
);
put_be64
(
pb
,
track
->
cluster
[
i
].
pos
);
else
else
put_be32
(
pb
,
track
->
cluster
[
cl
][
id
].
pos
);
put_be32
(
pb
,
track
->
cluster
[
i
].
pos
);
}
}
return
updateSize
(
pb
,
pos
);
return
updateSize
(
pb
,
pos
);
}
}
...
@@ -123,17 +120,15 @@ static int mov_write_stsz_tag(ByteIOContext *pb, MOVTrack* track)
...
@@ -123,17 +120,15 @@ static int mov_write_stsz_tag(ByteIOContext *pb, MOVTrack* track)
put_be32
(
pb
,
0
);
/* version & flags */
put_be32
(
pb
,
0
);
/* version & flags */
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
int
cl
=
i
/
MOV_INDEX_CLUSTER_SIZE
;
tst
=
track
->
cluster
[
i
].
size
/
track
->
cluster
[
i
].
entries
;
int
id
=
i
%
MOV_INDEX_CLUSTER_SIZE
;
tst
=
track
->
cluster
[
cl
][
id
].
size
/
track
->
cluster
[
cl
][
id
].
entries
;
if
(
oldtst
!=
-
1
&&
tst
!=
oldtst
)
{
if
(
oldtst
!=
-
1
&&
tst
!=
oldtst
)
{
equalChunks
=
0
;
equalChunks
=
0
;
}
}
oldtst
=
tst
;
oldtst
=
tst
;
entries
+=
track
->
cluster
[
cl
][
id
].
entries
;
entries
+=
track
->
cluster
[
i
].
entries
;
}
}
if
(
equalChunks
)
{
if
(
equalChunks
)
{
int
sSize
=
track
->
cluster
[
0
]
[
0
].
size
/
track
->
cluster
[
0
]
[
0
].
entries
;
int
sSize
=
track
->
cluster
[
0
]
.
size
/
track
->
cluster
[
0
].
entries
;
put_be32
(
pb
,
sSize
);
// sample size
put_be32
(
pb
,
sSize
);
// sample size
put_be32
(
pb
,
entries
);
// sample count
put_be32
(
pb
,
entries
);
// sample count
}
}
...
@@ -141,11 +136,9 @@ static int mov_write_stsz_tag(ByteIOContext *pb, MOVTrack* track)
...
@@ -141,11 +136,9 @@ static int mov_write_stsz_tag(ByteIOContext *pb, MOVTrack* track)
put_be32
(
pb
,
0
);
// sample size
put_be32
(
pb
,
0
);
// sample size
put_be32
(
pb
,
entries
);
// sample count
put_be32
(
pb
,
entries
);
// sample count
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
int
cl
=
i
/
MOV_INDEX_CLUSTER_SIZE
;
for
(
j
=
0
;
j
<
track
->
cluster
[
i
].
entries
;
j
++
)
{
int
id
=
i
%
MOV_INDEX_CLUSTER_SIZE
;
put_be32
(
pb
,
track
->
cluster
[
i
].
size
/
for
(
j
=
0
;
j
<
track
->
cluster
[
cl
][
id
].
entries
;
j
++
)
{
track
->
cluster
[
i
].
entries
);
put_be32
(
pb
,
track
->
cluster
[
cl
][
id
].
size
/
track
->
cluster
[
cl
][
id
].
entries
);
}
}
}
}
}
}
...
@@ -165,14 +158,12 @@ static int mov_write_stsc_tag(ByteIOContext *pb, MOVTrack* track)
...
@@ -165,14 +158,12 @@ static int mov_write_stsc_tag(ByteIOContext *pb, MOVTrack* track)
entryPos
=
url_ftell
(
pb
);
entryPos
=
url_ftell
(
pb
);
put_be32
(
pb
,
track
->
entry
);
// entry count
put_be32
(
pb
,
track
->
entry
);
// entry count
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
int
cl
=
i
/
MOV_INDEX_CLUSTER_SIZE
;
if
(
oldval
!=
track
->
cluster
[
i
].
samplesInChunk
)
int
id
=
i
%
MOV_INDEX_CLUSTER_SIZE
;
if
(
oldval
!=
track
->
cluster
[
cl
][
id
].
samplesInChunk
)
{
{
put_be32
(
pb
,
i
+
1
);
// first chunk
put_be32
(
pb
,
i
+
1
);
// first chunk
put_be32
(
pb
,
track
->
cluster
[
cl
][
id
].
samplesInChunk
);
// samples per chunk
put_be32
(
pb
,
track
->
cluster
[
i
].
samplesInChunk
);
// samples per chunk
put_be32
(
pb
,
0x1
);
// sample description index
put_be32
(
pb
,
0x1
);
// sample description index
oldval
=
track
->
cluster
[
cl
][
id
].
samplesInChunk
;
oldval
=
track
->
cluster
[
i
].
samplesInChunk
;
index
++
;
index
++
;
}
}
}
}
...
@@ -196,9 +187,7 @@ static int mov_write_stss_tag(ByteIOContext *pb, MOVTrack* track)
...
@@ -196,9 +187,7 @@ static int mov_write_stss_tag(ByteIOContext *pb, MOVTrack* track)
entryPos
=
url_ftell
(
pb
);
entryPos
=
url_ftell
(
pb
);
put_be32
(
pb
,
track
->
entry
);
// entry count
put_be32
(
pb
,
track
->
entry
);
// entry count
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
for
(
i
=
0
;
i
<
track
->
entry
;
i
++
)
{
int
cl
=
i
/
MOV_INDEX_CLUSTER_SIZE
;
if
(
track
->
cluster
[
i
].
key_frame
==
1
)
{
int
id
=
i
%
MOV_INDEX_CLUSTER_SIZE
;
if
(
track
->
cluster
[
cl
][
id
].
key_frame
==
1
)
{
put_be32
(
pb
,
i
+
1
);
put_be32
(
pb
,
i
+
1
);
index
++
;
index
++
;
}
}
...
@@ -693,15 +682,13 @@ static int mov_write_ctts_tag(ByteIOContext *pb, MOVTrack* track)
...
@@ -693,15 +682,13 @@ static int mov_write_ctts_tag(ByteIOContext *pb, MOVTrack* track)
ctts_entries
=
av_malloc
((
track
->
entry
+
1
)
*
sizeof
(
*
ctts_entries
));
/* worst case */
ctts_entries
=
av_malloc
((
track
->
entry
+
1
)
*
sizeof
(
*
ctts_entries
));
/* worst case */
ctts_entries
[
0
].
count
=
1
;
ctts_entries
[
0
].
count
=
1
;
ctts_entries
[
0
].
duration
=
track
->
cluster
[
0
]
[
0
]
.
cts
;
ctts_entries
[
0
].
duration
=
track
->
cluster
[
0
].
cts
;
for
(
i
=
1
;
i
<
track
->
entry
;
i
++
)
{
for
(
i
=
1
;
i
<
track
->
entry
;
i
++
)
{
int
cl
=
i
/
MOV_INDEX_CLUSTER_SIZE
;
if
(
track
->
cluster
[
i
].
cts
==
ctts_entries
[
entries
].
duration
)
{
int
id
=
i
%
MOV_INDEX_CLUSTER_SIZE
;
if
(
track
->
cluster
[
cl
][
id
].
cts
==
ctts_entries
[
entries
].
duration
)
{
ctts_entries
[
entries
].
count
++
;
/* compress */
ctts_entries
[
entries
].
count
++
;
/* compress */
}
else
{
}
else
{
entries
++
;
entries
++
;
ctts_entries
[
entries
].
duration
=
track
->
cluster
[
cl
][
id
].
cts
;
ctts_entries
[
entries
].
duration
=
track
->
cluster
[
i
].
cts
;
ctts_entries
[
entries
].
count
=
1
;
ctts_entries
[
entries
].
count
=
1
;
}
}
}
}
...
@@ -1509,7 +1496,6 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)
...
@@ -1509,7 +1496,6 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)
ByteIOContext
*
pb
=
&
s
->
pb
;
ByteIOContext
*
pb
=
&
s
->
pb
;
MOVTrack
*
trk
=
&
mov
->
tracks
[
pkt
->
stream_index
];
MOVTrack
*
trk
=
&
mov
->
tracks
[
pkt
->
stream_index
];
AVCodecContext
*
enc
=
trk
->
enc
;
AVCodecContext
*
enc
=
trk
->
enc
;
int
cl
,
id
;
unsigned
int
samplesInChunk
=
0
;
unsigned
int
samplesInChunk
=
0
;
int
size
=
pkt
->
size
;
int
size
=
pkt
->
size
;
...
@@ -1568,29 +1554,22 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)
...
@@ -1568,29 +1554,22 @@ static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)
size
=
pkt
->
size
;
size
=
pkt
->
size
;
}
}
cl
=
trk
->
entry
/
MOV_INDEX_CLUSTER_SIZE
;
if
(
!
(
trk
->
entry
%
MOV_INDEX_CLUSTER_SIZE
))
{
id
=
trk
->
entry
%
MOV_INDEX_CLUSTER_SIZE
;
trk
->
cluster
=
av_realloc
(
trk
->
cluster
,
(
trk
->
entry
+
MOV_INDEX_CLUSTER_SIZE
)
*
sizeof
(
*
trk
->
cluster
));
if
(
trk
->
ents_allocated
<=
trk
->
entry
)
{
trk
->
cluster
=
av_realloc
(
trk
->
cluster
,
(
cl
+
1
)
*
sizeof
(
void
*
));
if
(
!
trk
->
cluster
)
if
(
!
trk
->
cluster
)
return
-
1
;
return
-
1
;
trk
->
cluster
[
cl
]
=
av_malloc
(
MOV_INDEX_CLUSTER_SIZE
*
sizeof
(
MOVIentry
));
if
(
!
trk
->
cluster
[
cl
])
return
-
1
;
trk
->
ents_allocated
+=
MOV_INDEX_CLUSTER_SIZE
;
}
}
trk
->
cluster
[
cl
][
id
].
pos
=
url_ftell
(
pb
);
trk
->
cluster
[
trk
->
entry
].
pos
=
url_ftell
(
pb
);
trk
->
cluster
[
cl
][
id
].
samplesInChunk
=
samplesInChunk
;
trk
->
cluster
[
trk
->
entry
].
samplesInChunk
=
samplesInChunk
;
trk
->
cluster
[
cl
][
id
].
size
=
size
;
trk
->
cluster
[
trk
->
entry
].
size
=
size
;
trk
->
cluster
[
cl
][
id
].
entries
=
samplesInChunk
;
trk
->
cluster
[
trk
->
entry
].
entries
=
samplesInChunk
;
if
(
enc
->
codec_type
==
CODEC_TYPE_VIDEO
)
{
if
(
enc
->
codec_type
==
CODEC_TYPE_VIDEO
)
{
if
(
pkt
->
dts
!=
pkt
->
pts
)
if
(
pkt
->
dts
!=
pkt
->
pts
)
trk
->
hasBframes
=
1
;
trk
->
hasBframes
=
1
;
trk
->
cluster
[
cl
][
id
].
cts
=
pkt
->
pts
-
pkt
->
dts
;
trk
->
cluster
[
trk
->
entry
].
cts
=
pkt
->
pts
-
pkt
->
dts
;
trk
->
cluster
[
cl
][
id
].
key_frame
=
!!
(
pkt
->
flags
&
PKT_FLAG_KEY
);
trk
->
cluster
[
trk
->
entry
].
key_frame
=
!!
(
pkt
->
flags
&
PKT_FLAG_KEY
);
if
(
trk
->
cluster
[
cl
][
id
].
key_frame
)
if
(
trk
->
cluster
[
trk
->
entry
].
key_frame
)
trk
->
hasKeyframes
++
;
trk
->
hasKeyframes
++
;
}
}
trk
->
entry
++
;
trk
->
entry
++
;
...
@@ -1608,7 +1587,7 @@ static int mov_write_trailer(AVFormatContext *s)
...
@@ -1608,7 +1587,7 @@ static int mov_write_trailer(AVFormatContext *s)
MOVContext
*
mov
=
s
->
priv_data
;
MOVContext
*
mov
=
s
->
priv_data
;
ByteIOContext
*
pb
=
&
s
->
pb
;
ByteIOContext
*
pb
=
&
s
->
pb
;
int
res
=
0
;
int
res
=
0
;
int
i
,
j
;
int
i
;
offset_t
moov_pos
=
url_ftell
(
pb
);
offset_t
moov_pos
=
url_ftell
(
pb
);
...
@@ -1628,14 +1607,10 @@ static int mov_write_trailer(AVFormatContext *s)
...
@@ -1628,14 +1607,10 @@ static int mov_write_trailer(AVFormatContext *s)
mov_write_moov_tag
(
pb
,
mov
,
s
);
mov_write_moov_tag
(
pb
,
mov
,
s
);
for
(
i
=
0
;
i
<
MAX_STREAMS
;
i
++
)
{
for
(
i
=
0
;
i
<
MAX_STREAMS
;
i
++
)
{
for
(
j
=
0
;
j
<
mov
->
tracks
[
i
].
ents_allocated
/
MOV_INDEX_CLUSTER_SIZE
;
j
++
)
{
av_freep
(
&
mov
->
tracks
[
i
].
cluster
);
av_free
(
mov
->
tracks
[
i
].
cluster
[
j
]);
}
av_free
(
mov
->
tracks
[
i
].
cluster
);
if
(
mov
->
tracks
[
i
].
vosLen
)
av_free
(
mov
->
tracks
[
i
].
vosData
);
if
(
mov
->
tracks
[
i
].
vosLen
)
av_free
(
mov
->
tracks
[
i
].
vosData
);
mov
->
tracks
[
i
].
cluster
=
NULL
;
mov
->
tracks
[
i
].
ents_allocated
=
mov
->
tracks
[
i
].
entry
=
0
;
}
}
put_flush_packet
(
pb
);
put_flush_packet
(
pb
);
...
...
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