Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
eb336817
Commit
eb336817
authored
Jan 03, 2017
by
Matthieu Bouron
Committed by
Matthieu Bouron
Jan 12, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavfi/framepool: add audio support
parent
b1f68f00
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
144 additions
and
1 deletion
+144
-1
framepool.c
libavfilter/framepool.c
+109
-0
framepool.h
libavfilter/framepool.h
+35
-1
No files found.
libavfilter/framepool.c
View file @
eb336817
...
...
@@ -20,6 +20,7 @@
#include "framepool.h"
#include "libavutil/avassert.h"
#include "libavutil/avutil.h"
#include "libavutil/buffer.h"
#include "libavutil/frame.h"
#include "libavutil/imgutils.h"
...
...
@@ -28,8 +29,18 @@
struct
FFFramePool
{
enum
AVMediaType
type
;
/* video */
int
width
;
int
height
;
/* audio */
int
planes
;
int
channels
;
int
nb_samples
;
/* common */
int
format
;
int
align
;
int
linesize
[
4
];
...
...
@@ -54,6 +65,7 @@ FFFramePool *ff_frame_pool_video_init(AVBufferRef* (*alloc)(int size),
if
(
!
pool
)
return
NULL
;
pool
->
type
=
AVMEDIA_TYPE_VIDEO
;
pool
->
width
=
width
;
pool
->
height
=
height
;
pool
->
format
=
format
;
...
...
@@ -104,6 +116,44 @@ fail:
return
NULL
;
}
FFFramePool
*
ff_frame_pool_audio_init
(
AVBufferRef
*
(
*
alloc
)(
int
size
),
int
channels
,
int
nb_samples
,
enum
AVSampleFormat
format
,
int
align
)
{
int
ret
,
planar
;
FFFramePool
*
pool
;
pool
=
av_mallocz
(
sizeof
(
FFFramePool
));
if
(
!
pool
)
return
NULL
;
planar
=
av_sample_fmt_is_planar
(
format
);
pool
->
type
=
AVMEDIA_TYPE_AUDIO
;
pool
->
planes
=
planar
?
channels
:
1
;
pool
->
channels
=
channels
;
pool
->
nb_samples
=
nb_samples
;
pool
->
format
=
format
;
pool
->
align
=
align
;
ret
=
av_samples_get_buffer_size
(
&
pool
->
linesize
[
0
],
channels
,
nb_samples
,
format
,
0
);
if
(
ret
<
0
)
goto
fail
;
pool
->
pools
[
0
]
=
av_buffer_pool_init
(
pool
->
linesize
[
0
],
NULL
);
if
(
!
pool
->
pools
[
0
])
goto
fail
;
return
pool
;
fail:
ff_frame_pool_uninit
(
&
pool
);
return
NULL
;
}
int
ff_frame_pool_get_video_config
(
FFFramePool
*
pool
,
int
*
width
,
int
*
height
,
...
...
@@ -113,6 +163,8 @@ int ff_frame_pool_get_video_config(FFFramePool *pool,
if
(
!
pool
)
return
AVERROR
(
EINVAL
);
av_assert0
(
pool
->
type
==
AVMEDIA_TYPE_VIDEO
);
*
width
=
pool
->
width
;
*
height
=
pool
->
height
;
*
format
=
pool
->
format
;
...
...
@@ -121,6 +173,24 @@ int ff_frame_pool_get_video_config(FFFramePool *pool,
return
0
;
}
int
ff_frame_pool_get_audio_config
(
FFFramePool
*
pool
,
int
*
channels
,
int
*
nb_samples
,
enum
AVSampleFormat
*
format
,
int
*
align
)
{
if
(
!
pool
)
return
AVERROR
(
EINVAL
);
av_assert0
(
pool
->
type
==
AVMEDIA_TYPE_AUDIO
);
*
channels
=
pool
->
channels
;
*
nb_samples
=
pool
->
nb_samples
;
*
format
=
pool
->
format
;
*
align
=
pool
->
align
;
return
0
;
}
AVFrame
*
ff_frame_pool_get
(
FFFramePool
*
pool
)
{
...
...
@@ -133,6 +203,8 @@ AVFrame *ff_frame_pool_get(FFFramePool *pool)
return
NULL
;
}
switch
(
pool
->
type
)
{
case
AVMEDIA_TYPE_VIDEO
:
desc
=
av_pix_fmt_desc_get
(
pool
->
format
);
if
(
!
desc
)
{
goto
fail
;
...
...
@@ -167,6 +239,43 @@ AVFrame *ff_frame_pool_get(FFFramePool *pool)
}
frame
->
extended_data
=
frame
->
data
;
break
;
case
AVMEDIA_TYPE_AUDIO
:
frame
->
nb_samples
=
pool
->
nb_samples
;
av_frame_set_channels
(
frame
,
pool
->
channels
);
frame
->
format
=
pool
->
format
;
frame
->
linesize
[
0
]
=
pool
->
linesize
[
0
];
if
(
pool
->
planes
>
AV_NUM_DATA_POINTERS
)
{
frame
->
extended_data
=
av_mallocz_array
(
pool
->
planes
,
sizeof
(
*
frame
->
extended_data
));
frame
->
nb_extended_buf
=
pool
->
planes
-
AV_NUM_DATA_POINTERS
;
frame
->
extended_buf
=
av_mallocz_array
(
frame
->
nb_extended_buf
,
sizeof
(
*
frame
->
extended_buf
));
if
(
!
frame
->
extended_data
||
!
frame
->
extended_buf
)
goto
fail
;
}
else
{
frame
->
extended_data
=
frame
->
data
;
av_assert0
(
frame
->
nb_extended_buf
==
0
);
}
for
(
i
=
0
;
i
<
FFMIN
(
pool
->
planes
,
AV_NUM_DATA_POINTERS
);
i
++
)
{
frame
->
buf
[
i
]
=
av_buffer_pool_get
(
pool
->
pools
[
0
]);
if
(
!
frame
->
buf
[
i
])
goto
fail
;
frame
->
extended_data
[
i
]
=
frame
->
data
[
i
]
=
frame
->
buf
[
i
]
->
data
;
}
for
(
i
=
0
;
i
<
frame
->
nb_extended_buf
;
i
++
)
{
frame
->
extended_buf
[
i
]
=
av_buffer_pool_get
(
pool
->
pools
[
0
]);
if
(
!
frame
->
extended_buf
[
i
])
goto
fail
;
frame
->
extended_data
[
i
+
AV_NUM_DATA_POINTERS
]
=
frame
->
extended_buf
[
i
]
->
data
;
}
break
;
default:
av_assert0
(
0
);
}
return
frame
;
fail:
...
...
libavfilter/framepool.h
View file @
eb336817
...
...
@@ -41,7 +41,7 @@ typedef struct FFFramePool FFFramePool;
* @param height height of each frame in this pool
* @param format format of each frame in this pool
* @param align buffers alignement of each frame in this pool
* @return newly created frame pool on success, NULL on error.
* @return newly created
video
frame pool on success, NULL on error.
*/
FFFramePool
*
ff_frame_pool_video_init
(
AVBufferRef
*
(
*
alloc
)(
int
size
),
int
width
,
...
...
@@ -49,6 +49,24 @@ FFFramePool *ff_frame_pool_video_init(AVBufferRef* (*alloc)(int size),
enum
AVPixelFormat
format
,
int
align
);
/**
* Allocate and initialize an audio frame pool.
*
* @param alloc a function that will be used to allocate new frame buffers when
* the pool is empty. May be NULL, then the default allocator will be used
* (av_buffer_alloc()).
* @param channels channels of each frame in this pool
* @param nb_samples number of samples of each frame in this pool
* @param format format of each frame in this pool
* @param align buffers alignement of each frame in this pool
* @return newly created audio frame pool on success, NULL on error.
*/
FFFramePool
*
ff_frame_pool_audio_init
(
AVBufferRef
*
(
*
alloc
)(
int
size
),
int
channels
,
int
samples
,
enum
AVSampleFormat
format
,
int
align
);
/**
* Deallocate the frame pool. It is safe to call this function while
* some of the allocated frame are still in use.
...
...
@@ -72,6 +90,22 @@ int ff_frame_pool_get_video_config(FFFramePool *pool,
enum
AVPixelFormat
*
format
,
int
*
align
);
/**
* Get the audio frame pool configuration.
*
* @param channels channels of each frame in this pool
* @param nb_samples number of samples of each frame in this pool
* @param format format of each frame in this pool
* @param align buffers alignement of each frame in this pool
* @return 0 on success, a negative AVERROR otherwise.
*/
int
ff_frame_pool_get_audio_config
(
FFFramePool
*
pool
,
int
*
channels
,
int
*
nb_samples
,
enum
AVSampleFormat
*
format
,
int
*
align
);
/**
* Allocate a new AVFrame, reussing old buffers from the pool when available.
* This function may be called simultaneously from multiple threads.
...
...
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