LCOV - code coverage report
Current view: top level - libavcodec - h2645_parse.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 10 11 90.9 %
Date: 2017-12-18 13:19:42 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /*
       2             :  * H.264/HEVC common parsing code
       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             : #ifndef AVCODEC_H2645_PARSE_H
      22             : #define AVCODEC_H2645_PARSE_H
      23             : 
      24             : #include <stdint.h>
      25             : 
      26             : #include "avcodec.h"
      27             : #include "get_bits.h"
      28             : 
      29             : #define MAX_MBPAIR_SIZE (256*1024) // a tighter bound could be calculated if someone cares about a few bytes
      30             : 
      31             : typedef struct H2645NAL {
      32             :     uint8_t *rbsp_buffer;
      33             : 
      34             :     int size;
      35             :     const uint8_t *data;
      36             : 
      37             :     /**
      38             :      * Size, in bits, of just the data, excluding the stop bit and any trailing
      39             :      * padding. I.e. what HEVC calls SODB.
      40             :      */
      41             :     int size_bits;
      42             : 
      43             :     int raw_size;
      44             :     const uint8_t *raw_data;
      45             : 
      46             :     GetBitContext gb;
      47             : 
      48             :     /**
      49             :      * NAL unit type
      50             :      */
      51             :     int type;
      52             : 
      53             :     /**
      54             :      * HEVC only, nuh_temporal_id_plus_1 - 1
      55             :      */
      56             :     int temporal_id;
      57             : 
      58             :     int skipped_bytes;
      59             :     int skipped_bytes_pos_size;
      60             :     int *skipped_bytes_pos;
      61             :     /**
      62             :      * H.264 only, nal_ref_idc
      63             :      */
      64             :     int ref_idc;
      65             : } H2645NAL;
      66             : 
      67             : typedef struct H2645RBSP {
      68             :     uint8_t *rbsp_buffer;
      69             :     int rbsp_buffer_alloc_size;
      70             :     int rbsp_buffer_size;
      71             : } H2645RBSP;
      72             : 
      73             : /* an input packet split into unescaped NAL units */
      74             : typedef struct H2645Packet {
      75             :     H2645NAL *nals;
      76             :     H2645RBSP rbsp;
      77             :     int nb_nals;
      78             :     int nals_allocated;
      79             : } H2645Packet;
      80             : 
      81             : /**
      82             :  * Extract the raw (unescaped) bitstream.
      83             :  */
      84             : int ff_h2645_extract_rbsp(const uint8_t *src, int length, H2645RBSP *rbsp,
      85             :                           H2645NAL *nal, int small_padding);
      86             : 
      87             : /**
      88             :  * Split an input packet into NAL units.
      89             :  */
      90             : int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
      91             :                           void *logctx, int is_nalff, int nal_length_size,
      92             :                           enum AVCodecID codec_id, int small_padding);
      93             : 
      94             : /**
      95             :  * Free all the allocated memory in the packet.
      96             :  */
      97             : void ff_h2645_packet_uninit(H2645Packet *pkt);
      98             : 
      99        6795 : static inline int get_nalsize(int nal_length_size, const uint8_t *buf,
     100             :                               int buf_size, int *buf_index, void *logctx)
     101             : {
     102        6795 :     int i, nalsize = 0;
     103             : 
     104        6795 :     if (*buf_index >= buf_size - nal_length_size) {
     105             :         // the end of the buffer is reached, refill it
     106           0 :         return AVERROR(EAGAIN);
     107             :     }
     108             : 
     109       33507 :     for (i = 0; i < nal_length_size; i++)
     110       26712 :         nalsize = ((unsigned)nalsize << 8) | buf[(*buf_index)++];
     111        6795 :     if (nalsize <= 0 || nalsize > buf_size - *buf_index) {
     112           2 :         av_log(logctx, AV_LOG_ERROR,
     113           2 :                "Invalid NAL unit size (%d > %d).\n", nalsize, buf_size - *buf_index);
     114           2 :         return AVERROR_INVALIDDATA;
     115             :     }
     116        6793 :     return nalsize;
     117             : }
     118             : 
     119             : #endif /* AVCODEC_H2645_PARSE_H */

Generated by: LCOV version 1.13