diff options
author | Sebastien Zwickert <dilaroga@free.fr> | 2012-04-10 13:48:08 +0200 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2012-04-10 15:50:56 +0300 |
commit | a40ba3afe8182c86ed6fc80437c843b3d88e0d00 (patch) | |
tree | 0f5d54fa760a45a12c604dfda61c4f0294e245f5 | |
parent | 14f063d294a18a31928d2167a66b1087910e14c8 (diff) | |
download | ffmpeg-a40ba3afe8182c86ed6fc80437c843b3d88e0d00.tar.gz |
vda: Signal 4 byte NAL headers to the decoder regardless of what's in the extradata
Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r-- | libavcodec/vda.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/libavcodec/vda.c b/libavcodec/vda.c index 34739f8e0c..3c03dcd3e0 100644 --- a/libavcodec/vda.c +++ b/libavcodec/vda.c @@ -142,6 +142,26 @@ int ff_vda_create_decoder(struct vda_context *vda_ctx, pthread_mutex_init(&vda_ctx->queue_mutex, NULL); + /* Each VCL NAL in the bistream sent to the decoder + * is preceeded by a 4 bytes length header. + * Change the avcC atom header if needed, to signal headers of 4 bytes. */ + if (extradata_size >= 4 && (extradata[4] & 0x03) != 0x03) { + uint8_t *rw_extradata; + + if (!(rw_extradata = av_malloc(extradata_size))) + return AVERROR(ENOMEM); + + memcpy(rw_extradata, extradata, extradata_size); + + rw_extradata[4] |= 0x03; + + avc_data = CFDataCreate(kCFAllocatorDefault, rw_extradata, extradata_size); + + av_freep(&rw_extradata); + } else { + avc_data = CFDataCreate(kCFAllocatorDefault, extradata, extradata_size); + } + config_info = CFDictionaryCreateMutable(kCFAllocatorDefault, 4, &kCFTypeDictionaryKeyCallBacks, @@ -150,7 +170,6 @@ int ff_vda_create_decoder(struct vda_context *vda_ctx, height = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &vda_ctx->height); width = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &vda_ctx->width); format = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &vda_ctx->format); - avc_data = CFDataCreate(kCFAllocatorDefault, extradata, extradata_size); CFDictionarySetValue(config_info, kVDADecoderConfiguration_Height, height); CFDictionarySetValue(config_info, kVDADecoderConfiguration_Width, width); |