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
94eadee7
Commit
94eadee7
authored
Apr 20, 2011
by
Michael Niedermayer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Merge/split side data.
Signed-off-by:
Michael Niedermayer
<
michaelni@gmx.at
>
parent
007f7739
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
89 additions
and
3 deletions
+89
-3
avcodec.h
libavcodec/avcodec.h
+5
-0
avpacket.c
libavcodec/avpacket.c
+80
-1
utils.c
libavcodec/utils.c
+2
-2
utils.c
libavformat/utils.c
+2
-0
No files found.
libavcodec/avcodec.h
View file @
94eadee7
...
...
@@ -3229,6 +3229,11 @@ uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
uint8_t
*
av_packet_get_side_data
(
AVPacket
*
pkt
,
enum
AVPacketSideDataType
type
,
int
*
size
);
int
av_packet_merge_side_data
(
AVPacket
*
pkt
);
int
av_packet_split_side_data
(
AVPacket
*
pkt
);
/* resample.c */
struct
ReSampleContext
;
...
...
libavcodec/avpacket.c
View file @
94eadee7
...
...
@@ -21,7 +21,7 @@
#include "avcodec.h"
#include "libavutil/avassert.h"
#include "bytestream.h"
void
av_destruct_packet_nofree
(
AVPacket
*
pkt
)
{
...
...
@@ -196,3 +196,82 @@ uint8_t* av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
}
return
NULL
;
}
#define FF_MERGE_MARKER 0x8c4d9d108e25e9feULL
int
av_packet_merge_side_data
(
AVPacket
*
pkt
){
if
(
pkt
->
side_data_elems
){
int
i
;
uint8_t
*
p
;
uint64_t
size
=
pkt
->
size
+
8LL
+
FF_INPUT_BUFFER_PADDING_SIZE
;
AVPacket
old
=
*
pkt
;
for
(
i
=
0
;
i
<
old
.
side_data_elems
;
i
++
)
{
size
+=
old
.
side_data
[
i
].
size
+
5LL
;
}
if
(
size
>
INT_MAX
)
return
AVERROR
(
EINVAL
);
p
=
av_malloc
(
size
);
if
(
!
p
)
return
AVERROR
(
ENOMEM
);
pkt
->
data
=
p
;
pkt
->
destruct
=
av_destruct_packet
;
pkt
->
size
=
size
-
FF_INPUT_BUFFER_PADDING_SIZE
;
bytestream_put_buffer
(
&
p
,
old
.
data
,
old
.
size
);
for
(
i
=
old
.
side_data_elems
-
1
;
i
>=
0
;
i
--
)
{
bytestream_put_buffer
(
&
p
,
old
.
side_data
[
i
].
data
,
old
.
side_data
[
i
].
size
);
bytestream_put_be32
(
&
p
,
old
.
side_data
[
i
].
size
);
*
p
++
=
old
.
side_data
[
i
].
type
|
((
i
==
old
.
side_data_elems
-
1
)
*
128
);
}
bytestream_put_be64
(
&
p
,
FF_MERGE_MARKER
);
av_assert0
(
p
-
pkt
->
data
==
pkt
->
size
);
memset
(
p
,
0
,
FF_INPUT_BUFFER_PADDING_SIZE
);
av_free_packet
(
&
old
);
pkt
->
side_data_elems
=
0
;
pkt
->
side_data
=
NULL
;
return
1
;
}
return
0
;
}
int
av_packet_split_side_data
(
AVPacket
*
pkt
){
if
(
!
pkt
->
side_data_elems
&&
pkt
->
size
>
12
&&
AV_RB64
(
pkt
->
data
+
pkt
->
size
-
8
)
==
FF_MERGE_MARKER
){
int
i
;
unsigned
int
size
;
uint8_t
*
p
=
pkt
->
data
+
pkt
->
size
-
8
-
5
;
av_dup_packet
(
pkt
);
for
(
i
=
1
;
;
i
++
){
size
=
AV_RB32
(
p
);
if
(
size
>
INT_MAX
||
p
-
pkt
->
data
<=
size
)
return
0
;
if
(
p
[
4
]
&
128
)
break
;
p
-=
size
+
5
;
}
pkt
->
side_data
=
av_malloc
(
i
*
sizeof
(
*
pkt
->
side_data
));
if
(
!
pkt
->
side_data
)
return
AVERROR
(
ENOMEM
);
p
=
pkt
->
data
+
pkt
->
size
-
8
-
5
;
for
(
i
=
0
;
;
i
++
){
size
=
AV_RB32
(
p
);
av_assert0
(
size
<=
INT_MAX
&&
p
-
pkt
->
data
>
size
);
pkt
->
side_data
[
i
].
data
=
av_malloc
(
size
+
FF_INPUT_BUFFER_PADDING_SIZE
);
pkt
->
side_data
[
i
].
size
=
size
;
pkt
->
side_data
[
i
].
type
=
p
[
4
]
&
127
;
if
(
!
pkt
->
side_data
[
i
].
data
)
return
AVERROR
(
ENOMEM
);
memcpy
(
pkt
->
side_data
[
i
].
data
,
p
-
size
,
size
);
pkt
->
size
-=
size
+
5
;
if
(
p
[
4
]
&
128
)
break
;
p
-=
size
+
5
;
}
pkt
->
size
-=
8
;
pkt
->
side_data_elems
=
i
+
1
;
return
1
;
}
return
0
;
}
libavcodec/utils.c
View file @
94eadee7
...
...
@@ -733,9 +733,9 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
if
((
avctx
->
coded_width
||
avctx
->
coded_height
)
&&
av_image_check_size
(
avctx
->
coded_width
,
avctx
->
coded_height
,
0
,
avctx
))
return
-
1
;
avctx
->
pkt
=
avpkt
;
if
((
avctx
->
codec
->
capabilities
&
CODEC_CAP_DELAY
)
||
avpkt
->
size
||
(
avctx
->
active_thread_type
&
FF_THREAD_FRAME
)){
av_packet_split_side_data
(
avpkt
);
avctx
->
pkt
=
avpkt
;
if
(
HAVE_PTHREADS
&&
avctx
->
active_thread_type
&
FF_THREAD_FRAME
)
ret
=
ff_thread_decode_frame
(
avctx
,
picture
,
got_picture_ptr
,
avpkt
);
...
...
libavformat/utils.c
View file @
94eadee7
...
...
@@ -672,6 +672,8 @@ int av_read_packet(AVFormatContext *s, AVPacket *pkt)
s
->
streams
[
i
]
->
request_probe
=
-
1
;
continue
;
}
av_packet_merge_side_data
(
pkt
);
st
=
s
->
streams
[
pkt
->
stream_index
];
switch
(
st
->
codec
->
codec_type
){
...
...
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