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
4df66c7c
Commit
4df66c7c
authored
Jul 19, 2015
by
Michael Niedermayer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avformat/mp3dec: split position sync code out
Signed-off-by:
Michael Niedermayer
<
michael@niedermayer.cc
>
parent
ea8785ce
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
45 additions
and
37 deletions
+45
-37
mp3dec.c
libavformat/mp3dec.c
+45
-37
No files found.
libavformat/mp3dec.c
View file @
4df66c7c
...
...
@@ -437,49 +437,23 @@ static int check(AVIOContext *pb, int64_t pos)
return
sd
.
frame_size
;
}
static
int
mp3_seek
(
AVFormatContext
*
s
,
int
stream_index
,
int64_t
timestamp
,
int
flags
)
static
int64_t
sync
(
AVFormatContext
*
s
,
int64_t
target_pos
,
int
flags
)
{
MP3DecContext
*
mp3
=
s
->
priv_data
;
AVIndexEntry
*
ie
,
ie1
;
AVStream
*
st
=
s
->
streams
[
0
];
int64_t
ret
=
av_index_search_timestamp
(
st
,
timestamp
,
flags
);
int
i
,
j
;
int
dir
=
(
flags
&
AVSEEK_FLAG_BACKWARD
)
?
-
1
:
1
;
int64_t
best_pos
;
int
best_score
;
int
best_score
,
i
,
j
;
int64_t
ret
;
if
(
mp3
->
usetoc
==
2
)
return
-
1
;
// generic index code
if
(
mp3
->
is_cbr
&&
(
mp3
->
usetoc
==
0
||
!
mp3
->
xing_toc
)
&&
st
->
duration
>
0
&&
mp3
->
header_filesize
>
s
->
internal
->
data_offset
&&
mp3
->
frames
)
{
ie
=
&
ie1
;
timestamp
=
av_clip64
(
timestamp
,
0
,
st
->
duration
);
ie
->
timestamp
=
timestamp
;
ie
->
pos
=
av_rescale
(
timestamp
,
mp3
->
header_filesize
,
st
->
duration
)
+
s
->
internal
->
data_offset
;
}
else
if
(
mp3
->
xing_toc
)
{
if
(
ret
<
0
)
return
ret
;
ie
=
&
st
->
index_entries
[
ret
];
}
else
{
return
-
1
;
}
avio_seek
(
s
->
pb
,
FFMAX
(
ie
->
pos
-
SEEK_WINDOW
,
0
),
SEEK_SET
);
ret
=
avio_seek
(
s
->
pb
,
ie
->
pos
,
SEEK_SET
);
avio_seek
(
s
->
pb
,
FFMAX
(
target_pos
-
SEEK_WINDOW
,
0
),
SEEK_SET
);
ret
=
avio_seek
(
s
->
pb
,
target_pos
,
SEEK_SET
);
if
(
ret
<
0
)
return
ret
;
#define MIN_VALID 3
best_pos
=
ie
->
pos
;
best_pos
=
target_
pos
;
best_score
=
999
;
for
(
i
=
0
;
i
<
SEEK_WINDOW
;
i
++
)
{
int64_t
pos
=
ie
->
pos
+
(
dir
>
0
?
i
-
SEEK_WINDOW
/
4
:
-
i
);
int64_t
pos
=
target_
pos
+
(
dir
>
0
?
i
-
SEEK_WINDOW
/
4
:
-
i
);
int64_t
candidate
=
-
1
;
int
score
=
999
;
...
...
@@ -490,7 +464,7 @@ static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
ret
=
check
(
s
->
pb
,
pos
);
if
(
ret
<
0
)
break
;
if
((
ie
->
pos
-
pos
)
*
dir
<=
0
&&
abs
(
MIN_VALID
/
2
-
j
)
<
score
)
{
if
((
target_
pos
-
pos
)
*
dir
<=
0
&&
abs
(
MIN_VALID
/
2
-
j
)
<
score
)
{
candidate
=
pos
;
score
=
abs
(
MIN_VALID
/
2
-
j
);
}
...
...
@@ -504,10 +478,44 @@ static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
}
}
ret
=
avio_seek
(
s
->
pb
,
best_pos
,
SEEK_SET
);
return
avio_seek
(
s
->
pb
,
best_pos
,
SEEK_SET
);
}
static
int
mp3_seek
(
AVFormatContext
*
s
,
int
stream_index
,
int64_t
timestamp
,
int
flags
)
{
MP3DecContext
*
mp3
=
s
->
priv_data
;
AVIndexEntry
*
ie
,
ie1
;
AVStream
*
st
=
s
->
streams
[
0
];
int64_t
ret
=
av_index_search_timestamp
(
st
,
timestamp
,
flags
);
int64_t
best_pos
;
int
i
;
if
(
mp3
->
usetoc
==
2
)
return
-
1
;
// generic index code
if
(
mp3
->
is_cbr
&&
(
mp3
->
usetoc
==
0
||
!
mp3
->
xing_toc
)
&&
st
->
duration
>
0
&&
mp3
->
header_filesize
>
s
->
internal
->
data_offset
&&
mp3
->
frames
)
{
ie
=
&
ie1
;
timestamp
=
av_clip64
(
timestamp
,
0
,
st
->
duration
);
ie
->
timestamp
=
timestamp
;
ie
->
pos
=
av_rescale
(
timestamp
,
mp3
->
header_filesize
,
st
->
duration
)
+
s
->
internal
->
data_offset
;
}
else
if
(
mp3
->
xing_toc
)
{
if
(
ret
<
0
)
return
ret
;
ie
=
&
st
->
index_entries
[
ret
];
}
else
{
return
-
1
;
}
best_pos
=
sync
(
s
,
ie
->
pos
,
flags
);
if
(
best_pos
<
0
)
return
best_pos
;
if
(
mp3
->
is_cbr
&&
ie
==
&
ie1
)
{
int
frame_duration
=
av_rescale
(
st
->
duration
,
1
,
mp3
->
frames
);
ie1
.
timestamp
=
frame_duration
*
av_rescale
(
best_pos
-
s
->
internal
->
data_offset
,
mp3
->
frames
,
mp3
->
header_filesize
);
...
...
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