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
8cb76ef2
Commit
8cb76ef2
authored
Nov 11, 2012
by
Stefano Sabatini
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavc/libtheoraenc: return proper error codes
parent
799d749c
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
29 additions
and
23 deletions
+29
-23
libtheoraenc.c
libavcodec/libtheoraenc.c
+29
-23
No files found.
libavcodec/libtheoraenc.c
View file @
8cb76ef2
...
...
@@ -59,21 +59,26 @@ static int concatenate_packet(unsigned int* offset,
const
char
*
message
=
NULL
;
uint8_t
*
newdata
=
NULL
;
int
newsize
=
avc_context
->
extradata_size
+
2
+
packet
->
bytes
;
int
ret
;
if
(
packet
->
bytes
<
0
)
{
message
=
"ogg_packet has negative size"
;
ret
=
AVERROR_INVALIDDATA
;
}
else
if
(
packet
->
bytes
>
0xffff
)
{
message
=
"ogg_packet is larger than 65535 bytes"
;
ret
=
AVERROR_INVALIDDATA
;
}
else
if
(
newsize
<
avc_context
->
extradata_size
)
{
message
=
"extradata_size would overflow"
;
ret
=
AVERROR_INVALIDDATA
;
}
else
{
newdata
=
av_realloc
(
avc_context
->
extradata
,
newsize
);
if
(
!
newdata
)
message
=
"av_realloc failed"
;
ret
=
AVERROR
(
ENOMEM
);
}
if
(
message
)
{
av_log
(
avc_context
,
AV_LOG_ERROR
,
"concatenate_packet failed: %s
\n
"
,
message
);
return
-
1
;
return
ret
;
}
avc_context
->
extradata
=
newdata
;
...
...
@@ -95,7 +100,7 @@ static int get_stats(AVCodecContext *avctx, int eos)
bytes
=
th_encode_ctl
(
h
->
t_state
,
TH_ENCCTL_2PASS_OUT
,
&
buf
,
sizeof
(
buf
));
if
(
bytes
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error getting first pass stats
\n
"
);
return
-
1
;
return
AVERROR_EXTERNAL
;
}
if
(
!
eos
)
{
h
->
stats
=
av_fast_realloc
(
h
->
stats
,
&
h
->
stats_size
,
...
...
@@ -112,7 +117,7 @@ static int get_stats(AVCodecContext *avctx, int eos)
return
0
;
#else
av_log
(
avctx
,
AV_LOG_ERROR
,
"libtheora too old to support 2pass
\n
"
);
return
-
1
;
return
AVERROR
(
ENOSUP
)
;
#endif
}
...
...
@@ -126,7 +131,7 @@ static int submit_stats(AVCodecContext *avctx)
if
(
!
h
->
stats
)
{
if
(
!
avctx
->
stats_in
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"No statsfile for second pass
\n
"
);
return
-
1
;
return
AVERROR
(
EINVAL
)
;
}
h
->
stats_size
=
strlen
(
avctx
->
stats_in
)
*
3
/
4
;
h
->
stats
=
av_malloc
(
h
->
stats_size
);
...
...
@@ -138,7 +143,7 @@ static int submit_stats(AVCodecContext *avctx)
h
->
stats_size
-
h
->
stats_offset
);
if
(
bytes
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error submitting stats
\n
"
);
return
-
1
;
return
AVERROR_EXTERNAL
;
}
if
(
!
bytes
)
return
0
;
...
...
@@ -147,7 +152,7 @@ static int submit_stats(AVCodecContext *avctx)
return
0
;
#else
av_log
(
avctx
,
AV_LOG_ERROR
,
"libtheora too old to support 2pass
\n
"
);
return
-
1
;
return
AVERROR
(
ENOSUP
)
;
#endif
}
...
...
@@ -159,6 +164,7 @@ static av_cold int encode_init(AVCodecContext* avc_context)
unsigned
int
offset
;
TheoraContext
*
h
=
avc_context
->
priv_data
;
uint32_t
gop_size
=
avc_context
->
gop_size
;
int
ret
;
/* Set up the theora_info struct */
th_info_init
(
&
t_info
);
...
...
@@ -195,7 +201,7 @@ static av_cold int encode_init(AVCodecContext* avc_context)
t_info
.
pixel_fmt
=
TH_PF_444
;
else
{
av_log
(
avc_context
,
AV_LOG_ERROR
,
"Unsupported pix_fmt
\n
"
);
return
-
1
;
return
AVERROR
(
EINVAL
)
;
}
avcodec_get_chroma_sub_sample
(
avc_context
->
pix_fmt
,
&
h
->
uv_hshift
,
&
h
->
uv_vshift
);
...
...
@@ -216,7 +222,7 @@ static av_cold int encode_init(AVCodecContext* avc_context)
h
->
t_state
=
th_encode_alloc
(
&
t_info
);
if
(
!
h
->
t_state
)
{
av_log
(
avc_context
,
AV_LOG_ERROR
,
"theora_encode_init failed
\n
"
);
return
-
1
;
return
AVERROR_EXTERNAL
;
}
h
->
keyframe_mask
=
(
1
<<
t_info
.
keyframe_granule_shift
)
-
1
;
...
...
@@ -226,16 +232,16 @@ static av_cold int encode_init(AVCodecContext* avc_context)
if
(
th_encode_ctl
(
h
->
t_state
,
TH_ENCCTL_SET_KEYFRAME_FREQUENCY_FORCE
,
&
gop_size
,
sizeof
(
gop_size
)))
{
av_log
(
avc_context
,
AV_LOG_ERROR
,
"Error setting GOP size
\n
"
);
return
-
1
;
return
AVERROR_EXTERNAL
;
}
// need to enable 2 pass (via TH_ENCCTL_2PASS_) before encoding headers
if
(
avc_context
->
flags
&
CODEC_FLAG_PASS1
)
{
if
(
get_stats
(
avc_context
,
0
)
)
return
-
1
;
if
(
(
ret
=
get_stats
(
avc_context
,
0
))
<
0
)
return
ret
;
}
else
if
(
avc_context
->
flags
&
CODEC_FLAG_PASS2
)
{
if
(
submit_stats
(
avc_context
)
)
return
-
1
;
if
(
(
ret
=
submit_stats
(
avc_context
))
<
0
)
return
ret
;
}
/*
...
...
@@ -251,8 +257,8 @@ static av_cold int encode_init(AVCodecContext* avc_context)
th_comment_init
(
&
t_comment
);
while
(
th_encode_flushheader
(
h
->
t_state
,
&
t_comment
,
&
o_packet
))
if
(
concatenate_packet
(
&
offset
,
avc_context
,
&
o_packet
)
)
return
-
1
;
if
(
(
ret
=
concatenate_packet
(
&
offset
,
avc_context
,
&
o_packet
))
<
0
)
return
ret
;
th_comment_clear
(
&
t_comment
);
...
...
@@ -274,8 +280,8 @@ static int encode_frame(AVCodecContext* avc_context, AVPacket *pkt,
if
(
!
frame
)
{
th_encode_packetout
(
h
->
t_state
,
1
,
&
o_packet
);
if
(
avc_context
->
flags
&
CODEC_FLAG_PASS1
)
if
(
get_stats
(
avc_context
,
1
)
)
return
-
1
;
if
(
(
ret
=
get_stats
(
avc_context
,
1
))
<
0
)
return
ret
;
return
0
;
}
...
...
@@ -288,8 +294,8 @@ static int encode_frame(AVCodecContext* avc_context, AVPacket *pkt,
}
if
(
avc_context
->
flags
&
CODEC_FLAG_PASS2
)
if
(
submit_stats
(
avc_context
)
)
return
-
1
;
if
(
(
ret
=
submit_stats
(
avc_context
))
<
0
)
return
ret
;
/* Now call into theora_encode_YUVin */
result
=
th_encode_ycbcr_in
(
h
->
t_state
,
t_yuv_buffer
);
...
...
@@ -307,12 +313,12 @@ static int encode_frame(AVCodecContext* avc_context, AVPacket *pkt,
break
;
}
av_log
(
avc_context
,
AV_LOG_ERROR
,
"theora_encode_YUVin failed (%s) [%d]
\n
"
,
message
,
result
);
return
-
1
;
return
AVERROR_EXTERNAL
;
}
if
(
avc_context
->
flags
&
CODEC_FLAG_PASS1
)
if
(
get_stats
(
avc_context
,
0
)
)
return
-
1
;
if
(
(
ret
=
get_stats
(
avc_context
,
0
))
<
0
)
return
ret
;
/* Pick up returned ogg_packet */
result
=
th_encode_packetout
(
h
->
t_state
,
0
,
&
o_packet
);
...
...
@@ -325,7 +331,7 @@ static int encode_frame(AVCodecContext* avc_context, AVPacket *pkt,
break
;
default:
av_log
(
avc_context
,
AV_LOG_ERROR
,
"theora_encode_packetout failed [%d]
\n
"
,
result
);
return
-
1
;
return
AVERROR_EXTERNAL
;
}
/* Copy ogg_packet content out to buffer */
...
...
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