adts_parser.c (2080B)
1 /* 2 * This file is part of FFmpeg. 3 * 4 * FFmpeg is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * FFmpeg is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with FFmpeg; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19 #include "config.h" 20 21 #include <stddef.h> 22 #include <stdint.h> 23 #include <string.h> 24 25 #include "libavutil/error.h" 26 #include "libavutil/mem.h" 27 #include "adts_header.h" 28 #include "adts_parser.h" 29 30 int av_adts_header_parse(const uint8_t *buf, uint32_t *samples, uint8_t *frames) 31 { 32 #if CONFIG_ADTS_HEADER 33 uint8_t tmpbuf[AV_AAC_ADTS_HEADER_SIZE + AV_INPUT_BUFFER_PADDING_SIZE]; 34 AACADTSHeaderInfo hdr; 35 int err; 36 if (!buf) 37 return AVERROR(EINVAL); 38 memcpy(tmpbuf, buf, AV_AAC_ADTS_HEADER_SIZE); 39 err = ff_adts_header_parse_buf(tmpbuf, &hdr); 40 if (err < 0) 41 return err; 42 *samples = hdr.samples; 43 *frames = hdr.num_aac_frames; 44 return 0; 45 #else 46 return AVERROR(ENOSYS); 47 #endif 48 } 49 50 int avpriv_adts_header_parse(AACADTSHeaderInfo **phdr, const uint8_t *buf, size_t size) 51 { 52 #if CONFIG_ADTS_HEADER 53 int ret = 0; 54 int allocated = 0; 55 56 if (!phdr || !buf || size < AV_AAC_ADTS_HEADER_SIZE) 57 return AVERROR_INVALIDDATA; 58 59 if (!*phdr) { 60 allocated = 1; 61 *phdr = av_mallocz(sizeof(AACADTSHeaderInfo)); 62 } 63 if (!*phdr) 64 return AVERROR(ENOMEM); 65 66 ret = ff_adts_header_parse_buf(buf, *phdr); 67 if (ret < 0) { 68 if (allocated) 69 av_freep(phdr); 70 return ret; 71 } 72 73 return 0; 74 #else 75 return AVERROR(ENOSYS); 76 #endif 77 }