void slice() { slice_vertical_position = getbits(8); zprintf(3, "\nslice_start_code = 0x000001%02X\n", slice_vertical_position); if (vertical_size > 2800) { slice_vertical_position_extension = getbits(3); zprintf(3, " slice_vertical_position_extension = %d\n", slice_vertical_position_extension); mb_row = (slice_vertical_position_extension << 7) + slice_vertical_position - 1; } else mb_row = slice_vertical_position - 1; previous_macroblock_address = (mb_row * mb_width) - 1; if (sequence_scalable_extension_present == 1) if (scalable_mode == DATA_PARTITIONING) zprintf(3, " priority_breakpoint = %d\n", getbits(7)); zprintf(3, " quantiser_scale_code = %d\n", getbits(5)); if (nextbits(1) == 1) { zprintf(3, " intra_slice_flag = %d\n", get1bit()); zprintf(3, " intra_slice = %d\n", get1bit()); zprintf(3, " reserve_bits = %d\n", getbits(7)); while (nextbits(1) == 1) { zprintf(3, " extra_bit_slice = %d\n", get1bit()); zprintf(3, " extra_information_slice = %d\n", getbits(8)); } } zprintf(3, " extra_bit_slice = %d\n", get1bit()); // do // macroblock(); // while (nextbits(23) != 0); next_start_code(); }
void picture_data() { do slice(); while (nextbits(8) > 0 && nextbits(8) < 0xB0); // next_start_code(); }
static int FUNC(slice_header)(CodedBitstreamContext *ctx, RWContext *rw, MPEG2RawSliceHeader *current) { CodedBitstreamMPEG2Context *mpeg2 = ctx->priv_data; int err; HEADER("Slice Header"); ui(8, slice_vertical_position); if (mpeg2->vertical_size > 2800) ui(3, slice_vertical_position_extension); if (mpeg2->scalable) { if (mpeg2->scalable_mode == 0) ui(7, priority_breakpoint); } ui(5, quantiser_scale_code); if (nextbits(1, 1, current->slice_extension_flag)) { ui(1, slice_extension_flag); ui(1, intra_slice); ui(1, slice_picture_id_enable); ui(6, slice_picture_id); { size_t k; #ifdef READ GetBitContext start; uint8_t bit; start = *rw; for (k = 0; nextbits(1, 1, bit); k++) skip_bits(rw, 8); current->extra_information_length = k; if (k > 0) { *rw = start; current->extra_information = av_malloc(current->extra_information_length); if (!current->extra_information) return AVERROR(ENOMEM); for (k = 0; k < current->extra_information_length; k++) { xui(1, extra_bit_slice, bit, 0); xui(8, extra_information_slice[k], current->extra_information[k], 1, k); } } #else for (k = 0; k < current->extra_information_length; k++) { xui(1, extra_bit_slice, 1, 0); xui(8, extra_information_slice[k], current->extra_information[k], 1, k); } #endif } } ui(1, extra_bit_slice); return 0; }
void extension_and_user_data(int i) { while ((nextbits(8) == EXTENSION_START_CODE) || (nextbits(8) == USER_DATA_START_CODE)) { if (i != 1) if (nextbits(8) == EXTENSION_START_CODE) extension_data(i); if (nextbits(8) == USER_DATA_START_CODE) user_data(); } }
void picture_header() { int i; zprintf(1, "\npicture_header = 0x000001%02X\n", getbits(8)); zprintf(2, " temporal_reference = %d\n", getbits(10)); i = getbits(3); zprintf(2, " picture_coding_type = %d\n", i); zprintf(2, " vbv_delay = %d\n", getbits(16)); if (i == 2 || i == 3) { zprintf(2, " full_pel_forward_vector = %d\n", get1bit()); zprintf(2, " forward_f_code = %d\n", getbits(3)); } if (i == 3) { zprintf(2, " full_pel_backward_vector = %d\n", get1bit()); zprintf(2, " backward_f_code = %d\n", getbits(3)); } while (nextbits(1) == 1) { zprintf(2, " extra_bit_picture = %d\n", get1bit()); zprintf(2, " extra_information_picture = %d\n", getbits(8)); } zprintf(2, " extra_bit_picture = %d\n", get1bit()); next_start_code(); }
int mark_not_coded(unsigned char *p, unsigned n, unsigned nti) { unsigned sc; resetbits(0); if ((sc = nextbits(p, 32)) == SC_GVOP) { while (currentpos() < n - 4) { if (nextbits(p, 32) == SC_VOP) goto VOP; resetbits(currentpos() - 3); } goto NO_VOP; } if (sc != SC_VOP) goto X; VOP: nextbits(p, 2); /* VOP type */ skipbits(p, 1); /* modulo_time_base */ if (!nextbits(p, 1)) goto X; /* marker bit */ nextbits(p, nti); /* vop_time_increment */ if (!nextbits(p, 1)) goto X; /* marker bit */ CLRBIT(p[pos_], bit_ - 1); /* set VOP not coded */ if (nextbits(p, 1)) goto X; /* VOP coded ? */ NO_VOP: return currentpos(); X: return 0; }
void extension_data(int i) { while (nextbits(8) == EXTENSION_START_CODE) { zprintf(1, "\nextension_start_code = 0x000001%02X\n", getbits(8)); if (i == 0) { if (nextbits(4) == SEQUENCE_DISPLAY_EXTENSION_ID) sequence_display_extension(); if (nextbits(4) == SEQUENCE_SCALABLE_EXTENSION_ID) sequence_scalable_extension(); } if (i == 2) { if (nextbits(4) == QUANT_MATRIX_EXTENSION_ID) quant_matrix_extension(); if (nextbits(4) == PICTURE_DISPLAY_EXTENSION_ID) picture_display_extension(); if (nextbits(4) == PICTURE_SPATIAL_SCALABLE_EXTENSION_ID) picture_spatial_scalable_extension(); if (nextbits(4) == PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID) picture_temporal_scalable_extension(); } } }
void user_data() { zprintf(1, "\nuser_data_start_code = 0x000001%02X\n", getbits(8)); while (nextbits(24) != START_CODE_PREFIX) { getbits(8); user_data_bytes++; } next_start_code(); }
int main(int argc, char* argv[]) { char tmpStr[256]; col = 0; verbose_level = 1; sequence_headers = 0; sequence_extensions = 0; user_data_bytes = 0; sequence_scalable_extension_present = 0; printf("bbVINFO - version 1.7, by Brent Beyeler ([email protected])\n"); printf(" speed increases by, Apachez and Christian Vogelgsang\n\n"); if (argc < 2) { printf("\nbbVINFO is an MPEG video stream analyzer\n\n"); printf("Usage: bbVINFO MPEG video filename <verbose level 1..3, default = 1>\n\n"); printf("Examples:\n"); printf(" To list all packet start codes (excluding slice codes) to file test.txt\n"); printf(" bbVINFO test.mpg 1 > test.txt\n\n"); printf(" To list all packets (excluding slice packets) in detail\n"); printf(" bbVINFO test.vob 2\n\n"); printf(" To list all packets (including slice packets) in detail to file test.txt\n"); printf(" bbVINFO test.mpg 3 > test.txt\n\n"); exit (1); } init_getbits(argv[1]); strcpy(tmpStr, argv[1]); // strlwr(tmpStr); if (argc > 2) { sscanf(argv[2], "%d", &verbose_level); if (verbose_level < 1) verbose_level = 1; if (verbose_level > 3) verbose_level = 3; } next_start_code(); if (getbits(8) != SEQUENCE_HEADER_CODE) { printf("\nFile is not an MPEG Video Stream\n"); exit(1); } next_start_code(); if (getbits(8) != EXTENSION_START_CODE) mpeg2 = 0; else mpeg2 = 1; printf("\nFile %s is an MPEG-%d video stream\n", argv[1], mpeg2 + 1); finish_getbits(); init_getbits(argv[1]); next_start_code(); sequence_header(); if (mpeg2) sequence_extension(); do { extension_and_user_data(0); do { if (nextbits(8) == GROUP_START_CODE) { group_of_pictures_header(); extension_and_user_data(1); } picture_header(); if (mpeg2) picture_coding_extension(); extension_and_user_data(2); picture_data(); } while ((nextbits(8) == PICTURE_START_CODE) || (nextbits(8) == GROUP_START_CODE)); if (nextbits(8) != SEQUENCE_END_CODE) { sequence_header(); if (mpeg2) sequence_extension(); } } while (nextbits(8) != SEQUENCE_END_CODE); zprintf(1, "\nsequence_end_code = 0x000001%02X\n", getbits(8)); finish_getbits(); return (0); }
int main(int argc, char* argv[]) { char tmpStr[256]; col = 0; verbose_level = 1; syncwords = 0; printf("bbAINFO - version 1.7, by Brent Beyeler ([email protected])\n"); printf(" speed increases by, Apachez and Christian Vogelgsang\n\n"); if (argc < 2) { printf("\nbbAINFO is an MPEG audio stream analyzer\n"); printf("All it realy does is list the sync word headers\n\n"); printf("Usage: bbAINFO MPEG audio filename\n\n"); printf("Examples:\n"); printf(" To list all frames to file test.txt\n"); printf(" bbAINFO test.mpg > test.txt\n\n"); exit (1); } init_getbits(argv[1]); strcpy(tmpStr, argv[1]); // strlwr(tmpStr); if (argc > 2) { sscanf(argv[2], "%d", &verbose_level); if (verbose_level < 1) verbose_level = 1; if (verbose_level > 3) verbose_level = 3; } if (nextbits(12) != SYNCWORD) { printf("\nFile is not an MPEG Audio Stream\n"); exit(1); } do { header(); error_check(); audio_data(); ancillary_data(); } while (!end_bs()); printf("\nFound %u sync words\n", syncwords); printf("\nHeader info summary:\n"); switch (layer) { case 0: printf(" layer = reserved\n"); break; case LAYER_1: printf(" layer = 1\n"); break; case LAYER_2: printf(" layer = 2\n"); break; case LAYER_3: printf(" layer = 3\n"); break; } printf(" bitrate = %d Kbps\n", bitrate_index[3 - layer][bit_rate]); printf(" frequency = %.1f kHz\n", frequency[freq]); if (protection) printf(" error protection = disabled\n"); else printf(" error protection = enabled\n"); printf(" private flag = %d\n", private_bit); switch (mode) { case 0: printf(" mode = stereo\n"); break; case 1: printf(" mode = joint_stereo (intensity_stereo and/or ms_stereo)\n"); break; case 2: printf(" mode = dual_channel\n"); break; case 3: printf(" mode = single_channel\n"); } if (layer == LAYER_3) { switch (mode_ext) { case 0: printf(" mode ext = intensity stereo is off, ms stereo is off\n"); break; case 1: printf(" mode ext = intensity stereo is on, ms stereo is off\n"); break; case 2: printf(" mode ext = intensity stereo is off, ms stereo is on\n"); break; case 3: printf(" mode ext = intensity stereo is on, ms stereo is on\n"); } } else { if (mode == 1) { switch (mode_ext) { case 0: printf(" mode ext = subbands 4-31 in intensity_stereo, bound==4\n"); break; case 1: printf(" mode ext = subbands 8-31 in intensity_stereo, bound==8\n"); break; case 2: printf(" mode ext = subbands 12-31 in intensity_stereo, bound==12\n"); break; case 3: printf(" mode ext = subbands 16-31 in intensity_stereo, bound==16\n"); } } } printf(" copyright flag = %d\n", copyright); printf(" original flag = %d\n", original); switch (emphasis) { case 0: printf(" emphasis = none\n"); break; case 1: printf(" emphasis = 50/15 microsec. emphasis\n"); break; case 2: printf(" emphasis = reserved\n"); break; case 3: printf(" emphasis = CCITT J.17\n"); } finish_getbits(); return (0); }
void ancillary_data() { if ((layer == 1) || (layer == 2)) while ((nextbits(12) != SYNCWORD) && !end_bs()) get1bit(); }