1/* 2 * Copyright (c) 2003-2010 Michael Niedermayer <michaelni@gmx.at> 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21/** 22 * @file 23 * Accelerated start code search function for start codes common to 24 * MPEG-1/2/4 video, VC-1, H.264/5 25 * @author Michael Niedermayer <michaelni@gmx.at> 26 */ 27 28#include "startcode.h" 29#include "config.h" 30 31int ff_startcode_find_candidate_c(const uint8_t *buf, int size) 32{ 33 int i = 0; 34#if HAVE_FAST_UNALIGNED 35 /* we check i < size instead of i + 3 / 7 because it is 36 * simpler and there must be FF_INPUT_BUFFER_PADDING_SIZE 37 * bytes at the end. 38 */ 39# if HAVE_FAST_64BIT 40 while (i < size && 41 !((~*(const uint64_t *)(buf + i) & 42 (*(const uint64_t *)(buf + i) - 0x0101010101010101ULL)) & 43 0x8080808080808080ULL)) 44 i += 8; 45# else 46 while (i < size && 47 !((~*(const uint32_t *)(buf + i) & 48 (*(const uint32_t *)(buf + i) - 0x01010101U)) & 49 0x80808080U)) 50 i += 4; 51# endif 52#endif 53 for (; i < size; i++) 54 if (!buf[i]) 55 break; 56 return i; 57} 58