Commit 79f6c2f2 authored by Felix Paul Kühne's avatar Felix Paul Kühne

VideoToolbox: add 4K support for Twister SoCs

Also add a couple of missing warnings
parent c3b4e38d
...@@ -44,6 +44,12 @@ ...@@ -44,6 +44,12 @@
#if TARGET_OS_IPHONE #if TARGET_OS_IPHONE
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
/* support iOS SDKs < v9.1 */
#ifndef CPUFAMILY_ARM_TWISTER
#define CPUFAMILY_ARM_TWISTER 0x92fb37c8
#endif
#endif #endif
#pragma mark - module descriptor #pragma mark - module descriptor
...@@ -89,6 +95,7 @@ void VTDictionarySetInt32(CFMutableDictionaryRef, CFStringRef, int); ...@@ -89,6 +95,7 @@ void VTDictionarySetInt32(CFMutableDictionaryRef, CFStringRef, int);
static void copy420YpCbCr8Planar(picture_t *, CVPixelBufferRef buffer, static void copy420YpCbCr8Planar(picture_t *, CVPixelBufferRef buffer,
unsigned i_width, unsigned i_height); unsigned i_width, unsigned i_height);
static BOOL deviceSupportsAdvancedProfiles(); static BOOL deviceSupportsAdvancedProfiles();
static BOOL deviceSupportsAdvancedLevels();
struct picture_sys_t { struct picture_sys_t {
CFTypeRef pixelBuffer; CFTypeRef pixelBuffer;
...@@ -158,12 +165,19 @@ static CMVideoCodecType CodecPrecheck(decoder_t *p_dec) ...@@ -158,12 +165,19 @@ static CMVideoCodecType CodecPrecheck(decoder_t *p_dec)
#if !TARGET_OS_IPHONE #if !TARGET_OS_IPHONE
/* a level higher than 5.2 was not tested, so don't dare to /* a level higher than 5.2 was not tested, so don't dare to
* try to decode it*/ * try to decode it*/
if (i_level > 52) if (i_level > 52) {
msg_Dbg(p_dec, "unsupported H264 level %zu", i_level);
return -1; return -1;
}
#else #else
/* on SoC A8, 4.2 is the highest specified profile */ /* on SoC A8, 4.2 is the highest specified profile */
if (i_level > 42) 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; return -1;
}
}
#endif #endif
break; break;
...@@ -322,6 +336,7 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block) ...@@ -322,6 +336,7 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block)
if (i_ret != VLC_SUCCESS) { if (i_ret != VLC_SUCCESS) {
free(p_alloc_buf); free(p_alloc_buf);
msg_Warn(p_dec, "extra buffer allocation failed");
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -329,6 +344,7 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block) ...@@ -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; size_t i_sps_size = 0, i_pps_size = 0;
if (!p_buf) { if (!p_buf) {
free(p_alloc_buf); free(p_alloc_buf);
msg_Warn(p_dec, "extra buffer allocation failed");
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -341,7 +357,7 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block) ...@@ -341,7 +357,7 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block)
&p_pps_buf, &p_pps_buf,
&i_pps_size); &i_pps_size);
if (i_ret != VLC_SUCCESS) { 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); free(p_alloc_buf);
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -353,6 +369,7 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block) ...@@ -353,6 +369,7 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block)
if (i_ret != VLC_SUCCESS) { if (i_ret != VLC_SUCCESS) {
free(p_alloc_buf); free(p_alloc_buf);
msg_Warn(p_dec, "sps pps parsing failed");
return VLC_EGENERIC; return VLC_EGENERIC;
} }
/* this data is more trust-worthy than what we receive /* 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) ...@@ -373,8 +390,10 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block)
&sps_data, p_sps_buf, i_sps_size, &sps_data, p_sps_buf, i_sps_size,
p_pps_buf, i_pps_size); p_pps_buf, i_pps_size);
free(p_alloc_buf); free(p_alloc_buf);
if (!p_block) if (!p_block) {
msg_Warn(p_dec, "buffer creation failed");
return VLC_EGENERIC; return VLC_EGENERIC;
}
extradata = CFDataCreate(kCFAllocatorDefault, extradata = CFDataCreate(kCFAllocatorDefault,
p_block->p_buffer, p_block->p_buffer,
...@@ -585,8 +604,10 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block) ...@@ -585,8 +604,10 @@ static int StartVideoToolbox(decoder_t *p_dec, block_t *p_block)
/* setup storage */ /* setup storage */
p_sys->outputTimeStamps = [[NSMutableArray alloc] init]; p_sys->outputTimeStamps = [[NSMutableArray alloc] init];
p_sys->outputFrames = [[NSMutableDictionary 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; return VLC_ENOMEM;
}
p_sys->b_started = YES; p_sys->b_started = YES;
...@@ -638,8 +659,9 @@ static int OpenDecoder(vlc_object_t *p_this) ...@@ -638,8 +659,9 @@ static int OpenDecoder(vlc_object_t *p_this)
/* check quickly if we can digest the offered data */ /* check quickly if we can digest the offered data */
CMVideoCodecType codec; CMVideoCodecType codec;
codec = CodecPrecheck(p_dec); codec = CodecPrecheck(p_dec);
if (codec == -1) if (codec == -1) {
return VLC_EGENERIC; return VLC_EGENERIC;
}
/* now that we see a chance to decode anything, allocate the /* now that we see a chance to decode anything, allocate the
* internals and start the decoding session */ * internals and start the decoding session */
...@@ -715,6 +737,30 @@ static BOOL deviceSupportsAdvancedProfiles() ...@@ -715,6 +737,30 @@ static BOOL deviceSupportsAdvancedProfiles()
#endif #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) static inline void bo_add_mp4_tag_descr(bo_t *p_bo, uint8_t tag, uint32_t size)
{ {
bo_add_8(p_bo, tag); bo_add_8(p_bo, tag);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment