00001
00002 #include "H264Parser.h"
00003 #include <iostream>
00004 #include "mythlogging.h"
00005
00006 extern "C" {
00007 #include "libavcodec/avcodec.h"
00008 #include "libavcodec/mpegvideo.h"
00009 #include "libavutil/internal.h"
00010 #include "libavcodec/golomb.h"
00011 }
00012
00013 #include <cmath>
00014 #include <strings.h>
00015
00016 static const float eps = 1E-5;
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 H264Parser::H264Parser(void)
00093 {
00094 rbsp_buffer_size = 188 * 2;
00095 rbsp_buffer = new uint8_t[rbsp_buffer_size];
00096 if (rbsp_buffer == 0)
00097 rbsp_buffer_size = 0;
00098
00099 Reset();
00100 I_is_keyframe = true;
00101 au_contains_keyframe_message = false;
00102 }
00103
00104 void H264Parser::Reset(void)
00105 {
00106 state_changed = false;
00107 seen_sps = false;
00108 is_keyframe = false;
00109
00110 sync_accumulator = 0xffffffff;
00111 AU_pending = false;
00112
00113 frame_num = prev_frame_num = -1;
00114 slice_type = SLICE_UNDEF;
00115 prev_pic_parameter_set_id = pic_parameter_set_id = -1;
00116 prev_field_pic_flag = field_pic_flag = -1;
00117 prev_bottom_field_flag = bottom_field_flag = -1;
00118 prev_nal_ref_idc = nal_ref_idc = 0;
00119 prev_pic_order_cnt_type = pic_order_cnt_type =
00120 prev_pic_order_cnt_lsb = pic_order_cnt_lsb = 0;
00121 prev_delta_pic_order_cnt_bottom = delta_pic_order_cnt_bottom = 0;
00122 prev_delta_pic_order_cnt[0] = delta_pic_order_cnt[0] = 0;
00123 prev_delta_pic_order_cnt[1] = delta_pic_order_cnt[1] = 0;
00124 prev_nal_unit_type = nal_unit_type = UNKNOWN;
00125 prev_idr_pic_id = idr_pic_id = 0;
00126
00127 log2_max_frame_num = log2_max_pic_order_cnt_lsb = 0;
00128 seq_parameter_set_id = 0;
00129
00130 delta_pic_order_always_zero_flag = 0;
00131 separate_colour_plane_flag = 0;
00132 frame_mbs_only_flag = -1;
00133 pic_order_present_flag = -1;
00134 redundant_pic_cnt_present_flag = 0;
00135
00136 num_ref_frames = 0;
00137 redundant_pic_cnt = 0;
00138
00139
00140 pic_width = pic_height = 0;
00141 frame_crop_left_offset = frame_crop_right_offset = 0;
00142 frame_crop_top_offset = frame_crop_bottom_offset = 0;
00143 aspect_ratio_idc = 0;
00144 sar_width = sar_height = 0;
00145 unitsInTick = 0;
00146 timeScale = 0;
00147 fixedRate = 0;
00148
00149 AU_offset = frame_start_offset = keyframe_start_offset = 0;
00150 on_frame = on_key_frame = false;
00151
00152 resetRBSP();
00153 }
00154
00155
00156 QString H264Parser::NAL_type_str(uint8_t type)
00157 {
00158 switch (type)
00159 {
00160 case UNKNOWN:
00161 return "UNKNOWN";
00162 case SLICE:
00163 return "SLICE";
00164 case SLICE_DPA:
00165 return "SLICE_DPA";
00166 case SLICE_DPB:
00167 return "SLICE_DPB";
00168 case SLICE_DPC:
00169 return "SLICE_DPC";
00170 case SLICE_IDR:
00171 return "SLICE_IDR";
00172 case SEI:
00173 return "SEI";
00174 case SPS:
00175 return "SPS";
00176 case PPS:
00177 return "PPS";
00178 case AU_DELIMITER:
00179 return "AU_DELIMITER";
00180 case END_SEQUENCE:
00181 return "END_SEQUENCE";
00182 case END_STREAM:
00183 return "END_STREAM";
00184 case FILLER_DATA:
00185 return "FILLER_DATA";
00186 case SPS_EXT:
00187 return "SPS_EXT";
00188 }
00189 return "OTHER";
00190 }
00191
00192 bool H264Parser::new_AU(void)
00193 {
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259 bool result = false;
00260
00261 if (prev_frame_num != -1)
00262 {
00263
00264
00265 if (nal_unit_type != SLICE_IDR && frame_num != prev_frame_num)
00266 result = true;
00267 else if (prev_pic_parameter_set_id != -1 &&
00268 pic_parameter_set_id != prev_pic_parameter_set_id)
00269 result = true;
00270 else if (field_pic_flag != prev_field_pic_flag)
00271 result = true;
00272 else if ((bottom_field_flag != -1 && prev_bottom_field_flag != -1) &&
00273 bottom_field_flag != prev_bottom_field_flag)
00274 result = true;
00275 else if ((nal_ref_idc == 0 || prev_nal_ref_idc == 0) &&
00276 nal_ref_idc != prev_nal_ref_idc)
00277 result = true;
00278 else if ((pic_order_cnt_type == 0 && prev_pic_order_cnt_type == 0) &&
00279 (pic_order_cnt_lsb != prev_pic_order_cnt_lsb ||
00280 delta_pic_order_cnt_bottom !=
00281 prev_delta_pic_order_cnt_bottom))
00282 result = true;
00283 else if ((pic_order_cnt_type == 1 && prev_pic_order_cnt_type == 1) &&
00284 (delta_pic_order_cnt[0] != prev_delta_pic_order_cnt[0] ||
00285 delta_pic_order_cnt[1] != prev_delta_pic_order_cnt[1]))
00286 result = true;
00287 else if ((nal_unit_type == SLICE_IDR ||
00288 prev_nal_unit_type == SLICE_IDR) &&
00289 nal_unit_type != prev_nal_unit_type)
00290 result = true;
00291 else if ((nal_unit_type == SLICE_IDR &&
00292 prev_nal_unit_type == SLICE_IDR) &&
00293 idr_pic_id != prev_idr_pic_id)
00294 result = true;
00295 }
00296
00297 prev_frame_num = frame_num;
00298 prev_pic_parameter_set_id = pic_parameter_set_id;
00299 prev_field_pic_flag = field_pic_flag;
00300 prev_bottom_field_flag = bottom_field_flag;
00301 prev_nal_ref_idc = nal_ref_idc;
00302 prev_pic_order_cnt_lsb = pic_order_cnt_lsb;
00303 prev_delta_pic_order_cnt_bottom = delta_pic_order_cnt_bottom;
00304 prev_delta_pic_order_cnt[0] = delta_pic_order_cnt[0];
00305 prev_delta_pic_order_cnt[1] = delta_pic_order_cnt[1];
00306 prev_nal_unit_type = nal_unit_type;
00307 prev_idr_pic_id = idr_pic_id;
00308
00309 return result;
00310 }
00311
00312 void H264Parser::resetRBSP(void)
00313 {
00314 rbsp_index = 0;
00315 consecutive_zeros = 0;
00316 have_unfinished_NAL = false;
00317 }
00318
00319 bool H264Parser::fillRBSP(const uint8_t *byteP, uint32_t byte_count,
00320 bool found_start_code)
00321 {
00322
00323
00324
00325
00326 uint32_t required_size = rbsp_index + byte_count +
00327 FF_INPUT_BUFFER_PADDING_SIZE;
00328 if (rbsp_buffer_size < required_size)
00329 {
00330
00331 required_size = ((required_size / 188) + 1) * 188;
00332
00333
00334 uint8_t *new_buffer = new uint8_t[required_size];
00335
00336 if (new_buffer == NULL)
00337 {
00338
00339 LOG(VB_GENERAL, LOG_ERR,
00340 "H264Parser::fillRBSP: FAILED to allocate RBSP buffer!");
00341 return false;
00342 }
00343
00344
00345 memcpy(new_buffer, rbsp_buffer, rbsp_index);
00346 delete [] rbsp_buffer;
00347 rbsp_buffer = new_buffer;
00348 rbsp_buffer_size = required_size;
00349 }
00350
00351
00352 while (byte_count)
00353 {
00354
00355
00356 if (consecutive_zeros < 2 || *byteP != 0x03)
00357 rbsp_buffer[rbsp_index++] = *byteP;
00358
00359 if (*byteP == 0)
00360 ++consecutive_zeros;
00361 else
00362 consecutive_zeros = 0;
00363
00364 ++byteP;
00365 --byte_count;
00366 }
00367
00368
00369
00370
00371
00372 if (found_start_code)
00373 {
00374 if (rbsp_index >= 4)
00375 {
00376 rbsp_index -= 4;
00377 while (rbsp_index > 0 && rbsp_buffer[rbsp_index-1] == 0)
00378 --rbsp_index;
00379 }
00380 else
00381 {
00382
00383 LOG(VB_GENERAL, LOG_ERR,
00384 QString("H264Parser::fillRBSP: Found start code, rbsp_index "
00385 "is %1 but it should be >4")
00386 .arg(rbsp_index));
00387 }
00388 }
00389
00390
00391 memset(&rbsp_buffer[rbsp_index], 0xff, FF_INPUT_BUFFER_PADDING_SIZE);
00392 return true;
00393 }
00394
00395 uint32_t H264Parser::addBytes(const uint8_t *bytes,
00396 const uint32_t byte_count,
00397 const uint64_t stream_offset)
00398 {
00399 const uint8_t *startP = bytes;
00400 const uint8_t *endP;
00401 bool found_start_code;
00402
00403 state_changed = false;
00404 on_frame = false;
00405 on_key_frame = false;
00406
00407 while (startP < bytes + byte_count && !on_frame)
00408 {
00409 endP = avpriv_mpv_find_start_code(startP,
00410 bytes + byte_count, &sync_accumulator);
00411
00412 found_start_code = ((sync_accumulator & 0xffffff00) == 0x00000100);
00413
00414
00415
00416
00417 if (have_unfinished_NAL)
00418 {
00419 if (!fillRBSP(startP, endP - startP, found_start_code))
00420 {
00421 resetRBSP();
00422 return endP - bytes;
00423 }
00424 processRBSP(found_start_code);
00425
00426 }
00427
00428
00429 startP = endP;
00430
00431 if (found_start_code)
00432 {
00433 if (have_unfinished_NAL)
00434 {
00435
00436
00437
00438
00439 LOG(VB_GENERAL, LOG_ERR,
00440 "H264Parser::addBytes: Found new start "
00441 "code, but previous NAL is incomplete!");
00442 }
00443
00444
00445 resetRBSP();
00446
00447
00448
00449
00450
00451 pkt_offset = stream_offset;
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472 nal_unit_type = sync_accumulator & 0x1f;
00473 nal_ref_idc = (sync_accumulator >> 5) & 0x3;
00474
00475 if (nal_unit_type == SPS || nal_unit_type == PPS ||
00476 nal_unit_type == SEI || NALisSlice(nal_unit_type))
00477 {
00478
00479
00480
00481
00482
00483 have_unfinished_NAL = true;
00484 }
00485 else if (nal_unit_type == AU_DELIMITER ||
00486 (nal_unit_type > SPS_EXT &&
00487 nal_unit_type < AUXILIARY_SLICE))
00488 {
00489 set_AU_pending();
00490 }
00491 }
00492 }
00493
00494 return startP - bytes;
00495 }
00496
00497
00498 void H264Parser::processRBSP(bool rbsp_complete)
00499 {
00500 GetBitContext gb;
00501
00502 init_get_bits(&gb, rbsp_buffer, 8 * rbsp_index);
00503
00504 if (nal_unit_type == SEI)
00505 {
00506
00507
00508
00509 if (!rbsp_complete)
00510 return;
00511
00512 set_AU_pending();
00513
00514 decode_SEI(&gb);
00515 }
00516 else if (nal_unit_type == SPS)
00517 {
00518
00519 if (!rbsp_complete)
00520 return;
00521
00522 set_AU_pending();
00523
00524 decode_SPS(&gb);
00525 }
00526 else if (nal_unit_type == PPS)
00527 {
00528
00529 if (!rbsp_complete)
00530 return;
00531
00532 set_AU_pending();
00533
00534 decode_PPS(&gb);
00535 }
00536 else
00537 {
00538
00539
00540 if (!rbsp_complete && rbsp_index < MAX_SLICE_HEADER_SIZE)
00541 return;
00542
00543 decode_Header(&gb);
00544
00545 if (new_AU())
00546 set_AU_pending();
00547 }
00548
00549
00550
00551 have_unfinished_NAL = false;
00552
00553 if (AU_pending && NALisSlice(nal_unit_type))
00554 {
00555
00556
00557
00558 AU_pending = false;
00559 state_changed = true;
00560
00561 on_frame = true;
00562 frame_start_offset = AU_offset;
00563
00564 if (is_keyframe || au_contains_keyframe_message)
00565 {
00566 on_key_frame = true;
00567 keyframe_start_offset = AU_offset;
00568 }
00569 }
00570 }
00571
00572
00573
00574
00575 bool H264Parser::decode_Header(GetBitContext *gb)
00576 {
00577 uint first_mb_in_slice;
00578
00579 is_keyframe = false;
00580
00581 if (log2_max_frame_num == 0 || pic_order_present_flag == -1)
00582 {
00583
00584 return false;
00585 }
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604 first_mb_in_slice = get_ue_golomb(gb);
00605
00606
00607
00608
00609
00610
00611
00612
00613 slice_type = get_ue_golomb(gb);
00614
00615
00616
00617
00618
00619
00620 pic_parameter_set_id = get_ue_golomb(gb);
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635 if (separate_colour_plane_flag)
00636 get_bits(gb, 2);
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646 frame_num = get_bits(gb, log2_max_frame_num);
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660 if (!frame_mbs_only_flag)
00661 {
00662 field_pic_flag = get_bits1(gb);
00663 bottom_field_flag = field_pic_flag ? get_bits1(gb) : 0;
00664 }
00665 else
00666 {
00667 field_pic_flag = 0;
00668 bottom_field_flag = -1;
00669 }
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681 if (nal_unit_type == SLICE_IDR)
00682 {
00683 idr_pic_id = get_ue_golomb(gb);
00684 is_keyframe = true;
00685 }
00686 else
00687 is_keyframe |= I_is_keyframe && isKeySlice(slice_type);
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700 if (pic_order_cnt_type == 0)
00701 {
00702 pic_order_cnt_lsb = get_bits(gb, log2_max_pic_order_cnt_lsb);
00703
00704 if (pic_order_present_flag && !field_pic_flag)
00705 delta_pic_order_cnt_bottom = get_se_golomb(gb);
00706 else
00707 delta_pic_order_cnt_bottom = 0;
00708 }
00709 else
00710 delta_pic_order_cnt_bottom = 0;
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729 if (pic_order_cnt_type == 1 && !delta_pic_order_always_zero_flag)
00730 {
00731 delta_pic_order_cnt[0] = get_se_golomb(gb);
00732
00733 if (pic_order_present_flag && !field_pic_flag)
00734 delta_pic_order_cnt[1] = get_se_golomb(gb);
00735 else
00736 delta_pic_order_cnt[1] = 0;
00737 }
00738 else
00739 delta_pic_order_cnt[0] = 0;
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751 redundant_pic_cnt = redundant_pic_cnt_present_flag ? get_ue_golomb(gb) : 0;
00752
00753 return true;
00754 }
00755
00756
00757
00758
00759 void H264Parser::decode_SPS(GetBitContext * gb)
00760 {
00761 int profile_idc, chroma_format_idc;
00762
00763 seen_sps = true;
00764
00765 profile_idc = get_bits(gb, 8);
00766 get_bits1(gb);
00767 get_bits1(gb);
00768 get_bits1(gb);
00769 get_bits1(gb);
00770 get_bits(gb, 4);
00771 get_bits(gb, 8);
00772 get_ue_golomb(gb);
00773
00774 if (profile_idc >= 100)
00775 {
00776 if ((chroma_format_idc = get_ue_golomb(gb)) == 3)
00777 separate_colour_plane_flag = (get_bits1(gb) == 1);
00778
00779 get_ue_golomb(gb);
00780 get_ue_golomb(gb);
00781 get_bits1(gb);
00782
00783 if (get_bits1(gb))
00784 {
00785 for (int idx = 0; idx < ((chroma_format_idc != 3) ? 8 : 12); ++idx)
00786 {
00787 if (get_bits1(gb))
00788 {
00789 int sl_n = ((idx < 6) ? 16 : 64);
00790 for(int sl_i = 0; sl_i < sl_n; sl_i++)
00791 {
00792 get_se_golomb(gb);
00793 }
00794 }
00795 }
00796 }
00797 }
00798
00799
00800
00801
00802
00803
00804
00805
00806 log2_max_frame_num = get_ue_golomb(gb) + 4;
00807
00808 int offset_for_non_ref_pic;
00809 int offset_for_top_to_bottom_field;
00810 uint tmp;
00811 bool gaps_in_frame_num_allowed_flag;
00812
00813
00814
00815
00816
00817
00818 pic_order_cnt_type = get_ue_golomb(gb);
00819 if (pic_order_cnt_type == 0)
00820 {
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832 log2_max_pic_order_cnt_lsb = get_ue_golomb(gb) + 4;
00833 }
00834 else if (pic_order_cnt_type == 1)
00835 {
00836
00837
00838
00839
00840
00841
00842
00843 delta_pic_order_always_zero_flag = get_bits1(gb);
00844
00845
00846
00847
00848
00849
00850 offset_for_non_ref_pic = get_se_golomb(gb);
00851
00852
00853
00854
00855
00856
00857 offset_for_top_to_bottom_field = get_se_golomb(gb);
00858
00859
00860
00861
00862
00863
00864
00865 tmp = get_ue_golomb(gb);
00866 for (uint idx = 0; idx < tmp; ++idx)
00867 get_se_golomb(gb);
00868 }
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880 num_ref_frames = get_ue_golomb(gb);
00881
00882
00883
00884
00885
00886
00887 gaps_in_frame_num_allowed_flag = get_bits1(gb);
00888
00889
00890
00891
00892
00893 pic_width = (get_ue_golomb(gb) + 1) * 16;
00894
00895
00896
00897
00898
00899 pic_height = (get_ue_golomb(gb) + 1) * 16;
00900
00901
00902
00903
00904
00905
00906
00907
00908 frame_mbs_only_flag = get_bits1(gb);
00909 if (!frame_mbs_only_flag)
00910 {
00911 pic_height *= 2;
00912
00913
00914
00915
00916
00917
00918
00919
00920 get_bits1(gb);
00921 }
00922
00923 get_bits1(gb);
00924
00925
00926
00927
00928
00929
00930
00931 if (get_bits1(gb))
00932 {
00933 frame_crop_left_offset = get_ue_golomb(gb);
00934 frame_crop_right_offset = get_ue_golomb(gb);
00935 frame_crop_top_offset = get_ue_golomb(gb);
00936 frame_crop_bottom_offset = get_ue_golomb(gb);
00937 }
00938
00939
00940
00941
00942
00943
00944
00945
00946 if (get_bits1(gb))
00947 vui_parameters(gb);
00948 }
00949
00950 void H264Parser::parse_SPS(uint8_t *sps, uint32_t sps_size,
00951 bool& interlaced, int32_t& max_ref_frames)
00952 {
00953 GetBitContext gb;
00954 init_get_bits(&gb, sps, sps_size << 3);
00955 decode_SPS(&gb);
00956 interlaced = !frame_mbs_only_flag;
00957 max_ref_frames = num_ref_frames;
00958 }
00959
00960 void H264Parser::decode_PPS(GetBitContext * gb)
00961 {
00962
00963
00964
00965
00966
00967
00968 pic_parameter_set_id = get_ue_golomb(gb);
00969
00970
00971
00972
00973
00974 seq_parameter_set_id = get_ue_golomb(gb);
00975 get_bits1(gb);
00976
00977
00978
00979
00980
00981
00982
00983 pic_order_present_flag = get_bits1(gb);
00984
00985 #if 0 // Rest not currently needed, and requires <math.h>
00986 uint num_slice_groups = get_ue_golomb(gb) + 1;
00987 if (num_slice_groups > 1)
00988 {
00989 uint idx;
00990
00991 switch (get_ue_golomb(gb))
00992 {
00993 case 0:
00994 for (idx = 0; idx < num_slice_groups; ++idx)
00995 get_ue_golomb(gb);
00996 break;
00997 case 1:
00998 for (idx = 0; idx < num_slice_groups; ++idx)
00999 {
01000 get_ue_golomb(gb);
01001 get_ue_golomb(gb);
01002 }
01003 break;
01004 case 3:
01005 case 4:
01006 case 5:
01007 get_bits1(gb);
01008 get_ue_golomb(gb);
01009 break;
01010 case 6:
01011 uint pic_size_in_map_units = get_ue_golomb(gb) + 1;
01012 uint num_bits = (int)ceil(log2(num_slice_groups));
01013 for (idx = 0; idx < pic_size_in_map_units; ++idx)
01014 {
01015 get_bits(gb, num_bits);
01016 }
01017 }
01018 }
01019
01020 get_ue_golomb(gb);
01021 get_ue_golomb(gb);
01022 get_bits1(gb);
01023 get_bits(gb, 2);
01024 get_se_golomb(gb);
01025 get_se_golomb(gb);
01026 get_se_golomb(gb);
01027 get_bits1(gb);
01028 get_bits1(gb);
01029 redundant_pic_cnt_present_flag = get_bits1(gb);
01030 #endif
01031 }
01032
01033 void H264Parser::decode_SEI(GetBitContext *gb)
01034 {
01035 int recovery_frame_cnt = -1;
01036 bool exact_match_flag = false;
01037 bool broken_link_flag = false;
01038 int changing_group_slice_idc = -1;
01039
01040 int type = 0, size = 0;
01041
01042
01043
01044
01045 while (get_bits_left(gb) >= 24)
01046 {
01047 do {
01048 type += show_bits(gb, 8);
01049 } while (get_bits(gb, 8) == 255);
01050
01051 do {
01052 size += show_bits(gb, 8);
01053 } while (get_bits(gb, 8) == 255);
01054
01055 switch (type)
01056 {
01057 case SEI_TYPE_RECOVERY_POINT:
01058 recovery_frame_cnt = get_ue_golomb(gb);
01059 exact_match_flag = get_bits1(gb);
01060 broken_link_flag = get_bits1(gb);
01061 changing_group_slice_idc = get_bits(gb, 2);
01062 au_contains_keyframe_message = (recovery_frame_cnt == 0);
01063 return;
01064
01065 default:
01066 skip_bits(gb, size * 8);
01067 break;
01068 }
01069 }
01070 }
01071
01072 void H264Parser::vui_parameters(GetBitContext * gb)
01073 {
01074
01075
01076
01077
01078
01079 if (get_bits1(gb))
01080 {
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090 aspect_ratio_idc = get_bits(gb, 8);
01091
01092 switch (aspect_ratio_idc)
01093 {
01094 case 0:
01095
01096 break;
01097 case 1:
01098
01099
01100
01101
01102
01103
01104 break;
01105 case 2:
01106
01107
01108
01109
01110
01111 break;
01112 case 3:
01113
01114
01115
01116
01117
01118 break;
01119 case 4:
01120
01121
01122
01123
01124
01125 break;
01126 case 5:
01127
01128
01129
01130
01131
01132 break;
01133 case 6:
01134
01135
01136
01137
01138
01139 break;
01140 case 7:
01141
01142
01143
01144
01145
01146 break;
01147 case 8:
01148
01149
01150
01151
01152 break;
01153 case 9:
01154
01155
01156
01157
01158 break;
01159 case 10:
01160
01161
01162
01163
01164 break;
01165 case 11:
01166
01167
01168
01169
01170 break;
01171 case 12:
01172
01173
01174
01175
01176 break;
01177 case 13:
01178
01179
01180
01181
01182 break;
01183 case EXTENDED_SAR:
01184 sar_width = get_bits(gb, 16);
01185 sar_height = get_bits(gb, 16);
01186 break;
01187 }
01188 }
01189 else
01190 sar_width = sar_height = 0;
01191
01192 if (get_bits1(gb))
01193 get_bits1(gb);
01194
01195 if (get_bits1(gb))
01196 {
01197 get_bits(gb, 3);
01198 get_bits1(gb);
01199 if (get_bits1(gb))
01200 {
01201 get_bits(gb, 8);
01202 get_bits(gb, 8);
01203 get_bits(gb, 8);
01204 }
01205 }
01206
01207 if (get_bits1(gb))
01208 {
01209 get_ue_golomb(gb);
01210 get_ue_golomb(gb);
01211 }
01212
01213 if (get_bits1(gb))
01214 {
01215 unitsInTick = get_bits_long(gb, 32);
01216 timeScale = get_bits_long(gb, 32);
01217 fixedRate = get_bits1(gb);
01218 }
01219 }
01220
01221 uint H264Parser::frameRate(void) const
01222 {
01223 uint64_t num;
01224 uint64_t fps;
01225
01226 num = 500 * (uint64_t)timeScale;
01227 fps = ( unitsInTick != 0 ? num / unitsInTick : 0 );
01228
01229 return (uint)fps;
01230 }
01231
01232 uint H264Parser::aspectRatio(void) const
01233 {
01234
01235 double aspect = 0.0;
01236
01237 if (pic_height)
01238 aspect = pic_width / (double)pic_height;
01239
01240 switch (aspect_ratio_idc)
01241 {
01242 case 0:
01243
01244 break;
01245 case 1:
01246
01247 break;
01248 case 2:
01249
01250 aspect *= 1.0909090909090908;
01251 break;
01252 case 3:
01253
01254 aspect *= 0.90909090909090906;
01255 break;
01256 case 4:
01257
01258 aspect *= 1.4545454545454546;
01259 break;
01260 case 5:
01261
01262 aspect *= 1.2121212121212122;
01263 break;
01264 case 6:
01265
01266 aspect *= 2.1818181818181817;
01267 break;
01268 case 7:
01269
01270 aspect *= 1.8181818181818181;
01271 break;
01272 case 8:
01273
01274 aspect *= 2.9090909090909092;
01275 break;
01276 case 9:
01277
01278 aspect *= 2.4242424242424243;
01279 break;
01280 case 10:
01281
01282 aspect *= 1.6363636363636365;
01283 break;
01284 case 11:
01285
01286 aspect *= 1.3636363636363635;
01287 break;
01288 case 12:
01289
01290 aspect *= 1.9393939393939394;
01291 break;
01292 case 13:
01293
01294 aspect *= 1.6161616161616161;
01295 break;
01296 case EXTENDED_SAR:
01297 if (sar_height)
01298 aspect *= sar_width / (double)sar_height;
01299 else
01300 aspect = 0.0;
01301 break;
01302 }
01303
01304 if (aspect == 0.0)
01305 return 0;
01306 if (fabs(aspect - 1.3333333333333333) < eps)
01307 return 2;
01308 if (fabs(aspect - 1.7777777777777777) < eps)
01309 return 3;
01310 if (fabs(aspect - 2.21) < eps)
01311 return 4;
01312
01313 return aspect * 1000000;
01314 }