1/* 2 * HEVC Annex B format parser 3 * 4 * Copyright (C) 2012 - 2013 Guillaume Martres 5 * 6 * This file is part of FFmpeg. 7 * 8 * FFmpeg is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2.1 of the License, or (at your option) any later version. 12 * 13 * FFmpeg is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with FFmpeg; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21 */ 22 23#include "libavutil/common.h" 24 25#include "golomb.h" 26#include "hevc.h" 27#include "hevc_parse.h" 28#include "hevc_ps.h" 29#include "hevc_sei.h" 30#include "h2645_parse.h" 31#include "parser.h" 32 33#define START_CODE 0x000001 ///< start_code_prefix_one_3bytes 34 35#define IS_IRAP_NAL(nal) (nal->type >= 16 && nal->type <= 23) 36#define IS_IDR_NAL(nal) (nal->type == HEVC_NAL_IDR_W_RADL || nal->type == HEVC_NAL_IDR_N_LP) 37 38typedef struct HEVCParserContext { 39 ParseContext pc; 40 41 H2645Packet pkt; 42 HEVCParamSets ps; 43 HEVCSEI sei; 44 45 int is_avc; 46 int nal_length_size; 47 int parsed_extradata; 48 49 int poc; 50 int pocTid0; 51} HEVCParserContext; 52 53static int hevc_parse_slice_header(AVCodecParserContext *s, H2645NAL *nal, 54 AVCodecContext *avctx) 55{ 56 HEVCParserContext *ctx = s->priv_data; 57 HEVCParamSets *ps = &ctx->ps; 58 HEVCSEI *sei = &ctx->sei; 59 GetBitContext *gb = &nal->gb; 60 const HEVCWindow *ow; 61 int i, num = 0, den = 0; 62 63 unsigned int pps_id, first_slice_in_pic_flag, dependent_slice_segment_flag; 64 enum HEVCSliceType slice_type; 65 66 first_slice_in_pic_flag = get_bits1(gb); 67 s->picture_structure = sei->picture_timing.picture_struct; 68 s->field_order = sei->picture_timing.picture_struct; 69 70 if (IS_IRAP_NAL(nal)) { 71 s->key_frame = 1; 72 skip_bits1(gb); // no_output_of_prior_pics_flag 73 } 74 75 pps_id = get_ue_golomb(gb); 76 if (pps_id >= HEVC_MAX_PPS_COUNT || !ps->pps_list[pps_id]) { 77 av_log(avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", pps_id); 78 return AVERROR_INVALIDDATA; 79 } 80 ps->pps = (HEVCPPS*)ps->pps_list[pps_id]->data; 81 82 if (ps->pps->sps_id >= HEVC_MAX_SPS_COUNT || !ps->sps_list[ps->pps->sps_id]) { 83 av_log(avctx, AV_LOG_ERROR, "SPS id out of range: %d\n", ps->pps->sps_id); 84 return AVERROR_INVALIDDATA; 85 } 86 if (ps->sps != (HEVCSPS*)ps->sps_list[ps->pps->sps_id]->data) { 87 ps->sps = (HEVCSPS*)ps->sps_list[ps->pps->sps_id]->data; 88 ps->vps = (HEVCVPS*)ps->vps_list[ps->sps->vps_id]->data; 89 } 90 ow = &ps->sps->output_window; 91 92 s->coded_width = ps->sps->width; 93 s->coded_height = ps->sps->height; 94 s->width = ps->sps->width - ow->left_offset - ow->right_offset; 95 s->height = ps->sps->height - ow->top_offset - ow->bottom_offset; 96 s->format = ps->sps->pix_fmt; 97 avctx->profile = ps->sps->ptl.general_ptl.profile_idc; 98 avctx->level = ps->sps->ptl.general_ptl.level_idc; 99 100 if (ps->vps->vps_timing_info_present_flag) { 101 num = ps->vps->vps_num_units_in_tick; 102 den = ps->vps->vps_time_scale; 103 } else if (ps->sps->vui.vui_timing_info_present_flag) { 104 num = ps->sps->vui.vui_num_units_in_tick; 105 den = ps->sps->vui.vui_time_scale; 106 } 107 108 if (num != 0 && den != 0) 109 av_reduce(&avctx->framerate.den, &avctx->framerate.num, 110 num, den, 1 << 30); 111 112 if (!first_slice_in_pic_flag) { 113 unsigned int slice_segment_addr; 114 int slice_address_length; 115 116 if (ps->pps->dependent_slice_segments_enabled_flag) 117 dependent_slice_segment_flag = get_bits1(gb); 118 else 119 dependent_slice_segment_flag = 0; 120 121 slice_address_length = av_ceil_log2_c(ps->sps->ctb_width * 122 ps->sps->ctb_height); 123 slice_segment_addr = get_bitsz(gb, slice_address_length); 124 if (slice_segment_addr >= ps->sps->ctb_width * ps->sps->ctb_height) { 125 av_log(avctx, AV_LOG_ERROR, "Invalid slice segment address: %u.\n", 126 slice_segment_addr); 127 return AVERROR_INVALIDDATA; 128 } 129 } else 130 dependent_slice_segment_flag = 0; 131 132 if (dependent_slice_segment_flag) 133 return 0; /* break; */ 134 135 for (i = 0; i < ps->pps->num_extra_slice_header_bits; i++) 136 skip_bits(gb, 1); // slice_reserved_undetermined_flag[] 137 138 slice_type = get_ue_golomb_31(gb); 139 if (!(slice_type == HEVC_SLICE_I || slice_type == HEVC_SLICE_P || 140 slice_type == HEVC_SLICE_B)) { 141 av_log(avctx, AV_LOG_ERROR, "Unknown slice type: %d.\n", 142 slice_type); 143 return AVERROR_INVALIDDATA; 144 } 145 s->pict_type = slice_type == HEVC_SLICE_B ? AV_PICTURE_TYPE_B : 146 slice_type == HEVC_SLICE_P ? AV_PICTURE_TYPE_P : 147 AV_PICTURE_TYPE_I; 148 149 if (ps->pps->output_flag_present_flag) 150 skip_bits1(gb); // pic_output_flag 151 152 if (ps->sps->separate_colour_plane_flag) 153 skip_bits(gb, 2); // colour_plane_id 154 155 if (!IS_IDR_NAL(nal)) { 156 int pic_order_cnt_lsb = get_bits(gb, ps->sps->log2_max_poc_lsb); 157 s->output_picture_number = ctx->poc = 158 ff_hevc_compute_poc(ps->sps, ctx->pocTid0, pic_order_cnt_lsb, nal->type); 159 } else 160 s->output_picture_number = ctx->poc = 0; 161 162 if (nal->temporal_id == 0 && 163 nal->type != HEVC_NAL_TRAIL_N && 164 nal->type != HEVC_NAL_TSA_N && 165 nal->type != HEVC_NAL_STSA_N && 166 nal->type != HEVC_NAL_RADL_N && 167 nal->type != HEVC_NAL_RASL_N && 168 nal->type != HEVC_NAL_RADL_R && 169 nal->type != HEVC_NAL_RASL_R) 170 ctx->pocTid0 = ctx->poc; 171 172 return 1; /* no need to evaluate the rest */ 173} 174 175/** 176 * Parse NAL units of found picture and decode some basic information. 177 * 178 * @param s parser context. 179 * @param avctx codec context. 180 * @param buf buffer with field/frame data. 181 * @param buf_size size of the buffer. 182 */ 183static int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf, 184 int buf_size, AVCodecContext *avctx) 185{ 186 HEVCParserContext *ctx = s->priv_data; 187 HEVCParamSets *ps = &ctx->ps; 188 HEVCSEI *sei = &ctx->sei; 189 int ret, i; 190 191 /* set some sane default values */ 192 s->pict_type = AV_PICTURE_TYPE_I; 193 s->key_frame = 0; 194 s->picture_structure = AV_PICTURE_STRUCTURE_UNKNOWN; 195 196 ff_hevc_reset_sei(sei); 197 198 ret = ff_h2645_packet_split(&ctx->pkt, buf, buf_size, avctx, ctx->is_avc, 199 ctx->nal_length_size, AV_CODEC_ID_HEVC, 1, 0); 200 if (ret < 0) 201 return ret; 202 203 for (i = 0; i < ctx->pkt.nb_nals; i++) { 204 H2645NAL *nal = &ctx->pkt.nals[i]; 205 GetBitContext *gb = &nal->gb; 206 207 if (nal->nuh_layer_id > 0) 208 continue; 209 210 switch (nal->type) { 211 case HEVC_NAL_VPS: 212 ff_hevc_decode_nal_vps(gb, avctx, ps); 213 break; 214 case HEVC_NAL_SPS: 215 ff_hevc_decode_nal_sps(gb, avctx, ps, 1); 216 break; 217 case HEVC_NAL_PPS: 218 ff_hevc_decode_nal_pps(gb, avctx, ps); 219 break; 220 case HEVC_NAL_SEI_PREFIX: 221 case HEVC_NAL_SEI_SUFFIX: 222 ff_hevc_decode_nal_sei(gb, avctx, sei, ps, nal->type); 223 break; 224 case HEVC_NAL_TRAIL_N: 225 case HEVC_NAL_TRAIL_R: 226 case HEVC_NAL_TSA_N: 227 case HEVC_NAL_TSA_R: 228 case HEVC_NAL_STSA_N: 229 case HEVC_NAL_STSA_R: 230 case HEVC_NAL_BLA_W_LP: 231 case HEVC_NAL_BLA_W_RADL: 232 case HEVC_NAL_BLA_N_LP: 233 case HEVC_NAL_IDR_W_RADL: 234 case HEVC_NAL_IDR_N_LP: 235 case HEVC_NAL_CRA_NUT: 236 case HEVC_NAL_RADL_N: 237 case HEVC_NAL_RADL_R: 238 case HEVC_NAL_RASL_N: 239 case HEVC_NAL_RASL_R: 240 if (ctx->sei.picture_timing.picture_struct == HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING) { 241 s->repeat_pict = 1; 242 } else if (ctx->sei.picture_timing.picture_struct == HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING) { 243 s->repeat_pict = 2; 244 } 245 ret = hevc_parse_slice_header(s, nal, avctx); 246 if (ret) 247 return ret; 248 break; 249 } 250 } 251 /* didn't find a picture! */ 252 av_log(avctx, AV_LOG_ERROR, "missing picture in access unit with size %d\n", buf_size); 253 return -1; 254} 255 256/** 257 * Find the end of the current frame in the bitstream. 258 * @return the position of the first byte of the next frame, or END_NOT_FOUND 259 */ 260static int hevc_find_frame_end(AVCodecParserContext *s, const uint8_t *buf, 261 int buf_size) 262{ 263 HEVCParserContext *ctx = s->priv_data; 264 ParseContext *pc = &ctx->pc; 265 int i; 266 267 for (i = 0; i < buf_size; i++) { 268 int nut; 269 270 pc->state64 = (pc->state64 << 8) | buf[i]; 271 272 if (((pc->state64 >> 3 * 8) & 0xFFFFFF) != START_CODE) 273 continue; 274 275 nut = (pc->state64 >> 2 * 8 + 1) & 0x3F; 276 // Beginning of access unit 277 if ((nut >= HEVC_NAL_VPS && nut <= HEVC_NAL_EOB_NUT) || nut == HEVC_NAL_SEI_PREFIX || 278 (nut >= 41 && nut <= 44) || (nut >= 48 && nut <= 55)) { 279 if (pc->frame_start_found) { 280 pc->frame_start_found = 0; 281 return i - 5; 282 } 283 } else if (nut <= HEVC_NAL_RASL_R || 284 (nut >= HEVC_NAL_BLA_W_LP && nut <= HEVC_NAL_CRA_NUT)) { 285 int first_slice_segment_in_pic_flag = buf[i] >> 7; 286 if (first_slice_segment_in_pic_flag) { 287 if (!pc->frame_start_found) { 288 pc->frame_start_found = 1; 289 } else { // First slice of next frame found 290 pc->frame_start_found = 0; 291 return i - 5; 292 } 293 } 294 } 295 } 296 297 return END_NOT_FOUND; 298} 299 300static int hevc_parse(AVCodecParserContext *s, AVCodecContext *avctx, 301 const uint8_t **poutbuf, int *poutbuf_size, 302 const uint8_t *buf, int buf_size) 303{ 304 int next; 305 HEVCParserContext *ctx = s->priv_data; 306 ParseContext *pc = &ctx->pc; 307 int is_dummy_buf = !buf_size; 308 const uint8_t *dummy_buf = buf; 309 310 if (avctx->extradata && !ctx->parsed_extradata) { 311 ff_hevc_decode_extradata(avctx->extradata, avctx->extradata_size, &ctx->ps, &ctx->sei, 312 &ctx->is_avc, &ctx->nal_length_size, avctx->err_recognition, 313 1, avctx); 314 ctx->parsed_extradata = 1; 315 } 316 317 if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) { 318 next = buf_size; 319 } else { 320 next = hevc_find_frame_end(s, buf, buf_size); 321 if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { 322 *poutbuf = NULL; 323 *poutbuf_size = 0; 324 return buf_size; 325 } 326 } 327 328 is_dummy_buf &= (dummy_buf == buf); 329 330 if (!is_dummy_buf) 331 parse_nal_units(s, buf, buf_size, avctx); 332 333 *poutbuf = buf; 334 *poutbuf_size = buf_size; 335 return next; 336} 337 338static void hevc_parser_close(AVCodecParserContext *s) 339{ 340 HEVCParserContext *ctx = s->priv_data; 341 342 ff_hevc_ps_uninit(&ctx->ps); 343 ff_h2645_packet_uninit(&ctx->pkt); 344 ff_hevc_reset_sei(&ctx->sei); 345 346 av_freep(&ctx->pc.buffer); 347} 348 349const AVCodecParser ff_hevc_parser = { 350 .codec_ids = { AV_CODEC_ID_HEVC }, 351 .priv_data_size = sizeof(HEVCParserContext), 352 .parser_parse = hevc_parse, 353 .parser_close = hevc_parser_close, 354}; 355