vlc | branch: master | Felix Paul Kühne <fkue...@videolan.org> | Mon Nov 16 18:49:05 2015 +0100| [79f6c2f2fa5ae6a9d86b0ac066d1109d0f9e697a] | committer: Felix Paul Kühne
VideoToolbox: add 4K support for Twister SoCs Also add a couple of missing warnings > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=79f6c2f2fa5ae6a9d86b0ac066d1109d0f9e697a --- modules/codec/videotoolbox.m | 60 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/modules/codec/videotoolbox.m b/modules/codec/videotoolbox.m index 0b3ded2..4fff71c 100644 --- a/modules/codec/videotoolbox.m +++ b/modules/codec/videotoolbox.m @@ -44,6 +44,12 @@ #if TARGET_OS_IPHONE #import <UIKit/UIKit.h> + +/* support iOS SDKs < v9.1 */ +#ifndef CPUFAMILY_ARM_TWISTER +#define CPUFAMILY_ARM_TWISTER 0x92fb37c8 +#endif + #endif #pragma mark - module descriptor @@ -89,6 +95,7 @@ void VTDictionarySetInt32(CFMutableDictionaryRef, CFStringRef, int); static void copy420YpCbCr8Planar(picture_t *, CVPixelBufferRef buffer, unsigned i_width, unsigned i_height); static BOOL deviceSupportsAdvancedProfiles(); +static BOOL deviceSupportsAdvancedLevels(); struct picture_sys_t { CFTypeRef pixelBuffer; @@ -158,12 +165,19 @@ static CMVideoCodecType CodecPrecheck(decoder_t *p_dec) #if !TARGET_OS_IPHONE /* a level higher than 5.2 was not tested, so don't dare to * try to decode it*/ - if (i_level > 52) + if (i_level > 52) { + msg_Dbg(p_dec, "unsupported H264 level %zu", i_level); return -1; + } #else /* on SoC A8, 4.2 is the highest specified profile */ - if (i_level > 42) - return -1; + if (i_level > 42) { + /* on Twister, we can do up to 5.2 */ + if (!deviceSupportsAdvancedLevels() || i_level > 52) { + msg_Dbg(p_dec, "unsupported H264 level %zu", i_level); + return -1; + } + } #endif break; @@ -322,6 +336,7 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block) if (i_ret != VLC_SUCCESS) { free(p_alloc_buf); + msg_Warn(p_dec, "extra buffer allocation failed"); return VLC_EGENERIC; } @@ -329,6 +344,7 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block) size_t i_sps_size = 0, i_pps_size = 0; if (!p_buf) { free(p_alloc_buf); + msg_Warn(p_dec, "extra buffer allocation failed"); return VLC_EGENERIC; } @@ -341,7 +357,7 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block) &p_pps_buf, &i_pps_size); if (i_ret != VLC_SUCCESS) { - msg_Warn(p_dec, "sps pps parsing failed"); + msg_Warn(p_dec, "sps pps detection failed"); free(p_alloc_buf); return VLC_EGENERIC; } @@ -353,6 +369,7 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block) if (i_ret != VLC_SUCCESS) { free(p_alloc_buf); + msg_Warn(p_dec, "sps pps parsing failed"); return VLC_EGENERIC; } /* this data is more trust-worthy than what we receive @@ -373,8 +390,10 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block) &sps_data, p_sps_buf, i_sps_size, p_pps_buf, i_pps_size); free(p_alloc_buf); - if (!p_block) + if (!p_block) { + msg_Warn(p_dec, "buffer creation failed"); return VLC_EGENERIC; + } extradata = CFDataCreate(kCFAllocatorDefault, p_block->p_buffer, @@ -585,8 +604,10 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block) /* setup storage */ p_sys->outputTimeStamps = [[NSMutableArray alloc] init]; p_sys->outputFrames = [[NSMutableDictionary alloc] init]; - if (!p_sys->outputFrames) + if (!p_sys->outputFrames) { + msg_Warn(p_dec, "buffer management structure allocation failed"); return VLC_ENOMEM; + } p_sys->b_started = YES; @@ -638,8 +659,9 @@ static int OpenDecoder(vlc_object_t *p_this) /* check quickly if we can digest the offered data */ CMVideoCodecType codec; codec = CodecPrecheck(p_dec); - if (codec == -1) + if (codec == -1) { return VLC_EGENERIC; + } /* now that we see a chance to decode anything, allocate the * internals and start the decoding session */ @@ -715,6 +737,30 @@ static BOOL deviceSupportsAdvancedProfiles() #endif } +static BOOL deviceSupportsAdvancedLevels() +{ +#if TARGET_IPHONE_SIMULATOR + return YES; +#endif +#if TARGET_OS_IPHONE + size_t size; + int32_t cpufamily; + + size = sizeof(cpufamily); + sysctlbyname("hw.cpufamily", &cpufamily, &size, NULL, 0); + + /* Proper 4K decoding requires a Twister SoC + * Everything below will kill the decoder daemon */ + if (cpufamily == CPUFAMILY_ARM_TWISTER) { + return YES; + } + + return NO; +#else + return YES; +#endif +} + static inline void bo_add_mp4_tag_descr(bo_t *p_bo, uint8_t tag, uint32_t size) { bo_add_8(p_bo, tag); _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits