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
31a46750
Commit
31a46750
authored
Mar 06, 2014
by
Anton Khirnov
Committed by
Luca Barbato
May 11, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vda: use hwaccel private data for internal bitstream buffer
parent
66e6c8a7
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
38 additions
and
18 deletions
+38
-18
vda.h
libavcodec/vda.h
+3
-3
vda_h264.c
libavcodec/vda_h264.c
+35
-15
No files found.
libavcodec/vda.h
View file @
31a46750
...
...
@@ -112,17 +112,17 @@ struct vda_context {
OSType
cv_pix_fmt_type
;
/**
*
The current bitstream buffer.
*
unused
*/
uint8_t
*
priv_bitstream
;
/**
*
The current size of the bitstream.
*
unused
*/
int
priv_bitstream_size
;
/**
*
The reference size used for fast reallocation.
*
unused
*/
int
priv_allocated_size
;
};
...
...
libavcodec/vda_h264.c
View file @
31a46750
...
...
@@ -28,6 +28,17 @@
#include "h264.h"
#include "vda.h"
typedef
struct
VDAContext
{
// The current bitstream buffer.
uint8_t
*
bitstream
;
// The current size of the bitstream.
int
bitstream_size
;
// The reference size used for fast reallocation.
int
allocated_size
;
}
VDAContext
;
/* Decoder callback that adds the VDA frame to the queue in display order. */
static
void
vda_decoder_callback
(
void
*
vda_hw_ctx
,
CFDictionaryRef
user_info
,
...
...
@@ -46,15 +57,15 @@ static void vda_decoder_callback(void *vda_hw_ctx,
vda_ctx
->
cv_buffer
=
CVPixelBufferRetain
(
image_buffer
);
}
static
int
vda_sync_decode
(
struct
vda_context
*
vda_ctx
)
static
int
vda_sync_decode
(
VDAContext
*
ctx
,
struct
vda_context
*
vda_ctx
)
{
OSStatus
status
;
CFDataRef
coded_frame
;
uint32_t
flush_flags
=
1
<<
0
;
///< kVDADecoderFlush_emitFrames
coded_frame
=
CFDataCreate
(
kCFAllocatorDefault
,
vda_ctx
->
priv_
bitstream
,
vda_ctx
->
priv_
bitstream_size
);
ctx
->
bitstream
,
ctx
->
bitstream_size
);
status
=
VDADecoderDecode
(
vda_ctx
->
decoder
,
0
,
coded_frame
,
NULL
);
...
...
@@ -71,12 +82,13 @@ static int vda_h264_start_frame(AVCodecContext *avctx,
av_unused
const
uint8_t
*
buffer
,
av_unused
uint32_t
size
)
{
VDAContext
*
vda
=
avctx
->
internal
->
hwaccel_priv_data
;
struct
vda_context
*
vda_ctx
=
avctx
->
hwaccel_context
;
if
(
!
vda_ctx
->
decoder
)
return
-
1
;
vda
_ctx
->
priv_
bitstream_size
=
0
;
vda
->
bitstream_size
=
0
;
return
0
;
}
...
...
@@ -85,24 +97,25 @@ static int vda_h264_decode_slice(AVCodecContext *avctx,
const
uint8_t
*
buffer
,
uint32_t
size
)
{
VDAContext
*
vda
=
avctx
->
internal
->
hwaccel_priv_data
;
struct
vda_context
*
vda_ctx
=
avctx
->
hwaccel_context
;
void
*
tmp
;
if
(
!
vda_ctx
->
decoder
)
return
-
1
;
tmp
=
av_fast_realloc
(
vda
_ctx
->
priv_
bitstream
,
&
vda
_ctx
->
priv_
allocated_size
,
vda
_ctx
->
priv_
bitstream_size
+
size
+
4
);
tmp
=
av_fast_realloc
(
vda
->
bitstream
,
&
vda
->
allocated_size
,
vda
->
bitstream_size
+
size
+
4
);
if
(
!
tmp
)
return
AVERROR
(
ENOMEM
);
vda
_ctx
->
priv_
bitstream
=
tmp
;
vda
->
bitstream
=
tmp
;
AV_WB32
(
vda
_ctx
->
priv_bitstream
+
vda_ctx
->
priv_
bitstream_size
,
size
);
memcpy
(
vda
_ctx
->
priv_bitstream
+
vda_ctx
->
priv_
bitstream_size
+
4
,
buffer
,
size
);
AV_WB32
(
vda
->
bitstream
+
vda
->
bitstream_size
,
size
);
memcpy
(
vda
->
bitstream
+
vda
->
bitstream_size
+
4
,
buffer
,
size
);
vda
_ctx
->
priv_
bitstream_size
+=
size
+
4
;
vda
->
bitstream_size
+=
size
+
4
;
return
0
;
}
...
...
@@ -110,14 +123,15 @@ static int vda_h264_decode_slice(AVCodecContext *avctx,
static
int
vda_h264_end_frame
(
AVCodecContext
*
avctx
)
{
H264Context
*
h
=
avctx
->
priv_data
;
VDAContext
*
vda
=
avctx
->
internal
->
hwaccel_priv_data
;
struct
vda_context
*
vda_ctx
=
avctx
->
hwaccel_context
;
AVFrame
*
frame
=
&
h
->
cur_pic_ptr
->
f
;
int
status
;
if
(
!
vda_ctx
->
decoder
||
!
vda
_ctx
->
priv_
bitstream
)
if
(
!
vda_ctx
->
decoder
||
!
vda
->
bitstream
)
return
-
1
;
status
=
vda_sync_decode
(
vda_ctx
);
status
=
vda_sync_decode
(
vda
,
vda
_ctx
);
frame
->
data
[
3
]
=
(
void
*
)
vda_ctx
->
cv_buffer
;
if
(
status
)
...
...
@@ -217,11 +231,15 @@ int ff_vda_destroy_decoder(struct vda_context *vda_ctx)
if
(
vda_ctx
->
decoder
)
status
=
VDADecoderDestroy
(
vda_ctx
->
decoder
);
av_freep
(
&
vda_ctx
->
priv_bitstream
);
return
status
;
}
static
void
vda_h264_uninit
(
AVCodecContext
*
avctx
)
{
VDAContext
*
vda
=
avctx
->
internal
->
priv_data
;
av_freep
(
&
vda
->
bitstream
);
}
AVHWAccel
ff_h264_vda_hwaccel
=
{
.
name
=
"h264_vda"
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
...
...
@@ -230,4 +248,6 @@ AVHWAccel ff_h264_vda_hwaccel = {
.
start_frame
=
vda_h264_start_frame
,
.
decode_slice
=
vda_h264_decode_slice
,
.
end_frame
=
vda_h264_end_frame
,
.
uninit
=
vda_h264_uninit
,
.
priv_data_size
=
sizeof
(
VDAContext
),
};
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