00001 #ifndef MPEG3PROTOS_H
00002 #define MPEG3PROTOS_H
00003
00004
00005
00006
00007
00008 #ifndef CLAMP
00009 #define CLAMP(x, y, z) ((x) = ((x) < (y) ? (y) : ((x) > (z) ? (z) : (x))))
00010 #endif
00011
00012
00013
00014
00015 mpeg3_css_t* mpeg3_new_css();
00016
00017
00018
00019
00020 int64_t mpeg3io_tell_gcc(mpeg3_fs_t *fs);
00021 double mpeg3_add_double_gcc(double x, double y);
00022 double mpeg3_divide_double_gcc(double x, double y);
00023 int64_t mpeg3_total_bytes_gcc(mpeg3_title_t *title);
00024 int64_t mpeg3io_path_total_bytes(char *path);
00025 int64_t mpeg3io_get_total_bytes(mpeg3_fs_t *fs);
00026
00027
00028
00029
00030
00031
00032 mpeg3_title_t* mpeg3_new_title(mpeg3_t *file, char *path);
00033 void mpeg3_new_cell(mpeg3_title_t *title,
00034 int64_t program_start,
00035 int64_t program_end,
00036 int64_t title_start,
00037 int64_t title_end,
00038 int program);
00039
00040 int mpeg3demux_create_title(mpeg3_demuxer_t *demuxer,
00041 FILE *toc);
00042
00043
00044
00045
00046 mpeg3_atrack_t* mpeg3_new_atrack(mpeg3_t *file,
00047 int custom_id,
00048 int is_ac3,
00049 mpeg3_demuxer_t *demuxer,
00050 int number);
00051 int mpeg3_delete_atrack(mpeg3_t *file, mpeg3_atrack_t *atrack);
00052
00053 void mpeg3_append_samples(mpeg3_atrack_t *atrack, int64_t offset);
00054
00055
00056
00057 int mpeg3_next_header();
00058
00059
00060
00061 mpeg3_vtrack_t* mpeg3_new_vtrack(mpeg3_t *file,
00062 int custom_id,
00063 mpeg3_demuxer_t *demuxer,
00064 int number);
00065 int mpeg3_delete_vtrack(mpeg3_t *file, mpeg3_vtrack_t *vtrack);
00066
00067 void mpeg3_append_frame(mpeg3_vtrack_t *vtrack, int64_t offset, int is_keyframe);
00068
00069
00070
00071
00072 mpeg3_strack_t* mpeg3_new_strack(int id);
00073 void mpeg3_delete_strack(mpeg3_strack_t *ptr);
00074 void mpeg3_copy_strack(mpeg3_strack_t *dst, mpeg3_strack_t *src);
00075
00076
00077 mpeg3_strack_t* mpeg3_get_strack_id(mpeg3_t *file, int id);
00078
00079 mpeg3_strack_t* mpeg3_get_strack(mpeg3_t *file, int number);
00080
00081 mpeg3_strack_t* mpeg3_create_strack(mpeg3_t *file, int id);
00082
00083 void mpeg3_append_subtitle_offset(mpeg3_strack_t *dst, int64_t program_offset);
00084
00085 void mpeg3_delete_subtitle(mpeg3_subtitle_t *subtitle);
00086
00087
00088 void mpeg3_append_subtitle(mpeg3_strack_t *strack, mpeg3_subtitle_t *subtitle);
00089
00090 mpeg3_subtitle_t* mpeg3_get_subtitle(mpeg3_strack_t *strack);
00091
00092 void mpeg3_pop_subtitle(mpeg3_strack_t *strack, int number, int delete_it);
00093
00094 void mpeg3_pop_all_subtitles(mpeg3_strack_t *strack);
00095
00096 void mpeg3_reset_subtitles(mpeg3_t *file);
00097
00098
00099
00100
00101
00102 mpeg3audio_t* mpeg3audio_new(mpeg3_t *file,
00103 mpeg3_atrack_t *track,
00104 int is_ac3);
00105 int mpeg3audio_delete(mpeg3audio_t *audio);
00106
00107
00108
00109 int mpeg3audio_decode_audio(mpeg3audio_t *audio,
00110 float *output_f,
00111 short *output_i,
00112 int channel,
00113 int len);
00114
00115
00116
00117 void mpeg3_shift_audio(mpeg3audio_t *audio, int diff);
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 int mpeg3_new_decode_tables(mpeg3_layer_t *audio);
00129 int mpeg3_init_layer3(mpeg3_layer_t *audio);
00130 int mpeg3_init_layer2(mpeg3_layer_t *audio);
00131
00132
00133 mpeg3_layer_t* mpeg3_new_layer();
00134
00135
00136 mpeg3_ac3_t* mpeg3_new_ac3();
00137
00138
00139 mpeg3_pcm_t* mpeg3_new_pcm();
00140
00141
00142
00143 void mpeg3_delete_layer(mpeg3_layer_t *audio);
00144
00145
00146 void mpeg3_delete_ac3(mpeg3_ac3_t *audio);
00147
00148
00149 void mpeg3_delete_pcm(mpeg3_pcm_t *audio);
00150
00151
00152
00153 int mpeg3_layer_check(unsigned char *data);
00154 int mpeg3_ac3_check(unsigned char *header);
00155 int mpeg3_pcm_check(unsigned char *header);
00156
00157
00158
00159
00160 int mpeg3_layer_header(mpeg3_layer_t *audio, unsigned char *data);
00161
00162
00163
00164 int mpeg3_ac3_header(mpeg3_ac3_t *audio, unsigned char *header);
00165
00166
00167 int mpeg3_pcm_header(mpeg3_pcm_t *audio, unsigned char *header);
00168
00169
00170
00171 void mpeg3_layer_reset(mpeg3_layer_t *audio);
00172
00173
00174
00175
00176
00177
00178 int mpeg3audio_dolayer3(mpeg3_layer_t *audio,
00179 char *frame,
00180 int frame_size,
00181 float **output,
00182 int render);
00183
00184
00185 int mpeg3audio_dolayer2(mpeg3_layer_t *audio,
00186 char *frame,
00187 int frame_size,
00188 float **output,
00189 int render);
00190
00191
00192 int mpeg3audio_doac3(mpeg3_ac3_t *audio,
00193 char *frame,
00194 int frame_size,
00195 float **output,
00196 int render);
00197
00198
00199
00200 int mpeg3audio_dopcm(mpeg3_pcm_t *audio,
00201 char *frame,
00202 int frame_size,
00203 float **output,
00204 int render);
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 mpeg3video_t* mpeg3video_new(mpeg3_t *file,
00219 mpeg3_vtrack_t *track);
00220 int mpeg3video_delete(mpeg3video_t *video);
00221 int mpeg3video_read_frame(mpeg3video_t *video,
00222 unsigned char **output_rows,
00223 int in_x,
00224 int in_y,
00225 int in_w,
00226 int in_h,
00227 int out_w,
00228 int out_h,
00229 int color_model);
00230 void mpeg3video_dump(mpeg3video_t *video);
00231 int mpeg3video_prev_code(mpeg3_demuxer_t *demuxer, unsigned int code);
00232 int mpeg3video_next_code(mpeg3_bits_t* stream, unsigned int code);
00233 void mpeg3video_toc_error();
00234 int mpeg3_rewind_video(mpeg3video_t *video);
00235 int mpeg3_read_yuvframe_ptr(mpeg3_t *file,
00236 char **y_output,
00237 char **u_output,
00238 char **v_output,
00239 int stream);
00240 int mpeg3_read_yuvframe(mpeg3_t *file,
00241 char *y_output,
00242 char *u_output,
00243 char *v_output,
00244 int in_x,
00245 int in_y,
00246 int in_w,
00247 int in_h,
00248 int stream);
00249
00250 int mpeg3video_drop_frames(mpeg3video_t *video, long frames, int cache_it);
00251 void mpeg3_decode_subtitle(mpeg3video_t *video);
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265 mpeg3_cache_t* mpeg3_new_cache();
00266 void mpeg3_delete_cache(mpeg3_cache_t *ptr);
00267 void mpeg3_reset_cache(mpeg3_cache_t *ptr);
00268 void mpeg3_cache_put_frame(mpeg3_cache_t *ptr,
00269 int64_t frame_number,
00270 unsigned char *y,
00271 unsigned char *u,
00272 unsigned char *v,
00273 int y_size,
00274 int u_size,
00275 int v_size);
00276
00277 int mpeg3_cache_get_frame(mpeg3_cache_t *ptr,
00278 int64_t frame_number,
00279 unsigned char **y,
00280 unsigned char **u,
00281 unsigned char **v);
00282 int mpeg3_ceche_has_frame(mpeg3_cache_t *ptr,
00283 int64_t frame_number);
00284 int64_t mpeg3_cache_usage(mpeg3_cache_t *ptr);
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298 mpeg3_fs_t* mpeg3_new_fs(char *path);
00299 int mpeg3_delete_fs(mpeg3_fs_t *fs);
00300 int mpeg3io_open_file(mpeg3_fs_t *fs);
00301 int mpeg3io_close_file(mpeg3_fs_t *fs);
00302 int mpeg3io_seek(mpeg3_fs_t *fs, int64_t byte);
00303 int mpeg3io_seek_relative(mpeg3_fs_t *fs, int64_t bytes);
00304 int mpeg3io_read_data(unsigned char *buffer, int64_t bytes, mpeg3_fs_t *fs);
00305
00306
00307
00308
00309
00310
00311
00312 mpeg3_t* mpeg3_new(char *path);
00313 mpeg3_index_t* mpeg3_new_index();
00314 void mpeg3_delete_index(mpeg3_index_t *index);
00315 int mpeg3_delete(mpeg3_t *file);
00316
00317
00318 int mpeg3_get_file_type(mpeg3_t *file,
00319 mpeg3_t *old_file,
00320 int *toc_atracks,
00321 int *toc_vtracks);
00322
00323 int mpeg3_read_toc(mpeg3_t *file, int *atracks_return, int *vtracks_return);
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339 mpeg3_demuxer_t* mpeg3_new_demuxer(mpeg3_t *file,
00340 int do_audio,
00341 int do_video,
00342 int custom_id);
00343 int mpeg3_delete_demuxer(mpeg3_demuxer_t *demuxer);
00344 mpeg3_demuxer_t* mpeg3_get_demuxer(mpeg3_t *file);
00345 int mpeg3demux_read_data(mpeg3_demuxer_t *demuxer,
00346 unsigned char *output,
00347 int size);
00348
00349
00350
00351 void mpeg3demux_append_data(mpeg3_demuxer_t *demuxer,
00352 unsigned char *data,
00353
00354 int bytes);
00355
00356
00357
00358 void mpeg3demux_shift_data(mpeg3_demuxer_t *demuxer,
00359 int bytes);
00360
00361
00362 int64_t mpeg3_absolute_to_program(mpeg3_demuxer_t *demuxer,
00363 int64_t absolute_byte);
00364
00365
00366 int mpeg3_read_next_packet(mpeg3_demuxer_t *demuxer);
00367 int mpeg3_read_prev_packet(mpeg3_demuxer_t *demuxer);
00368
00369
00370 unsigned int mpeg3demux_read_int32(mpeg3_demuxer_t *demuxer);
00371 unsigned int mpeg3demux_read_int24(mpeg3_demuxer_t *demuxer);
00372 unsigned int mpeg3demux_read_int16(mpeg3_demuxer_t *demuxer);
00373
00374
00375
00376 int64_t mpeg3demux_movie_size(mpeg3_demuxer_t *demuxer);
00377
00378
00379 int64_t mpeg3demux_tell_byte(mpeg3_demuxer_t *demuxer);
00380
00381
00382 int mpeg3demux_tell_program(mpeg3_demuxer_t *demuxer);
00383
00384 double mpeg3demux_get_time(mpeg3_demuxer_t *demuxer);
00385 int mpeg3demux_eof(mpeg3_demuxer_t *demuxer);
00386 int mpeg3demux_bof(mpeg3_demuxer_t *demuxer);
00387 void mpeg3demux_start_reverse(mpeg3_demuxer_t *demuxer);
00388 void mpeg3demux_start_forward(mpeg3_demuxer_t *demuxer);
00389 int mpeg3demux_open_title(mpeg3_demuxer_t *demuxer, int title_number);
00390
00391 int mpeg3demux_seek_byte(mpeg3_demuxer_t *demuxer, int64_t byte);
00392
00393
00394
00395
00396 int mpeg3_seek_phys(mpeg3_demuxer_t *demuxer);
00397
00398 unsigned char mpeg3demux_read_char_packet(mpeg3_demuxer_t *demuxer);
00399 unsigned char mpeg3demux_read_prev_char_packet(mpeg3_demuxer_t *demuxer);
00400 int mpeg3demux_read_program(mpeg3_demuxer_t *demuxer);
00401
00402
00403 double mpeg3demux_audio_pts(mpeg3_demuxer_t *demuxer);
00404
00405 double mpeg3demux_video_pts(mpeg3_demuxer_t *demuxer);
00406
00407
00408 void mpeg3demux_reset_pts(mpeg3_demuxer_t *demuxer);
00409
00410
00411 double mpeg3demux_scan_pts(mpeg3_demuxer_t *demuxer);
00412
00413
00414 int mpeg3demux_goto_pts(mpeg3_demuxer_t *demuxer, double pts);
00415
00416
00417
00418 int mpeg3_finished_subtitles(mpeg3_demuxer_t *demuxer, int id);
00419
00420 unsigned char mpeg3demux_read_char_packet(mpeg3_demuxer_t *demuxer);
00421 unsigned char mpeg3demux_read_prev_char_packet(mpeg3_demuxer_t *demuxer);
00422
00423 #define mpeg3demux_error(demuxer) (((mpeg3_demuxer_t *)(demuxer))->error_flag)
00424
00425 static unsigned char mpeg3demux_read_char(mpeg3_demuxer_t *demuxer)
00426 {
00427
00428 if(demuxer->data_position < demuxer->data_size)
00429 {
00430 return demuxer->data_buffer[demuxer->data_position++];
00431 }
00432 else
00433 {
00434 return mpeg3demux_read_char_packet(demuxer);
00435 }
00436 }
00437
00438
00439
00440 static unsigned char mpeg3demux_read_prev_char(mpeg3_demuxer_t *demuxer)
00441 {
00442 if(demuxer->data_position != 0)
00443 {
00444 return demuxer->data_buffer[demuxer->data_position--];
00445 }
00446 else
00447 {
00448 return mpeg3demux_read_prev_char_packet(demuxer);
00449 }
00450 }
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466 mpeg3_bits_t* mpeg3bits_new_stream(mpeg3_t *file, mpeg3_demuxer_t *demuxer);
00467 int mpeg3bits_delete_stream(mpeg3_bits_t* stream);
00468 int mpeg3bits_seek_byte(mpeg3_bits_t* stream, int64_t position);
00469 int mpeg3bits_open_title(mpeg3_bits_t* stream, int title);
00470
00471 int64_t mpeg3bits_tell(mpeg3_bits_t* stream);
00472
00473 void mpeg3bits_reset(mpeg3_bits_t *stream);
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487 #define mpeg3bits_error(stream) mpeg3demux_error((stream)->demuxer)
00488
00489 #define mpeg3bits_eof(stream) mpeg3demux_eof((stream)->demuxer)
00490
00491 #define mpeg3bits_bof(stream) mpeg3demux_bof((stream)->demuxer)
00492
00493
00494 static void mpeg3bits_fill_reverse_bits(mpeg3_bits_t* stream, int bits)
00495 {
00496
00497 while(stream->bit_number > 7)
00498 {
00499 stream->bfr >>= 8;
00500 stream->bfr_size -= 8;
00501 stream->bit_number -= 8;
00502 }
00503
00504
00505 while(stream->bfr_size - stream->bit_number < bits)
00506 {
00507 if(stream->input_ptr)
00508 stream->bfr |= (unsigned int)(*--stream->input_ptr) << stream->bfr_size;
00509 else
00510 stream->bfr |= (unsigned int)mpeg3demux_read_prev_char(stream->demuxer) << stream->bfr_size;
00511 stream->bfr_size += 8;
00512 }
00513 }
00514
00515
00516 static void mpeg3bits_fill_bits(mpeg3_bits_t* stream, int bits)
00517 {
00518 while(stream->bit_number < bits)
00519 {
00520 stream->bfr <<= 8;
00521 if(stream->input_ptr)
00522 {
00523 stream->bfr |= *stream->input_ptr++;
00524 }
00525 else
00526 {
00527 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
00528 }
00529 stream->bit_number += 8;
00530 stream->bfr_size += 8;
00531 if(stream->bfr_size > 32) stream->bfr_size = 32;
00532 }
00533 }
00534
00535
00536 static unsigned int mpeg3bits_getbyte_noptr(mpeg3_bits_t* stream)
00537 {
00538 if(stream->bit_number < 8)
00539 {
00540 stream->bfr <<= 8;
00541 if(stream->input_ptr)
00542 stream->bfr |= *stream->input_ptr++;
00543 else
00544 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
00545
00546 stream->bfr_size += 8;
00547 if(stream->bfr_size > 32) stream->bfr_size = 32;
00548
00549 return (stream->bfr >> stream->bit_number) & 0xff;
00550 }
00551 return (stream->bfr >> (stream->bit_number -= 8)) & 0xff;
00552 }
00553
00554 static unsigned int mpeg3bits_getbit_noptr(mpeg3_bits_t* stream)
00555 {
00556 if(!stream->bit_number)
00557 {
00558 stream->bfr <<= 8;
00559 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
00560
00561 stream->bfr_size += 8;
00562 if(stream->bfr_size > 32) stream->bfr_size = 32;
00563
00564 stream->bit_number = 7;
00565
00566 return (stream->bfr >> 7) & 0x1;
00567 }
00568 return (stream->bfr >> (--stream->bit_number)) & (0x1);
00569 }
00570
00571
00572
00573 static unsigned int mpeg3bits_getbits(mpeg3_bits_t* stream, int bits)
00574 {
00575 if(bits <= 0) return 0;
00576 mpeg3bits_fill_bits(stream, bits);
00577 return (stream->bfr >> (stream->bit_number -= bits)) & (0xffffffff >> (32 - bits));
00578 }
00579
00580 static unsigned int mpeg3bits_showbits24_noptr(mpeg3_bits_t* stream)
00581 {
00582 while(stream->bit_number < 24)
00583 {
00584 stream->bfr <<= 8;
00585 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
00586 stream->bit_number += 8;
00587 stream->bfr_size += 8;
00588 if(stream->bfr_size > 32) stream->bfr_size = 32;
00589 }
00590 return (stream->bfr >> (stream->bit_number - 24)) & 0xffffff;
00591 }
00592
00593 static unsigned int mpeg3bits_showbits32_noptr(mpeg3_bits_t* stream)
00594 {
00595 while(stream->bit_number < 32)
00596 {
00597 stream->bfr <<= 8;
00598 stream->bfr |= mpeg3demux_read_char(stream->demuxer);
00599 stream->bit_number += 8;
00600 stream->bfr_size += 8;
00601 if(stream->bfr_size > 32) stream->bfr_size = 32;
00602 }
00603 return stream->bfr;
00604 }
00605
00606 static unsigned int mpeg3bits_showbits(mpeg3_bits_t* stream, int bits)
00607 {
00608 mpeg3bits_fill_bits(stream, bits);
00609 return (stream->bfr >> (stream->bit_number - bits)) & (0xffffffff >> (32 - bits));
00610 }
00611
00612 static unsigned int mpeg3bits_getbits_reverse(mpeg3_bits_t* stream, int bits)
00613 {
00614 unsigned int result;
00615 mpeg3bits_fill_reverse_bits(stream, bits);
00616 result = (stream->bfr >> stream->bit_number) & (0xffffffff >> (32 - bits));
00617 stream->bit_number += bits;
00618 return result;
00619 }
00620
00621 static unsigned int mpeg3bits_showbits_reverse(mpeg3_bits_t* stream, int bits)
00622 {
00623 unsigned int result;
00624 mpeg3bits_fill_reverse_bits(stream, bits);
00625 result = (stream->bfr >> stream->bit_number) & (0xffffffff >> (32 - bits));
00626 return result;
00627 }
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646 void mpeg3io_read_buffer(mpeg3_fs_t *fs);
00647
00648 #define mpeg3io_tell(fs) (((mpeg3_fs_t *)(fs))->current_byte)
00649
00650
00651 #define mpeg3io_eof(fs) (((mpeg3_fs_t *)(fs))->current_byte >= ((mpeg3_fs_t *)(fs))->total_bytes)
00652
00653
00654 #define mpeg3io_bof(fs) (((mpeg3_fs_t *)(fs))->current_byte < 0)
00655
00656 #define mpeg3io_get_fd(fs) (fileno(((mpeg3_fs_t *)(fs))->fd))
00657
00658 #define mpeg3io_total_bytes(fs) (((mpeg3_fs_t *)(fs))->total_bytes)
00659
00660 static int mpeg3io_sync_buffer(mpeg3_fs_t *fs)
00661 {
00662
00663 if(fs->buffer_position + fs->buffer_offset != fs->current_byte)
00664 {
00665 fs->buffer_offset = fs->current_byte - fs->buffer_position;
00666 }
00667
00668
00669 if(fs->current_byte < fs->buffer_position ||
00670 fs->current_byte >= fs->buffer_position + fs->buffer_size)
00671 {
00672 mpeg3io_read_buffer(fs);
00673 }
00674
00675 return !fs->buffer_size;
00676 }
00677
00678 static unsigned int mpeg3io_read_char(mpeg3_fs_t *fs)
00679 {
00680 unsigned int result;
00681 mpeg3io_sync_buffer(fs);
00682 result = fs->buffer[fs->buffer_offset++];
00683 fs->current_byte++;
00684 return result;
00685 }
00686
00687 static unsigned char mpeg3io_next_char(mpeg3_fs_t *fs)
00688 {
00689 unsigned char result;
00690 mpeg3io_sync_buffer(fs);
00691 result = fs->buffer[fs->buffer_offset];
00692 return result;
00693 }
00694
00695 static uint32_t mpeg3io_read_int32(mpeg3_fs_t *fs)
00696 {
00697 int a, b, c, d;
00698 uint32_t result;
00699
00700 a = mpeg3io_read_char(fs);
00701 b = mpeg3io_read_char(fs);
00702 c = mpeg3io_read_char(fs);
00703 d = mpeg3io_read_char(fs);
00704 result = (a << 24) |
00705 (b << 16) |
00706 (c << 8) |
00707 (d);
00708 return result;
00709 }
00710
00711 static uint32_t mpeg3io_read_int24(mpeg3_fs_t *fs)
00712 {
00713 int b, c, d;
00714 uint32_t result;
00715
00716 b = mpeg3io_read_char(fs);
00717 c = mpeg3io_read_char(fs);
00718 d = mpeg3io_read_char(fs);
00719 result = (b << 16) |
00720 (c << 8) |
00721 (d);
00722 return result;
00723 }
00724
00725 static uint16_t mpeg3io_read_int16(mpeg3_fs_t *fs)
00726 {
00727 int c, d;
00728 uint16_t result;
00729
00730 c = mpeg3io_read_char(fs);
00731 d = mpeg3io_read_char(fs);
00732 result = (c << 8) |
00733 (d);
00734 return result;
00735 }
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755 #define mpeg3slice_fillbits(buffer, nbits) \
00756 while(((mpeg3_slice_buffer_t*)(buffer))->bits_size < (nbits)) \
00757 { \
00758 if(((mpeg3_slice_buffer_t*)(buffer))->current_position < ((mpeg3_slice_buffer_t*)(buffer))->buffer_size) \
00759 { \
00760 ((mpeg3_slice_buffer_t*)(buffer))->bits <<= 8; \
00761 ((mpeg3_slice_buffer_t*)(buffer))->bits |= ((mpeg3_slice_buffer_t*)(buffer))->data[((mpeg3_slice_buffer_t*)(buffer))->current_position++]; \
00762 } \
00763 ((mpeg3_slice_buffer_t*)(buffer))->bits_size += 8; \
00764 }
00765
00766 #define mpeg3slice_flushbits(buffer, nbits) \
00767 { \
00768 mpeg3slice_fillbits((buffer), (nbits)); \
00769 ((mpeg3_slice_buffer_t*)(buffer))->bits_size -= (nbits); \
00770 }
00771
00772 #define mpeg3slice_flushbit(buffer) \
00773 { \
00774 if(((mpeg3_slice_buffer_t*)(buffer))->bits_size) \
00775 ((mpeg3_slice_buffer_t*)(buffer))->bits_size--; \
00776 else \
00777 if(((mpeg3_slice_buffer_t*)(buffer))->current_position < ((mpeg3_slice_buffer_t*)(buffer))->buffer_size) \
00778 { \
00779 ((mpeg3_slice_buffer_t*)(buffer))->bits = \
00780 ((mpeg3_slice_buffer_t*)(buffer))->data[((mpeg3_slice_buffer_t*)(buffer))->current_position++]; \
00781 ((mpeg3_slice_buffer_t*)(buffer))->bits_size = 7; \
00782 } \
00783 }
00784
00785 static unsigned int mpeg3slice_getbit(mpeg3_slice_buffer_t *buffer)
00786 {
00787 if(buffer->bits_size)
00788 return (buffer->bits >> (--buffer->bits_size)) & 0x1;
00789 else
00790 if(buffer->current_position < buffer->buffer_size)
00791 {
00792 buffer->bits = buffer->data[buffer->current_position++];
00793 buffer->bits_size = 7;
00794 return (buffer->bits >> 7) & 0x1;
00795 }
00796 return 0;
00797 }
00798
00799
00800 static unsigned int mpeg3slice_getbits2(mpeg3_slice_buffer_t *buffer)
00801 {
00802 if(buffer->bits_size >= 2)
00803 return (buffer->bits >> (buffer->bits_size -= 2)) & 0x3;
00804 else
00805 if(buffer->current_position < buffer->buffer_size)
00806 {
00807 buffer->bits <<= 8;
00808 buffer->bits |= buffer->data[buffer->current_position++];
00809 buffer->bits_size += 6;
00810 return (buffer->bits >> buffer->bits_size) & 0x3;
00811 }
00812 return 0;
00813 }
00814
00815 static unsigned int mpeg3slice_getbyte(mpeg3_slice_buffer_t *buffer)
00816 {
00817 if(buffer->bits_size >= 8)
00818 return (buffer->bits >> (buffer->bits_size -= 8)) & 0xff;
00819 else
00820 if(buffer->current_position < buffer->buffer_size)
00821 {
00822 buffer->bits <<= 8;
00823 buffer->bits |= buffer->data[buffer->current_position++];
00824 return (buffer->bits >> buffer->bits_size) & 0xff;
00825 }
00826 return 0;
00827 }
00828
00829
00830 static unsigned int mpeg3slice_getbits(mpeg3_slice_buffer_t *slice_buffer, int bits)
00831 {
00832 if(bits == 1) return mpeg3slice_getbit(slice_buffer);
00833 mpeg3slice_fillbits(slice_buffer, bits);
00834 return (slice_buffer->bits >> (slice_buffer->bits_size -= bits)) & (0xffffffff >> (32 - bits));
00835 }
00836
00837 static unsigned int mpeg3slice_showbits16(mpeg3_slice_buffer_t *buffer)
00838 {
00839 if(buffer->bits_size >= 16)
00840 return (buffer->bits >> (buffer->bits_size - 16)) & 0xffff;
00841 else
00842 if(buffer->current_position < buffer->buffer_size)
00843 {
00844 buffer->bits <<= 16;
00845 buffer->bits_size += 16;
00846 buffer->bits |= (unsigned int)buffer->data[buffer->current_position++] << 8;
00847 buffer->bits |= buffer->data[buffer->current_position++];
00848 return (buffer->bits >> (buffer->bits_size - 16)) & 0xffff;
00849 }
00850 return 0;
00851 }
00852
00853 static unsigned int mpeg3slice_showbits9(mpeg3_slice_buffer_t *buffer)
00854 {
00855 if(buffer->bits_size >= 9)
00856 return (buffer->bits >> (buffer->bits_size - 9)) & 0x1ff;
00857 else
00858 if(buffer->current_position < buffer->buffer_size)
00859 {
00860 buffer->bits <<= 16;
00861 buffer->bits_size += 16;
00862 buffer->bits |= (unsigned int)buffer->data[buffer->current_position++] << 8;
00863 buffer->bits |= buffer->data[buffer->current_position++];
00864 return (buffer->bits >> (buffer->bits_size - 9)) & 0x1ff;
00865 }
00866 return 0;
00867 }
00868
00869 static unsigned int mpeg3slice_showbits5(mpeg3_slice_buffer_t *buffer)
00870 {
00871 if(buffer->bits_size >= 5)
00872 return (buffer->bits >> (buffer->bits_size - 5)) & 0x1f;
00873 else
00874 if(buffer->current_position < buffer->buffer_size)
00875 {
00876 buffer->bits <<= 8;
00877 buffer->bits_size += 8;
00878 buffer->bits |= buffer->data[buffer->current_position++];
00879 return (buffer->bits >> (buffer->bits_size - 5)) & 0x1f;
00880 }
00881 return 0;
00882 }
00883
00884 static unsigned int mpeg3slice_showbits(mpeg3_slice_buffer_t *slice_buffer, int bits)
00885 {
00886 mpeg3slice_fillbits(slice_buffer, bits);
00887 return (slice_buffer->bits >> (slice_buffer->bits_size - bits)) & (0xffffffff >> (32 - bits));
00888 }
00889
00890
00891
00892
00893
00894
00895 #endif