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
1155fd02
Commit
1155fd02
authored
Feb 11, 2014
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
frame: add a convenience function for copying AVFrame data
parent
746dca48
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
82 additions
and
17 deletions
+82
-17
APIchanges
doc/APIchanges
+3
-0
frame.c
libavutil/frame.c
+65
-16
frame.h
libavutil/frame.h
+13
-0
version.h
libavutil/version.h
+1
-1
No files found.
doc/APIchanges
View file @
1155fd02
...
@@ -13,6 +13,9 @@ libavutil: 2013-12-xx
...
@@ -13,6 +13,9 @@ libavutil: 2013-12-xx
API changes, most recent first:
API changes, most recent first:
2014-xx-xx - xxxxxxx - lavu 53.05.0 - frame.h
Add av_frame_copy() for copying the frame data.
2014-02-xx - xxxxxxx - lavr 1.2.0 - avresample.h
2014-02-xx - xxxxxxx - lavr 1.2.0 - avresample.h
Add avresample_is_open() for checking whether a resample context is open.
Add avresample_is_open() for checking whether a resample context is open.
...
...
libavutil/frame.c
View file @
1155fd02
...
@@ -191,15 +191,11 @@ int av_frame_ref(AVFrame *dst, const AVFrame *src)
...
@@ -191,15 +191,11 @@ int av_frame_ref(AVFrame *dst, const AVFrame *src)
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
if
(
src
->
nb_samples
)
{
ret
=
av_frame_copy
(
dst
,
src
);
int
ch
=
av_get_channel_layout_nb_channels
(
src
->
channel_layout
);
if
(
ret
<
0
)
av_samples_copy
(
dst
->
extended_data
,
src
->
extended_data
,
0
,
0
,
av_frame_unref
(
dst
);
dst
->
nb_samples
,
ch
,
dst
->
format
);
}
else
{
return
ret
;
av_image_copy
(
dst
->
data
,
dst
->
linesize
,
src
->
data
,
src
->
linesize
,
dst
->
format
,
dst
->
width
,
dst
->
height
);
}
return
0
;
}
}
/* ref the buffers */
/* ref the buffers */
...
@@ -335,13 +331,10 @@ int av_frame_make_writable(AVFrame *frame)
...
@@ -335,13 +331,10 @@ int av_frame_make_writable(AVFrame *frame)
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
if
(
tmp
.
nb_samples
)
{
ret
=
av_frame_copy
(
&
tmp
,
frame
);
int
ch
=
av_get_channel_layout_nb_channels
(
tmp
.
channel_layout
);
if
(
ret
<
0
)
{
av_samples_copy
(
tmp
.
extended_data
,
frame
->
extended_data
,
0
,
0
,
av_frame_unref
(
&
tmp
);
frame
->
nb_samples
,
ch
,
frame
->
format
);
return
ret
;
}
else
{
av_image_copy
(
tmp
.
data
,
tmp
.
linesize
,
frame
->
data
,
frame
->
linesize
,
frame
->
format
,
frame
->
width
,
frame
->
height
);
}
}
ret
=
av_frame_copy_props
(
&
tmp
,
frame
);
ret
=
av_frame_copy_props
(
&
tmp
,
frame
);
...
@@ -477,3 +470,59 @@ AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
...
@@ -477,3 +470,59 @@ AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
}
}
return
NULL
;
return
NULL
;
}
}
static
int
frame_copy_video
(
AVFrame
*
dst
,
const
AVFrame
*
src
)
{
const
uint8_t
*
src_data
[
4
];
int
i
,
planes
;
if
(
dst
->
width
!=
src
->
width
||
dst
->
height
!=
src
->
height
)
return
AVERROR
(
EINVAL
);
planes
=
av_pix_fmt_count_planes
(
dst
->
format
);
for
(
i
=
0
;
i
<
planes
;
i
++
)
if
(
!
dst
->
data
[
i
]
||
!
src
->
data
[
i
])
return
AVERROR
(
EINVAL
);
memcpy
(
src_data
,
src
->
data
,
sizeof
(
src_data
));
av_image_copy
(
dst
->
data
,
dst
->
linesize
,
src_data
,
src
->
linesize
,
dst
->
format
,
dst
->
width
,
dst
->
height
);
return
0
;
}
static
int
frame_copy_audio
(
AVFrame
*
dst
,
const
AVFrame
*
src
)
{
int
planar
=
av_sample_fmt_is_planar
(
dst
->
format
);
int
channels
=
av_get_channel_layout_nb_channels
(
dst
->
channel_layout
);
int
planes
=
planar
?
channels
:
1
;
int
i
;
if
(
dst
->
nb_samples
!=
src
->
nb_samples
||
dst
->
channel_layout
!=
src
->
channel_layout
)
return
AVERROR
(
EINVAL
);
for
(
i
=
0
;
i
<
planes
;
i
++
)
if
(
!
dst
->
extended_data
[
i
]
||
!
src
->
extended_data
[
i
])
return
AVERROR
(
EINVAL
);
av_samples_copy
(
dst
->
extended_data
,
src
->
extended_data
,
0
,
0
,
dst
->
nb_samples
,
channels
,
dst
->
format
);
return
0
;
}
int
av_frame_copy
(
AVFrame
*
dst
,
const
AVFrame
*
src
)
{
if
(
dst
->
format
!=
src
->
format
||
dst
->
format
<
0
)
return
AVERROR
(
EINVAL
);
if
(
dst
->
width
>
0
&&
dst
->
height
>
0
)
return
frame_copy_video
(
dst
,
src
);
else
if
(
dst
->
nb_samples
>
0
&&
dst
->
channel_layout
)
return
frame_copy_audio
(
dst
,
src
);
return
AVERROR
(
EINVAL
);
}
libavutil/frame.h
View file @
1155fd02
...
@@ -505,6 +505,19 @@ int av_frame_is_writable(AVFrame *frame);
...
@@ -505,6 +505,19 @@ int av_frame_is_writable(AVFrame *frame);
*/
*/
int
av_frame_make_writable
(
AVFrame
*
frame
);
int
av_frame_make_writable
(
AVFrame
*
frame
);
/**
* Copy the frame data from src to dst.
*
* This function does not allocate anything, dst must be already initialized and
* allocated with the same parameters as src.
*
* This function only copies the frame data (i.e. the contents of the data /
* extended data arrays), not any other properties.
*
* @return >= 0 on success, a negative AVERROR on error.
*/
int
av_frame_copy
(
AVFrame
*
dst
,
const
AVFrame
*
src
);
/**
/**
* Copy only "metadata" fields from src to dst.
* Copy only "metadata" fields from src to dst.
*
*
...
...
libavutil/version.h
View file @
1155fd02
...
@@ -54,7 +54,7 @@
...
@@ -54,7 +54,7 @@
*/
*/
#define LIBAVUTIL_VERSION_MAJOR 53
#define LIBAVUTIL_VERSION_MAJOR 53
#define LIBAVUTIL_VERSION_MINOR
4
#define LIBAVUTIL_VERSION_MINOR
5
#define LIBAVUTIL_VERSION_MICRO 0
#define LIBAVUTIL_VERSION_MICRO 0
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
...
...
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