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