[vlc-commits] videotoolbox: merge starts and stops functions
Thomas Guillem
git at videolan.org
Wed Mar 29 15:49:45 CEST 2017
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Fri Mar 24 13:16:22 2017 +0100| [32ca2f75906ef97aed26da0b3678dd2af97dadf3] | committer: Thomas Guillem
videotoolbox: merge starts and stops functions
Merge StartVideoToolbox with StartVideoToolboxSession, and merge
StopVideoToolbox with StopVideoToolboxSession.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=32ca2f75906ef97aed26da0b3678dd2af97dadf3
---
modules/codec/videotoolbox.m | 155 +++++++++++++++++++------------------------
1 file changed, 69 insertions(+), 86 deletions(-)
diff --git a/modules/codec/videotoolbox.m b/modules/codec/videotoolbox.m
index 67d068b..c2de0e7 100644
--- a/modules/codec/videotoolbox.m
+++ b/modules/codec/videotoolbox.m
@@ -273,68 +273,6 @@ static CMVideoCodecType CodecPrecheck(decoder_t *p_dec)
return codec;
}
-static int StartVideoToolboxSession(decoder_t *p_dec)
-{
- decoder_sys_t *p_sys = p_dec->p_sys;
-
- /* setup decoder callback record */
- VTDecompressionOutputCallbackRecord decoderCallbackRecord;
- decoderCallbackRecord.decompressionOutputCallback = DecoderCallback;
- decoderCallbackRecord.decompressionOutputRefCon = p_dec;
-
- /* create decompression session */
- OSStatus status = VTDecompressionSessionCreate(kCFAllocatorDefault,
- p_sys->videoFormatDescription,
- p_sys->decoderConfiguration,
- p_sys->destinationPixelBufferAttributes,
- &decoderCallbackRecord,
- &p_sys->session);
-
- /* check if the session is valid */
- if (status) {
-
- switch (status) {
- case -12470:
- msg_Err(p_dec, "VT is not supported on this hardware");
- break;
- case -12471:
- msg_Err(p_dec, "Video format is not supported by VT");
- break;
- case -12903:
- msg_Err(p_dec, "created session is invalid, could not select and open decoder instance");
- break;
- case -12906:
- msg_Err(p_dec, "could not find decoder");
- break;
- case -12910:
- msg_Err(p_dec, "unsupported data");
- break;
- case -12913:
- msg_Err(p_dec, "VT is not available to sandboxed apps on this OS release or maximum number of decoders reached");
- break;
- case -12917:
- msg_Err(p_dec, "Insufficient source color data");
- break;
- case -12918:
- msg_Err(p_dec, "Could not create color correction data");
- break;
- case -12210:
- msg_Err(p_dec, "Insufficient authorization to create decoder");
- break;
- case -8973:
- msg_Err(p_dec, "Could not select and open decoder instance");
- break;
-
- default:
- msg_Err(p_dec, "Decompression session creation failed (%i)", (int)status);
- break;
- }
- return VLC_EGENERIC;
- }
-
- return VLC_SUCCESS;
-}
-
static int StartVideoToolbox(decoder_t *p_dec)
{
decoder_sys_t *p_sys = p_dec->p_sys;
@@ -446,37 +384,82 @@ static int StartVideoToolbox(decoder_t *p_dec)
kCVPixelBufferBytesPerRowAlignmentKey,
i_video_width * 2);
- if (StartVideoToolboxSession(p_dec) != VLC_SUCCESS)
- return VLC_EGENERIC;
-
- return VLC_SUCCESS;
-}
-
-static void StopVideoToolboxSession(decoder_t *p_dec, bool b_reset_format)
-{
- decoder_sys_t *p_sys = p_dec->p_sys;
+ /* setup decoder callback record */
+ VTDecompressionOutputCallbackRecord decoderCallbackRecord;
+ decoderCallbackRecord.decompressionOutputCallback = DecoderCallback;
+ decoderCallbackRecord.decompressionOutputRefCon = p_dec;
- VTDecompressionSessionInvalidate(p_sys->session);
- CFRelease(p_sys->session);
- p_sys->session = nil;
+ /* create decompression session */
+ status = VTDecompressionSessionCreate(kCFAllocatorDefault,
+ p_sys->videoFormatDescription,
+ p_sys->decoderConfiguration,
+ p_sys->destinationPixelBufferAttributes,
+ &decoderCallbackRecord, &p_sys->session);
- vlc_mutex_lock(&p_sys->lock);
- if (b_reset_format)
+ /* check if the session is valid */
+ switch (status)
{
- p_sys->b_format_propagated = false;
- p_dec->fmt_out.i_codec = 0;
+ case 0:
+ break;
+ case -12470:
+ msg_Err(p_dec, "VT is not supported on this hardware");
+ return VLC_EGENERIC;
+ case -12471:
+ msg_Err(p_dec, "Video format is not supported by VT");
+ return VLC_EGENERIC;
+ case -12903:
+ msg_Err(p_dec, "created session is invalid, could not select and "
+ "open decoder instance");
+ return VLC_EGENERIC;
+ case -12906:
+ msg_Err(p_dec, "could not find decoder");
+ return VLC_EGENERIC;
+ case -12910:
+ msg_Err(p_dec, "unsupported data");
+ return VLC_EGENERIC;
+ case -12913:
+ msg_Err(p_dec, "VT is not available to sandboxed apps on this OS "
+ "release or maximum number of decoders reached");
+ return VLC_EGENERIC;
+ case -12917:
+ msg_Err(p_dec, "Insufficient source color data");
+ return VLC_EGENERIC;
+ case -12918:
+ msg_Err(p_dec, "Could not create color correction data");
+ return VLC_EGENERIC;
+ case -12210:
+ msg_Err(p_dec, "Insufficient authorization to create decoder");
+ return VLC_EGENERIC;
+ case -8973:
+ msg_Err(p_dec, "Could not select and open decoder instance");
+ return VLC_EGENERIC;
+ default:
+ msg_Err(p_dec, "Decompression session creation failed (%i)",
+ (int)status);
+ return VLC_EGENERIC;
}
- PicReorder_flush(p_dec);
- vlc_mutex_unlock(&p_sys->lock);
+ return VLC_SUCCESS;
}
-static void StopVideoToolbox(decoder_t *p_dec)
+static void StopVideoToolbox(decoder_t *p_dec, bool b_reset_format)
{
decoder_sys_t *p_sys = p_dec->p_sys;
if (p_sys->session != nil)
- StopVideoToolboxSession(p_dec, true);
+ {
+ VTDecompressionSessionInvalidate(p_sys->session);
+ CFRelease(p_sys->session);
+ p_sys->session = nil;
+
+ if (b_reset_format)
+ {
+ p_sys->b_format_propagated = false;
+ p_dec->fmt_out.i_codec = 0;
+ }
+
+ PicReorder_flush(p_dec);
+ }
if (p_sys->videoFormatDescription != nil) {
CFRelease(p_sys->videoFormatDescription);
@@ -499,9 +482,9 @@ static void RestartVideoToolbox(decoder_t *p_dec, bool b_reset_format)
msg_Dbg(p_dec, "Restarting decoder session");
if (p_sys->session != nil)
- StopVideoToolboxSession(p_dec, b_reset_format);
+ StopVideoToolbox(p_dec, b_reset_format);
- if (StartVideoToolboxSession(p_dec) != VLC_SUCCESS) {
+ if (StartVideoToolbox(p_dec) != VLC_SUCCESS) {
msg_Warn(p_dec, "Decoder session restart failed");
}
}
@@ -650,7 +633,7 @@ static void CloseDecoder(vlc_object_t *p_this)
decoder_t *p_dec = (decoder_t *)p_this;
decoder_sys_t *p_sys = p_dec->p_sys;
- StopVideoToolbox(p_dec);
+ StopVideoToolbox(p_dec, true);
vlc_mutex_destroy(&p_sys->lock);
free(p_sys);
@@ -1108,7 +1091,7 @@ static int DecodeBlock(decoder_t *p_dec, block_t *p_block)
vlc_mutex_unlock(&p_sys->lock);
} else if (status == -8969 || status == -12909) {
msg_Err(p_dec, "decoder failure: bad data (%i)", (int)status);
- StopVideoToolbox(p_dec);
+ StopVideoToolbox(p_dec, true);
} else if (status == -8960 || status == -12911) {
msg_Err(p_dec, "decoder failure: internal malfunction (%i)", (int)status);
RestartVideoToolbox(p_dec, true);
More information about the vlc-commits
mailing list