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
0c00fd80
Commit
0c00fd80
authored
Aug 04, 2012
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avconv: split the code for processing input packets out of transcode()
parent
f154ef1a
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
135 additions
and
90 deletions
+135
-90
avconv.c
avconv.c
+135
-90
No files found.
avconv.c
View file @
0c00fd80
...
...
@@ -2106,13 +2106,137 @@ static void reset_eagain(void)
input_files
[
i
]
->
eagain
=
0
;
}
/**
* Read one packet from an input file and send it for
* - decoding -> lavfi (audio/video)
* - decoding -> encoding -> muxing (subtitles)
* - muxing (streamcopy)
*
* @return
* - 0 -- one packet was read and processed
* - AVERROR(EAGAIN) -- no packets were available for selected file,
* this function should be called again
* - AVERROR_EOF -- this function should not be called again
*/
static
int
process_input
(
void
)
{
InputFile
*
ifile
;
AVFormatContext
*
is
;
InputStream
*
ist
;
AVPacket
pkt
;
int
ret
,
i
,
j
;
/* select the stream that we must read now */
ifile
=
select_input_file
();
/* if none, if is finished */
if
(
!
ifile
)
{
if
(
got_eagain
())
{
reset_eagain
();
av_usleep
(
10000
);
return
AVERROR
(
EAGAIN
);
}
av_log
(
NULL
,
AV_LOG_VERBOSE
,
"No more inputs to read from.
\n
"
);
return
AVERROR_EOF
;
}
is
=
ifile
->
ctx
;
ret
=
get_input_packet
(
ifile
,
&
pkt
);
if
(
ret
==
AVERROR
(
EAGAIN
))
{
ifile
->
eagain
=
1
;
return
ret
;
}
if
(
ret
<
0
)
{
if
(
ret
!=
AVERROR_EOF
)
{
print_error
(
is
->
filename
,
ret
);
if
(
exit_on_error
)
exit_program
(
1
);
}
ifile
->
eof_reached
=
1
;
for
(
i
=
0
;
i
<
ifile
->
nb_streams
;
i
++
)
{
ist
=
input_streams
[
ifile
->
ist_index
+
i
];
if
(
ist
->
decoding_needed
)
output_packet
(
ist
,
NULL
);
/* mark all outputs that don't go through lavfi as finished */
for
(
j
=
0
;
j
<
nb_output_streams
;
j
++
)
{
OutputStream
*
ost
=
output_streams
[
j
];
if
(
ost
->
source_index
==
ifile
->
ist_index
+
i
&&
(
ost
->
stream_copy
||
ost
->
enc
->
type
==
AVMEDIA_TYPE_SUBTITLE
))
ost
->
is_past_recording_time
=
1
;
}
}
if
(
opt_shortest
)
return
AVERROR_EOF
;
else
return
AVERROR
(
EAGAIN
);
}
reset_eagain
();
if
(
do_pkt_dump
)
{
av_pkt_dump_log2
(
NULL
,
AV_LOG_DEBUG
,
&
pkt
,
do_hex_dump
,
is
->
streams
[
pkt
.
stream_index
]);
}
/* the following test is needed in case new streams appear
dynamically in stream : we ignore them */
if
(
pkt
.
stream_index
>=
ifile
->
nb_streams
)
goto
discard_packet
;
ist
=
input_streams
[
ifile
->
ist_index
+
pkt
.
stream_index
];
if
(
ist
->
discard
)
goto
discard_packet
;
if
(
pkt
.
dts
!=
AV_NOPTS_VALUE
)
pkt
.
dts
+=
av_rescale_q
(
ifile
->
ts_offset
,
AV_TIME_BASE_Q
,
ist
->
st
->
time_base
);
if
(
pkt
.
pts
!=
AV_NOPTS_VALUE
)
pkt
.
pts
+=
av_rescale_q
(
ifile
->
ts_offset
,
AV_TIME_BASE_Q
,
ist
->
st
->
time_base
);
if
(
pkt
.
pts
!=
AV_NOPTS_VALUE
)
pkt
.
pts
*=
ist
->
ts_scale
;
if
(
pkt
.
dts
!=
AV_NOPTS_VALUE
)
pkt
.
dts
*=
ist
->
ts_scale
;
if
(
pkt
.
dts
!=
AV_NOPTS_VALUE
&&
ist
->
next_dts
!=
AV_NOPTS_VALUE
&&
(
is
->
iformat
->
flags
&
AVFMT_TS_DISCONT
))
{
int64_t
pkt_dts
=
av_rescale_q
(
pkt
.
dts
,
ist
->
st
->
time_base
,
AV_TIME_BASE_Q
);
int64_t
delta
=
pkt_dts
-
ist
->
next_dts
;
if
((
FFABS
(
delta
)
>
1LL
*
dts_delta_threshold
*
AV_TIME_BASE
||
pkt_dts
+
1
<
ist
->
last_dts
)
&&
!
copy_ts
)
{
ifile
->
ts_offset
-=
delta
;
av_log
(
NULL
,
AV_LOG_DEBUG
,
"timestamp discontinuity %"
PRId64
", new offset= %"
PRId64
"
\n
"
,
delta
,
ifile
->
ts_offset
);
pkt
.
dts
-=
av_rescale_q
(
delta
,
AV_TIME_BASE_Q
,
ist
->
st
->
time_base
);
if
(
pkt
.
pts
!=
AV_NOPTS_VALUE
)
pkt
.
pts
-=
av_rescale_q
(
delta
,
AV_TIME_BASE_Q
,
ist
->
st
->
time_base
);
}
}
ret
=
output_packet
(
ist
,
&
pkt
);
if
(
ret
<
0
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"Error while decoding stream #%d:%d
\n
"
,
ist
->
file_index
,
ist
->
st
->
index
);
if
(
exit_on_error
)
exit_program
(
1
);
}
discard_packet:
av_free_packet
(
&
pkt
);
return
0
;
}
/*
* The following code is the main loop of the file converter
*/
static
int
transcode
(
void
)
{
int
ret
,
i
;
AVFormatContext
*
is
,
*
os
;
int
ret
,
i
,
need_input
=
1
;
AVFormatContext
*
os
;
OutputStream
*
ost
;
InputStream
*
ist
;
int64_t
timer_start
;
...
...
@@ -2132,107 +2256,28 @@ static int transcode(void)
#endif
while
(
!
received_sigterm
)
{
InputFile
*
ifile
;
AVPacket
pkt
;
/* check if there's any stream where output is still needed */
if
(
!
need_output
())
{
av_log
(
NULL
,
AV_LOG_VERBOSE
,
"No more output streams to write to, finishing.
\n
"
);
break
;
}
/* select the stream that we must read now */
ifile
=
select_input_file
();
/* if none, if is finished */
if
(
!
ifile
)
{
if
(
got_eagain
())
{
reset_eagain
();
av_usleep
(
10000
);
continue
;
}
av_log
(
NULL
,
AV_LOG_VERBOSE
,
"No more inputs to read from, finishing.
\n
"
);
break
;
/* read and process one input packet if needed */
if
(
need_input
)
{
ret
=
process_input
();
if
(
ret
==
AVERROR_EOF
)
need_input
=
0
;
}
is
=
ifile
->
ctx
;
ret
=
get_input_packet
(
ifile
,
&
pkt
);
if
(
ret
==
AVERROR
(
EAGAIN
))
{
ifile
->
eagain
=
1
;
continue
;
}
ret
=
poll_filters
();
if
(
ret
<
0
)
{
if
(
ret
!=
AVERROR_EOF
)
{
print_error
(
is
->
filename
,
ret
);
if
(
exit_on_error
)
exit_program
(
1
);
}
ifile
->
eof_reached
=
1
;
for
(
i
=
0
;
i
<
ifile
->
nb_streams
;
i
++
)
{
ist
=
input_streams
[
ifile
->
ist_index
+
i
];
if
(
ist
->
decoding_needed
)
output_packet
(
ist
,
NULL
);
}
if
(
opt_shortest
)
break
;
else
if
(
ret
==
AVERROR_EOF
||
ret
==
AVERROR
(
EAGAIN
))
continue
;
}
reset_eagain
();
if
(
do_pkt_dump
)
{
av_pkt_dump_log2
(
NULL
,
AV_LOG_DEBUG
,
&
pkt
,
do_hex_dump
,
is
->
streams
[
pkt
.
stream_index
]);
}
/* the following test is needed in case new streams appear
dynamically in stream : we ignore them */
if
(
pkt
.
stream_index
>=
ifile
->
nb_streams
)
goto
discard_packet
;
ist
=
input_streams
[
ifile
->
ist_index
+
pkt
.
stream_index
];
if
(
ist
->
discard
)
goto
discard_packet
;
if
(
pkt
.
dts
!=
AV_NOPTS_VALUE
)
pkt
.
dts
+=
av_rescale_q
(
ifile
->
ts_offset
,
AV_TIME_BASE_Q
,
ist
->
st
->
time_base
);
if
(
pkt
.
pts
!=
AV_NOPTS_VALUE
)
pkt
.
pts
+=
av_rescale_q
(
ifile
->
ts_offset
,
AV_TIME_BASE_Q
,
ist
->
st
->
time_base
);
if
(
pkt
.
pts
!=
AV_NOPTS_VALUE
)
pkt
.
pts
*=
ist
->
ts_scale
;
if
(
pkt
.
dts
!=
AV_NOPTS_VALUE
)
pkt
.
dts
*=
ist
->
ts_scale
;
if
(
pkt
.
dts
!=
AV_NOPTS_VALUE
&&
ist
->
next_dts
!=
AV_NOPTS_VALUE
&&
(
is
->
iformat
->
flags
&
AVFMT_TS_DISCONT
))
{
int64_t
pkt_dts
=
av_rescale_q
(
pkt
.
dts
,
ist
->
st
->
time_base
,
AV_TIME_BASE_Q
);
int64_t
delta
=
pkt_dts
-
ist
->
next_dts
;
if
((
FFABS
(
delta
)
>
1LL
*
dts_delta_threshold
*
AV_TIME_BASE
||
pkt_dts
+
1
<
ist
->
last_dts
)
&&
!
copy_ts
)
{
ifile
->
ts_offset
-=
delta
;
av_log
(
NULL
,
AV_LOG_DEBUG
,
"timestamp discontinuity %"
PRId64
", new offset= %"
PRId64
"
\n
"
,
delta
,
ifile
->
ts_offset
);
pkt
.
dts
-=
av_rescale_q
(
delta
,
AV_TIME_BASE_Q
,
ist
->
st
->
time_base
);
if
(
pkt
.
pts
!=
AV_NOPTS_VALUE
)
pkt
.
pts
-=
av_rescale_q
(
delta
,
AV_TIME_BASE_Q
,
ist
->
st
->
time_base
);
}
}
if
(
output_packet
(
ist
,
&
pkt
)
<
0
||
poll_filters
()
<
0
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"Error while decoding stream #%d:%d
\n
"
,
ist
->
file_index
,
ist
->
st
->
index
);
if
(
exit_on_error
)
exit_program
(
1
);
av_free_packet
(
&
pkt
);
continue
;
av_log
(
NULL
,
AV_LOG_ERROR
,
"Error while filtering.
\n
"
);
break
;
}
discard_packet:
av_free_packet
(
&
pkt
);
/* dump report by using the output first video and audio streams */
print_report
(
0
,
timer_start
);
}
...
...
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