[vlc-commits] videotoolbox: cosmetics
Thomas Guillem
git at videolan.org
Fri Jan 20 12:01:16 CET 2017
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Fri Jan 20 11:36:54 2017 +0100| [b55e824841589e7e15fb1a9a1c5b391cc552457f] | committer: Thomas Guillem
videotoolbox: cosmetics
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b55e824841589e7e15fb1a9a1c5b391cc552457f
---
modules/codec/videotoolbox.m | 163 +++++++++++++++++++------------------------
1 file changed, 72 insertions(+), 91 deletions(-)
diff --git a/modules/codec/videotoolbox.m b/modules/codec/videotoolbox.m
index b4c93e0..18fca0e 100644
--- a/modules/codec/videotoolbox.m
+++ b/modules/codec/videotoolbox.m
@@ -881,31 +881,25 @@ static block_t *H264ProcessBlock(decoder_t *p_dec, block_t *p_block)
static CMSampleBufferRef VTSampleBufferCreate(decoder_t *p_dec,
CMFormatDescriptionRef fmt_desc,
- void *buffer,
- size_t size,
- mtime_t i_pts,
- mtime_t i_dts,
- mtime_t i_length)
+ block_t *p_block)
{
OSStatus status;
CMBlockBufferRef block_buf = NULL;
CMSampleBufferRef sample_buf = NULL;
- CMSampleTimingInfo timeInfo;
- CMSampleTimingInfo timeInfoArray[1];
-
- timeInfo.duration = CMTimeMake(i_length, 1);
- timeInfo.presentationTimeStamp = CMTimeMake(i_pts > 0 ? i_pts : i_dts, CLOCK_FREQ);
- timeInfo.decodeTimeStamp = CMTimeMake(i_dts, CLOCK_FREQ);
- timeInfoArray[0] = timeInfo;
+ CMSampleTimingInfo timeInfoArray[1] = { {
+ .duration = CMTimeMake(p_block->i_length, 1),
+ .presentationTimeStamp = CMTimeMake(p_block->i_pts > 0 ? p_block->i_pts : p_block->i_dts, CLOCK_FREQ),
+ .decodeTimeStamp = CMTimeMake(p_block->i_dts, CLOCK_FREQ),
+ } };
status = CMBlockBufferCreateWithMemoryBlock(kCFAllocatorDefault,// structureAllocator
- buffer, // memoryBlock
- size, // blockLength
+ p_block->p_buffer, // memoryBlock
+ p_block->i_buffer, // blockLength
kCFAllocatorNull, // blockAllocator
NULL, // customBlockSource
0, // offsetToData
- size, // dataLength
+ p_block->i_buffer, // dataLength
false, // flags
&block_buf);
@@ -1035,10 +1029,6 @@ static void Flush(decoder_t *p_dec)
static picture_t *DecodeBlock(decoder_t *p_dec, block_t **pp_block)
{
decoder_sys_t *p_sys = p_dec->p_sys;
- block_t *p_block;
- VTDecodeFrameFlags decoderFlags = 0;
- VTDecodeInfoFlags flagOut;
- OSStatus status;
int i_ret = 0;
if (p_sys->b_vt_flush) {
@@ -1057,90 +1047,81 @@ static picture_t *DecodeBlock(decoder_t *p_dec, block_t **pp_block)
return p_pic;
}
- p_block = *pp_block;
+ block_t *p_block = *pp_block;
+ if (p_block == NULL)
+ return NULL; /* no need to be called again, pics are queued asynchronously */
- if (likely(p_block != NULL)) {
- if (unlikely(p_block->i_flags&(BLOCK_FLAG_CORRUPTED)))
- {
- if (p_sys->b_vt_feed)
- RestartVideoToolbox(p_dec, false);
- block_Release(p_block);
- goto skip;
+ if (unlikely(p_block->i_flags&(BLOCK_FLAG_CORRUPTED)))
+ {
+ if (p_sys->b_vt_feed)
+ RestartVideoToolbox(p_dec, false);
+ block_Release(p_block);
+ goto skip;
+ }
+
+ /* feed to vt */
+ if (likely(p_block->i_buffer)) {
+ if (!p_sys->session) {
+ /* decoding didn't start yet, which is ok for H264, let's see
+ * if we can use this block to get going */
+ p_sys->codec = kCMVideoCodecType_H264;
+ i_ret = StartVideoToolbox(p_dec, p_block);
+ }
+ if (i_ret != VLC_SUCCESS || !p_sys->session) {
+ *pp_block = NULL;
+ return NULL;
}
- /* feed to vt */
- if (likely(p_block->i_buffer)) {
- if (!p_sys->session) {
- /* decoding didn't start yet, which is ok for H264, let's see
- * if we can use this block to get going */
- p_sys->codec = kCMVideoCodecType_H264;
- i_ret = StartVideoToolbox(p_dec, p_block);
- }
- if (i_ret != VLC_SUCCESS || !p_sys->session) {
+ if (p_sys->codec == kCMVideoCodecType_H264) {
+ p_block = H264ProcessBlock(p_dec, p_block);
+ if (!p_block)
+ {
*pp_block = NULL;
return NULL;
}
+ }
- if (p_sys->codec == kCMVideoCodecType_H264) {
- p_block = H264ProcessBlock(p_dec, p_block);
- if (!p_block)
- {
- *pp_block = NULL;
- return NULL;
- }
- }
-
- CMSampleBufferRef sampleBuffer;
- sampleBuffer = VTSampleBufferCreate(p_dec,
- p_sys->videoFormatDescription,
- p_block->p_buffer,
- p_block->i_buffer,
- p_block->i_pts,
- p_block->i_dts,
- p_block->i_length);
- if (likely(sampleBuffer)) {
- if (likely(!p_sys->b_enable_temporal_processing))
- decoderFlags = kVTDecodeFrame_EnableAsynchronousDecompression;
- else
- decoderFlags = kVTDecodeFrame_EnableAsynchronousDecompression | kVTDecodeFrame_EnableTemporalProcessing;
-
- status = VTDecompressionSessionDecodeFrame(p_sys->session,
- sampleBuffer,
- decoderFlags,
- NULL, // sourceFrameRefCon
- &flagOut); // infoFlagsOut
- if (status == noErr)
- p_sys->b_vt_feed = true;
- else {
- if (status == kCVReturnInvalidSize)
- msg_Err(p_dec, "decoder failure: invalid block size");
- else if (status == -666)
- msg_Err(p_dec, "decoder failure: invalid SPS/PPS");
- else if (status == -6661) {
- msg_Err(p_dec, "decoder failure: invalid argument");
- p_dec->b_error = true;
- } else if (status == -8969 || status == -12909) {
- msg_Err(p_dec, "decoder failure: bad data (%i)", status);
- StopVideoToolbox(p_dec);
- } else if (status == -8960 || status == -12911) {
- msg_Err(p_dec, "decoder failure: internal malfunction (%i)", status);
- RestartVideoToolbox(p_dec, true);
- } else if (status == -12903) {
- msg_Warn(p_dec, "decoder failure: session invalid");
- RestartVideoToolbox(p_dec, true);
- } else
- msg_Dbg(p_dec, "decoding frame failed (%i)", status);
- }
+ CMSampleBufferRef sampleBuffer =
+ VTSampleBufferCreate(p_dec, p_sys->videoFormatDescription, p_block);
+ if (unlikely(!sampleBuffer))
+ goto skip;
- if (likely(sampleBuffer != nil))
- CFRelease(sampleBuffer);
- sampleBuffer = nil;
- }
+ VTDecodeInfoFlags flagOut;
+ VTDecodeFrameFlags decoderFlags = kVTDecodeFrame_EnableAsynchronousDecompression;
+ if (unlikely(p_sys->b_enable_temporal_processing))
+ decoderFlags |= kVTDecodeFrame_EnableTemporalProcessing;
+
+ OSStatus status =
+ VTDecompressionSessionDecodeFrame(p_sys->session, sampleBuffer,
+ decoderFlags, NULL, &flagOut);
+ if (status == noErr)
+ p_sys->b_vt_feed = true;
+ else {
+ if (status == kCVReturnInvalidSize)
+ msg_Err(p_dec, "decoder failure: invalid block size");
+ else if (status == -666)
+ msg_Err(p_dec, "decoder failure: invalid SPS/PPS");
+ else if (status == -6661) {
+ msg_Err(p_dec, "decoder failure: invalid argument");
+ p_dec->b_error = true;
+ } else if (status == -8969 || status == -12909) {
+ msg_Err(p_dec, "decoder failure: bad data (%i)", status);
+ StopVideoToolbox(p_dec);
+ } else if (status == -8960 || status == -12911) {
+ msg_Err(p_dec, "decoder failure: internal malfunction (%i)", status);
+ RestartVideoToolbox(p_dec, true);
+ } else if (status == -12903) {
+ msg_Warn(p_dec, "decoder failure: session invalid");
+ RestartVideoToolbox(p_dec, true);
+ } else
+ msg_Dbg(p_dec, "decoding frame failed (%i)", status);
}
- block_Release(p_block);
+ CFRelease(sampleBuffer);
}
+ block_Release(p_block);
+
skip:
*pp_block = NULL;
More information about the vlc-commits
mailing list