1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Vidvox Hap utility functions 3cabdff1aSopenharmony_ci * Copyright (C) 2015 Tom Butterworth <bangnoise@gmail.com> 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * Hap utilities 25cabdff1aSopenharmony_ci */ 26cabdff1aSopenharmony_ci#include "hap.h" 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ciint ff_hap_set_chunk_count(HapContext *ctx, int count, int first_in_frame) 29cabdff1aSopenharmony_ci{ 30cabdff1aSopenharmony_ci int ret = 0; 31cabdff1aSopenharmony_ci if (first_in_frame == 1 && ctx->chunk_count != count) { 32cabdff1aSopenharmony_ci int ret = av_reallocp_array(&ctx->chunks, count, sizeof(HapChunk)); 33cabdff1aSopenharmony_ci if (ret == 0) 34cabdff1aSopenharmony_ci ret = av_reallocp_array(&ctx->chunk_results, count, sizeof(int)); 35cabdff1aSopenharmony_ci if (ret < 0) { 36cabdff1aSopenharmony_ci ctx->chunk_count = 0; 37cabdff1aSopenharmony_ci } else { 38cabdff1aSopenharmony_ci ctx->chunk_count = count; 39cabdff1aSopenharmony_ci } 40cabdff1aSopenharmony_ci } else if (ctx->chunk_count != count) { 41cabdff1aSopenharmony_ci /* If this is not the first chunk count calculated for a frame and a 42cabdff1aSopenharmony_ci * different count has already been encountered, then reject the frame: 43cabdff1aSopenharmony_ci * each table in the Decode Instructions Container must describe the 44cabdff1aSopenharmony_ci * same number of chunks. */ 45cabdff1aSopenharmony_ci ret = AVERROR_INVALIDDATA; 46cabdff1aSopenharmony_ci } 47cabdff1aSopenharmony_ci return ret; 48cabdff1aSopenharmony_ci} 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ciav_cold void ff_hap_free_context(HapContext *ctx) 51cabdff1aSopenharmony_ci{ 52cabdff1aSopenharmony_ci av_freep(&ctx->tex_buf); 53cabdff1aSopenharmony_ci av_freep(&ctx->chunks); 54cabdff1aSopenharmony_ci av_freep(&ctx->chunk_results); 55cabdff1aSopenharmony_ci} 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ciint ff_hap_parse_section_header(GetByteContext *gbc, int *section_size, 58cabdff1aSopenharmony_ci enum HapSectionType *section_type) 59cabdff1aSopenharmony_ci{ 60cabdff1aSopenharmony_ci if (bytestream2_get_bytes_left(gbc) < 4) 61cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ci *section_size = bytestream2_get_le24(gbc); 64cabdff1aSopenharmony_ci *section_type = bytestream2_get_byte(gbc); 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_ci if (*section_size == 0) { 67cabdff1aSopenharmony_ci if (bytestream2_get_bytes_left(gbc) < 4) 68cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 69cabdff1aSopenharmony_ci 70cabdff1aSopenharmony_ci *section_size = bytestream2_get_le32(gbc); 71cabdff1aSopenharmony_ci } 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_ci if (*section_size > bytestream2_get_bytes_left(gbc) || *section_size < 0) 74cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 75cabdff1aSopenharmony_ci else 76cabdff1aSopenharmony_ci return 0; 77cabdff1aSopenharmony_ci} 78