9 #define CLAMP(x, y, z) ((x) = ((x) < (y) ? (y) : ((x) > (z) ? (z) : (x))))
15 mpeg3_css_t
* mpeg3_new_css();
20 int64_t mpeg3io_tell_gcc(mpeg3_fs_t
*fs
);
21 double mpeg3_add_double_gcc(double x
, double y
);
22 double mpeg3_divide_double_gcc(double x
, double y
);
23 int64_t mpeg3_total_bytes_gcc(mpeg3_title_t
*title
);
24 int64_t mpeg3io_path_total_bytes(char *path
);
25 int64_t mpeg3io_get_total_bytes(mpeg3_fs_t
*fs
);
32 mpeg3_title_t
* mpeg3_new_title(mpeg3_t
*file
, char *path
);
33 void mpeg3_new_cell(mpeg3_title_t
*title
,
34 int64_t program_start
,
39 /* Called by mpeg3_open for a single file */
40 int mpeg3demux_create_title(mpeg3_demuxer_t
*demuxer
,
46 mpeg3_atrack_t
* mpeg3_new_atrack(mpeg3_t
*file
,
49 mpeg3_demuxer_t
*demuxer
,
51 int mpeg3_delete_atrack(mpeg3_t
*file
, mpeg3_atrack_t
*atrack
);
53 void mpeg3_append_samples(mpeg3_atrack_t
*atrack
, int64_t offset
);
56 /* These return 1 on failure and 0 on success */
57 int mpeg3_next_header();
61 mpeg3_vtrack_t
* mpeg3_new_vtrack(mpeg3_t
*file
,
63 mpeg3_demuxer_t
*demuxer
,
65 int mpeg3_delete_vtrack(mpeg3_t
*file
, mpeg3_vtrack_t
*vtrack
);
67 void mpeg3_append_frame(mpeg3_vtrack_t
*vtrack
, int64_t offset
, int is_keyframe
);
72 mpeg3_strack_t
* mpeg3_new_strack(int id
);
73 void mpeg3_delete_strack(mpeg3_strack_t
*ptr
);
74 void mpeg3_copy_strack(mpeg3_strack_t
*dst
, mpeg3_strack_t
*src
);
76 /* Get matching subtitle track based on ID or return 0 if it doesn't exist. */
77 mpeg3_strack_t
* mpeg3_get_strack_id(mpeg3_t
*file
, int id
);
78 /* get the subtitle track based on number starting from 0 */
79 mpeg3_strack_t
* mpeg3_get_strack(mpeg3_t
*file
, int number
);
80 /* Create new subtitle track and add to table in right order. */
81 mpeg3_strack_t
* mpeg3_create_strack(mpeg3_t
*file
, int id
);
82 /* Append program offset of a subtitle to the track */
83 void mpeg3_append_subtitle_offset(mpeg3_strack_t
*dst
, int64_t program_offset
);
84 /* Delete a subtitle object */
85 void mpeg3_delete_subtitle(mpeg3_subtitle_t
*subtitle
);
86 /* Store subtitle object as current subtitle. */
87 /* The object is deleted by the subtitle track. */
88 void mpeg3_append_subtitle(mpeg3_strack_t
*strack
, mpeg3_subtitle_t
*subtitle
);
89 /* Get the first subtitle in the track which is not currently being drawn. */
90 mpeg3_subtitle_t
* mpeg3_get_subtitle(mpeg3_strack_t
*strack
);
91 /* Remove the pointer and delete the first subtitle from the track. */
92 void mpeg3_pop_subtitle(mpeg3_strack_t
*strack
, int number
, int delete_it
);
93 /* Remove all subtitles from track. */
94 void mpeg3_pop_all_subtitles(mpeg3_strack_t
*strack
);
95 /* Remove all subtitles from all buffers */
96 void mpeg3_reset_subtitles(mpeg3_t
*file
);
102 mpeg3audio_t
* mpeg3audio_new(mpeg3_t
*file
,
103 mpeg3_atrack_t
*track
,
105 int mpeg3audio_delete(mpeg3audio_t
*audio
);
107 /* Decode up to requested number of samples. */
108 /* Return 0 on success and 1 on failure. */
109 int mpeg3audio_decode_audio(mpeg3audio_t
*audio
,
115 /* Shift the audio by the number of samples */
116 /* Used by table of contents routines and decode_audio */
117 void mpeg3_shift_audio(mpeg3audio_t
*audio
, int diff
);
120 /* Audio consists of many possible formats, each packetized into frames. */
121 /* Each format has a constructor, header decoder, frame decoder, and destructor. */
122 /* The function set is determined by the audio format. */
124 /* To decode audio, for each frame read the header sized number of bytes. */
125 /* Call the header decoder for the format. */
126 /* Call the frame decoder for the format. */
128 int mpeg3_new_decode_tables(mpeg3_layer_t
*audio
);
129 int mpeg3_init_layer3(mpeg3_layer_t
*audio
);
130 int mpeg3_init_layer2(mpeg3_layer_t
*audio
);
132 /* Create a new layer decoder */
133 mpeg3_layer_t
* mpeg3_new_layer();
135 /* Create a new ac3 decoder */
136 mpeg3_ac3_t
* mpeg3_new_ac3();
138 /* Create a new pcm decoder */
139 mpeg3_pcm_t
* mpeg3_new_pcm();
142 /* Delete a new layer decoder */
143 void mpeg3_delete_layer(mpeg3_layer_t
*audio
);
145 /* Delete a new ac3 decoder */
146 void mpeg3_delete_ac3(mpeg3_ac3_t
*audio
);
148 /* Delete a new pcm decoder */
149 void mpeg3_delete_pcm(mpeg3_pcm_t
*audio
);
152 /* Return 1 if the data isn't a header */
153 int mpeg3_layer_check(unsigned char *data
);
154 int mpeg3_ac3_check(unsigned char *header
);
155 int mpeg3_pcm_check(unsigned char *header
);
157 /* These return the size of the next frame including the header */
158 /* or 0 if it wasn't a header. */
159 /* Decode a layer header */
160 int mpeg3_layer_header(mpeg3_layer_t
*audio
, unsigned char *data
);
163 /* Decode an AC3 header */
164 int mpeg3_ac3_header(mpeg3_ac3_t
*audio
, unsigned char *header
);
166 /* Decode an PCM header */
167 int mpeg3_pcm_header(mpeg3_pcm_t
*audio
, unsigned char *header
);
170 /* Reset after a seek */
171 void mpeg3_layer_reset(mpeg3_layer_t
*audio
);
173 /* Decode a frame of layer 3 audio. */
174 /* The output is linear, one buffer for every channel. */
175 /* The user should get the channel count from one of the header commands */
176 /* The output must be big enough to hold the largest frame of audio */
177 /* These functions return the number of samples rendered */
178 int mpeg3audio_dolayer3(mpeg3_layer_t
*audio
,
184 /* Decode a frame of layer 2 audio */
185 int mpeg3audio_dolayer2(mpeg3_layer_t
*audio
,
191 /* Decode a frame of ac3 audio */
192 int mpeg3audio_doac3(mpeg3_ac3_t
*audio
,
199 /* Decode a frame of ac3 audio */
200 int mpeg3audio_dopcm(mpeg3_pcm_t
*audio
,
218 mpeg3video_t
* mpeg3video_new(mpeg3_t
*file
,
219 mpeg3_vtrack_t
*track
);
220 int mpeg3video_delete(mpeg3video_t
*video
);
221 int mpeg3video_read_frame(mpeg3video_t
*video
,
222 unsigned char **output_rows
,
230 void mpeg3video_dump(mpeg3video_t
*video
);
231 int mpeg3video_prev_code(mpeg3_demuxer_t
*demuxer
, unsigned int code
);
232 int mpeg3video_next_code(mpeg3_bits_t
* stream
, unsigned int code
);
233 void mpeg3video_toc_error();
234 int mpeg3_rewind_video(mpeg3video_t
*video
);
235 int mpeg3_read_yuvframe_ptr(mpeg3_t
*file
,
240 int mpeg3_read_yuvframe(mpeg3_t
*file
,
249 // cache_it - store dropped frames in cache
250 int mpeg3video_drop_frames(mpeg3video_t
*video
, long frames
, int cache_it
);
251 void mpeg3_decode_subtitle(mpeg3video_t
*video
);
265 mpeg3_cache_t
* mpeg3_new_cache();
266 void mpeg3_delete_cache(mpeg3_cache_t
*ptr
);
267 void mpeg3_reset_cache(mpeg3_cache_t
*ptr
);
268 void mpeg3_cache_put_frame(mpeg3_cache_t
*ptr
,
269 int64_t frame_number
,
276 // Return 1 if the frame was found.
277 int mpeg3_cache_get_frame(mpeg3_cache_t
*ptr
,
278 int64_t frame_number
,
282 int mpeg3_ceche_has_frame(mpeg3_cache_t
*ptr
,
283 int64_t frame_number
);
284 int64_t mpeg3_cache_usage(mpeg3_cache_t
*ptr
);
298 mpeg3_fs_t
* mpeg3_new_fs(char *path
);
299 int mpeg3_delete_fs(mpeg3_fs_t
*fs
);
300 int mpeg3io_open_file(mpeg3_fs_t
*fs
);
301 int mpeg3io_close_file(mpeg3_fs_t
*fs
);
302 int mpeg3io_seek(mpeg3_fs_t
*fs
, int64_t byte
);
303 int mpeg3io_seek_relative(mpeg3_fs_t
*fs
, int64_t bytes
);
304 int mpeg3io_read_data(unsigned char *buffer
, int64_t bytes
, mpeg3_fs_t
*fs
);
312 mpeg3_t
* mpeg3_new(char *path
);
313 mpeg3_index_t
* mpeg3_new_index();
314 void mpeg3_delete_index(mpeg3_index_t
*index
);
315 int mpeg3_delete(mpeg3_t
*file
);
316 /* Returns 1 on error. */
317 /* Returns 2 if TOC is wrong version. */
318 int mpeg3_get_file_type(mpeg3_t
*file
,
323 int mpeg3_read_toc(mpeg3_t
*file
, int *atracks_return
, int *vtracks_return
);
339 mpeg3_demuxer_t
* mpeg3_new_demuxer(mpeg3_t
*file
,
343 int mpeg3_delete_demuxer(mpeg3_demuxer_t
*demuxer
);
344 mpeg3_demuxer_t
* mpeg3_get_demuxer(mpeg3_t
*file
);
345 int mpeg3demux_read_data(mpeg3_demuxer_t
*demuxer
,
346 unsigned char *output
,
349 /* Append elementary stream data */
350 /* Used by streaming mode. */
351 void mpeg3demux_append_data(mpeg3_demuxer_t
*demuxer
,
356 /* Shift elementary data out */
357 /* Used by streaming mode */
358 void mpeg3demux_shift_data(mpeg3_demuxer_t
*demuxer
,
361 /* Convert absolute byte position to position in program */
362 int64_t mpeg3_absolute_to_program(mpeg3_demuxer_t
*demuxer
,
363 int64_t absolute_byte
);
366 int mpeg3_read_next_packet(mpeg3_demuxer_t
*demuxer
);
367 int mpeg3_read_prev_packet(mpeg3_demuxer_t
*demuxer
);
370 unsigned int mpeg3demux_read_int32(mpeg3_demuxer_t
*demuxer
);
371 unsigned int mpeg3demux_read_int24(mpeg3_demuxer_t
*demuxer
);
372 unsigned int mpeg3demux_read_int16(mpeg3_demuxer_t
*demuxer
);
375 /* Give total number of bytes in all titles which belong to the current program. */
376 int64_t mpeg3demux_movie_size(mpeg3_demuxer_t
*demuxer
);
378 /* Give byte offset relative to start of movie */
379 int64_t mpeg3demux_tell_byte(mpeg3_demuxer_t
*demuxer
);
381 /* Give program the current packet belongs to */
382 int mpeg3demux_tell_program(mpeg3_demuxer_t
*demuxer
);
384 double mpeg3demux_get_time(mpeg3_demuxer_t
*demuxer
);
385 int mpeg3demux_eof(mpeg3_demuxer_t
*demuxer
);
386 int mpeg3demux_bof(mpeg3_demuxer_t
*demuxer
);
387 void mpeg3demux_start_reverse(mpeg3_demuxer_t
*demuxer
);
388 void mpeg3demux_start_forward(mpeg3_demuxer_t
*demuxer
);
389 int mpeg3demux_open_title(mpeg3_demuxer_t
*demuxer
, int title_number
);
390 /* Go to the absolute byte given */
391 int mpeg3demux_seek_byte(mpeg3_demuxer_t
*demuxer
, int64_t byte
);
393 /* Seek to the title and cell containing the absolute byte of the
395 /* Called at the beginning of every packet. */
396 int mpeg3_seek_phys(mpeg3_demuxer_t
*demuxer
);
398 unsigned char mpeg3demux_read_char_packet(mpeg3_demuxer_t
*demuxer
);
399 unsigned char mpeg3demux_read_prev_char_packet(mpeg3_demuxer_t
*demuxer
);
400 int mpeg3demux_read_program(mpeg3_demuxer_t
*demuxer
);
402 /* Get last pts read */
403 double mpeg3demux_audio_pts(mpeg3_demuxer_t
*demuxer
);
405 double mpeg3demux_video_pts(mpeg3_demuxer_t
*demuxer
);
407 /* Set the last pts read to -1 for audio and video */
408 void mpeg3demux_reset_pts(mpeg3_demuxer_t
*demuxer
);
410 /* scan forward for next pts. Used in byte seeking to synchronize */
411 double mpeg3demux_scan_pts(mpeg3_demuxer_t
*demuxer
);
413 /* seek using sequential search to the pts given. Used in byte seeking. */
414 int mpeg3demux_goto_pts(mpeg3_demuxer_t
*demuxer
, double pts
);
416 /* Get number of finished subtitles in the table matching id. */
417 /* If id = -1, get all finished subtitles. */
418 int mpeg3_finished_subtitles(mpeg3_demuxer_t
*demuxer
, int id
);
420 unsigned char mpeg3demux_read_char_packet(mpeg3_demuxer_t
*demuxer
);
421 unsigned char mpeg3demux_read_prev_char_packet(mpeg3_demuxer_t
*demuxer
);
423 #define mpeg3demux_error(demuxer) (((mpeg3_demuxer_t *)(demuxer))->error_flag)
425 static unsigned char mpeg3demux_read_char(mpeg3_demuxer_t
*demuxer
)
427 //printf("mpeg3demux_read_char %lx %lx\n", demuxer->data_position, demuxer->data_size);
428 if(demuxer
->data_position
< demuxer
->data_size
)
430 return demuxer
->data_buffer
[demuxer
->data_position
++];
434 return mpeg3demux_read_char_packet(demuxer
);
440 static unsigned char mpeg3demux_read_prev_char(mpeg3_demuxer_t
*demuxer
)
442 if(demuxer
->data_position
!= 0)
444 return demuxer
->data_buffer
[demuxer
->data_position
--];
448 return mpeg3demux_read_prev_char_packet(demuxer
);
466 mpeg3_bits_t
* mpeg3bits_new_stream(mpeg3_t
*file
, mpeg3_demuxer_t
*demuxer
);
467 int mpeg3bits_delete_stream(mpeg3_bits_t
* stream
);
468 int mpeg3bits_seek_byte(mpeg3_bits_t
* stream
, int64_t position
);
469 int mpeg3bits_open_title(mpeg3_bits_t
* stream
, int title
);
470 /* Give absolute byte offset in all titles. */
471 int64_t mpeg3bits_tell(mpeg3_bits_t
* stream
);
472 /* Reset bit bucket */
473 void mpeg3bits_reset(mpeg3_bits_t
*stream
);
487 #define mpeg3bits_error(stream) mpeg3demux_error((stream)->demuxer)
489 #define mpeg3bits_eof(stream) mpeg3demux_eof((stream)->demuxer)
491 #define mpeg3bits_bof(stream) mpeg3demux_bof((stream)->demuxer)
493 /* Read bytes backward from the file until the reverse_bits is full. */
494 static void mpeg3bits_fill_reverse_bits(mpeg3_bits_t
* stream
, int bits
)
497 while(stream
->bit_number
> 7)
500 stream
->bfr_size
-= 8;
501 stream
->bit_number
-= 8;
504 // Insert bytes before bfr_size
505 while(stream
->bfr_size
- stream
->bit_number
< bits
)
507 if(stream
->input_ptr
)
508 stream
->bfr
|= (unsigned int)(*--stream
->input_ptr
) << stream
->bfr_size
;
510 stream
->bfr
|= (unsigned int)mpeg3demux_read_prev_char(stream
->demuxer
) << stream
->bfr_size
;
511 stream
->bfr_size
+= 8;
515 /* Read bytes forward from the file until the forward_bits is full. */
516 static void mpeg3bits_fill_bits(mpeg3_bits_t
* stream
, int bits
)
518 while(stream
->bit_number
< bits
)
521 if(stream
->input_ptr
)
523 stream
->bfr
|= *stream
->input_ptr
++;
527 stream
->bfr
|= mpeg3demux_read_char(stream
->demuxer
);
529 stream
->bit_number
+= 8;
530 stream
->bfr_size
+= 8;
531 if(stream
->bfr_size
> 32) stream
->bfr_size
= 32;
535 /* Return 8 bits, advancing the file position. */
536 static unsigned int mpeg3bits_getbyte_noptr(mpeg3_bits_t
* stream
)
538 if(stream
->bit_number
< 8)
541 if(stream
->input_ptr
)
542 stream
->bfr
|= *stream
->input_ptr
++;
544 stream
->bfr
|= mpeg3demux_read_char(stream
->demuxer
);
546 stream
->bfr_size
+= 8;
547 if(stream
->bfr_size
> 32) stream
->bfr_size
= 32;
549 return (stream
->bfr
>> stream
->bit_number
) & 0xff;
551 return (stream
->bfr
>> (stream
->bit_number
-= 8)) & 0xff;
554 static unsigned int mpeg3bits_getbit_noptr(mpeg3_bits_t
* stream
)
556 if(!stream
->bit_number
)
559 stream
->bfr
|= mpeg3demux_read_char(stream
->demuxer
);
561 stream
->bfr_size
+= 8;
562 if(stream
->bfr_size
> 32) stream
->bfr_size
= 32;
564 stream
->bit_number
= 7;
566 return (stream
->bfr
>> 7) & 0x1;
568 return (stream
->bfr
>> (--stream
->bit_number
)) & (0x1);
571 /* Return n number of bits, advancing the file position. */
572 /* Use in place of flushbits */
573 static unsigned int mpeg3bits_getbits(mpeg3_bits_t
* stream
, int bits
)
575 if(bits
<= 0) return 0;
576 mpeg3bits_fill_bits(stream
, bits
);
577 return (stream
->bfr
>> (stream
->bit_number
-= bits
)) & (0xffffffff >> (32 - bits
));
580 static unsigned int mpeg3bits_showbits24_noptr(mpeg3_bits_t
* stream
)
582 while(stream
->bit_number
< 24)
585 stream
->bfr
|= mpeg3demux_read_char(stream
->demuxer
);
586 stream
->bit_number
+= 8;
587 stream
->bfr_size
+= 8;
588 if(stream
->bfr_size
> 32) stream
->bfr_size
= 32;
590 return (stream
->bfr
>> (stream
->bit_number
- 24)) & 0xffffff;
593 static unsigned int mpeg3bits_showbits32_noptr(mpeg3_bits_t
* stream
)
595 while(stream
->bit_number
< 32)
598 stream
->bfr
|= mpeg3demux_read_char(stream
->demuxer
);
599 stream
->bit_number
+= 8;
600 stream
->bfr_size
+= 8;
601 if(stream
->bfr_size
> 32) stream
->bfr_size
= 32;
606 static unsigned int mpeg3bits_showbits(mpeg3_bits_t
* stream
, int bits
)
608 mpeg3bits_fill_bits(stream
, bits
);
609 return (stream
->bfr
>> (stream
->bit_number
- bits
)) & (0xffffffff >> (32 - bits
));
612 static unsigned int mpeg3bits_getbits_reverse(mpeg3_bits_t
* stream
, int bits
)
615 mpeg3bits_fill_reverse_bits(stream
, bits
);
616 result
= (stream
->bfr
>> stream
->bit_number
) & (0xffffffff >> (32 - bits
));
617 stream
->bit_number
+= bits
;
621 static unsigned int mpeg3bits_showbits_reverse(mpeg3_bits_t
* stream
, int bits
)
624 mpeg3bits_fill_reverse_bits(stream
, bits
);
625 result
= (stream
->bfr
>> stream
->bit_number
) & (0xffffffff >> (32 - bits
));
638 // I/O must be character based so the buffer doesn't get overrun
646 void mpeg3io_read_buffer(mpeg3_fs_t
*fs
);
648 #define mpeg3io_tell(fs) (((mpeg3_fs_t *)(fs))->current_byte)
651 #define mpeg3io_eof(fs) (((mpeg3_fs_t *)(fs))->current_byte >= ((mpeg3_fs_t *)(fs))->total_bytes)
654 #define mpeg3io_bof(fs) (((mpeg3_fs_t *)(fs))->current_byte < 0)
656 #define mpeg3io_get_fd(fs) (fileno(((mpeg3_fs_t *)(fs))->fd))
658 #define mpeg3io_total_bytes(fs) (((mpeg3_fs_t *)(fs))->total_bytes)
660 static int mpeg3io_sync_buffer(mpeg3_fs_t
*fs
)
662 // Reposition buffer offset
663 if(fs
->buffer_position
+ fs
->buffer_offset
!= fs
->current_byte
)
665 fs
->buffer_offset
= fs
->current_byte
- fs
->buffer_position
;
669 if(fs
->current_byte
< fs
->buffer_position
||
670 fs
->current_byte
>= fs
->buffer_position
+ fs
->buffer_size
)
672 mpeg3io_read_buffer(fs
);
675 return !fs
->buffer_size
;
678 static unsigned int mpeg3io_read_char(mpeg3_fs_t
*fs
)
681 mpeg3io_sync_buffer(fs
);
682 result
= fs
->buffer
[fs
->buffer_offset
++];
687 static unsigned char mpeg3io_next_char(mpeg3_fs_t
*fs
)
689 unsigned char result
;
690 mpeg3io_sync_buffer(fs
);
691 result
= fs
->buffer
[fs
->buffer_offset
];
695 static uint32_t mpeg3io_read_int32(mpeg3_fs_t
*fs
)
699 /* Do not fread. This breaks byte ordering. */
700 a
= mpeg3io_read_char(fs
);
701 b
= mpeg3io_read_char(fs
);
702 c
= mpeg3io_read_char(fs
);
703 d
= mpeg3io_read_char(fs
);
711 static uint32_t mpeg3io_read_int24(mpeg3_fs_t
*fs
)
715 /* Do not fread. This breaks byte ordering. */
716 b
= mpeg3io_read_char(fs
);
717 c
= mpeg3io_read_char(fs
);
718 d
= mpeg3io_read_char(fs
);
725 static uint16_t mpeg3io_read_int16(mpeg3_fs_t
*fs
)
729 /* Do not fread. This breaks byte ordering. */
730 c
= mpeg3io_read_char(fs
);
731 d
= mpeg3io_read_char(fs
);
755 #define mpeg3slice_fillbits(buffer, nbits) \
756 while(((mpeg3_slice_buffer_t*)(buffer))->bits_size < (nbits)) \
758 if(((mpeg3_slice_buffer_t*)(buffer))->current_position < ((mpeg3_slice_buffer_t*)(buffer))->buffer_size) \
760 ((mpeg3_slice_buffer_t*)(buffer))->bits <<= 8; \
761 ((mpeg3_slice_buffer_t*)(buffer))->bits |= ((mpeg3_slice_buffer_t*)(buffer))->data[((mpeg3_slice_buffer_t*)(buffer))->current_position++]; \
763 ((mpeg3_slice_buffer_t*)(buffer))->bits_size += 8; \
766 #define mpeg3slice_flushbits(buffer, nbits) \
768 mpeg3slice_fillbits((buffer), (nbits)); \
769 ((mpeg3_slice_buffer_t*)(buffer))->bits_size -= (nbits); \
772 #define mpeg3slice_flushbit(buffer) \
774 if(((mpeg3_slice_buffer_t*)(buffer))->bits_size) \
775 ((mpeg3_slice_buffer_t*)(buffer))->bits_size--; \
777 if(((mpeg3_slice_buffer_t*)(buffer))->current_position < ((mpeg3_slice_buffer_t*)(buffer))->buffer_size) \
779 ((mpeg3_slice_buffer_t*)(buffer))->bits = \
780 ((mpeg3_slice_buffer_t*)(buffer))->data[((mpeg3_slice_buffer_t*)(buffer))->current_position++]; \
781 ((mpeg3_slice_buffer_t*)(buffer))->bits_size = 7; \
785 static unsigned int mpeg3slice_getbit(mpeg3_slice_buffer_t
*buffer
)
787 if(buffer
->bits_size
)
788 return (buffer
->bits
>> (--buffer
->bits_size
)) & 0x1;
790 if(buffer
->current_position
< buffer
->buffer_size
)
792 buffer
->bits
= buffer
->data
[buffer
->current_position
++];
793 buffer
->bits_size
= 7;
794 return (buffer
->bits
>> 7) & 0x1;
800 static unsigned int mpeg3slice_getbits2(mpeg3_slice_buffer_t
*buffer
)
802 if(buffer
->bits_size
>= 2)
803 return (buffer
->bits
>> (buffer
->bits_size
-= 2)) & 0x3;
805 if(buffer
->current_position
< buffer
->buffer_size
)
808 buffer
->bits
|= buffer
->data
[buffer
->current_position
++];
809 buffer
->bits_size
+= 6;
810 return (buffer
->bits
>> buffer
->bits_size
) & 0x3;
815 static unsigned int mpeg3slice_getbyte(mpeg3_slice_buffer_t
*buffer
)
817 if(buffer
->bits_size
>= 8)
818 return (buffer
->bits
>> (buffer
->bits_size
-= 8)) & 0xff;
820 if(buffer
->current_position
< buffer
->buffer_size
)
823 buffer
->bits
|= buffer
->data
[buffer
->current_position
++];
824 return (buffer
->bits
>> buffer
->bits_size
) & 0xff;
830 static unsigned int mpeg3slice_getbits(mpeg3_slice_buffer_t
*slice_buffer
, int bits
)
832 if(bits
== 1) return mpeg3slice_getbit(slice_buffer
);
833 mpeg3slice_fillbits(slice_buffer
, bits
);
834 return (slice_buffer
->bits
>> (slice_buffer
->bits_size
-= bits
)) & (0xffffffff >> (32 - bits
));
837 static unsigned int mpeg3slice_showbits16(mpeg3_slice_buffer_t
*buffer
)
839 if(buffer
->bits_size
>= 16)
840 return (buffer
->bits
>> (buffer
->bits_size
- 16)) & 0xffff;
842 if(buffer
->current_position
< buffer
->buffer_size
)
845 buffer
->bits_size
+= 16;
846 buffer
->bits
|= (unsigned int)buffer
->data
[buffer
->current_position
++] << 8;
847 buffer
->bits
|= buffer
->data
[buffer
->current_position
++];
848 return (buffer
->bits
>> (buffer
->bits_size
- 16)) & 0xffff;
853 static unsigned int mpeg3slice_showbits9(mpeg3_slice_buffer_t
*buffer
)
855 if(buffer
->bits_size
>= 9)
856 return (buffer
->bits
>> (buffer
->bits_size
- 9)) & 0x1ff;
858 if(buffer
->current_position
< buffer
->buffer_size
)
861 buffer
->bits_size
+= 16;
862 buffer
->bits
|= (unsigned int)buffer
->data
[buffer
->current_position
++] << 8;
863 buffer
->bits
|= buffer
->data
[buffer
->current_position
++];
864 return (buffer
->bits
>> (buffer
->bits_size
- 9)) & 0x1ff;
869 static unsigned int mpeg3slice_showbits5(mpeg3_slice_buffer_t
*buffer
)
871 if(buffer
->bits_size
>= 5)
872 return (buffer
->bits
>> (buffer
->bits_size
- 5)) & 0x1f;
874 if(buffer
->current_position
< buffer
->buffer_size
)
877 buffer
->bits_size
+= 8;
878 buffer
->bits
|= buffer
->data
[buffer
->current_position
++];
879 return (buffer
->bits
>> (buffer
->bits_size
- 5)) & 0x1f;
884 static unsigned int mpeg3slice_showbits(mpeg3_slice_buffer_t
*slice_buffer
, int bits
)
886 mpeg3slice_fillbits(slice_buffer
, bits
);
887 return (slice_buffer
->bits
>> (slice_buffer
->bits_size
- bits
)) & (0xffffffff >> (32 - bits
));