00001 #include "libmpeg3.h"
00002 #include "mpeg3io.h"
00003 #include "mpeg3protos.h"
00004 #include "workarounds.h"
00005
00006 #include <errno.h>
00007 #include <math.h>
00008 #include <stdlib.h>
00009 #include <string.h>
00010
00011 #define ABS(x) ((x) >= 0 ? (x) : -(x))
00012
00013
00014 static inline unsigned char packet_next_char(mpeg3_demuxer_t *demuxer)
00015 {
00016
00017 return demuxer->raw_data[demuxer->raw_offset];
00018 }
00019
00020
00021 static unsigned char packet_read_char(mpeg3_demuxer_t *demuxer)
00022 {
00023 unsigned char result = demuxer->raw_data[demuxer->raw_offset++];
00024
00025 return result;
00026 }
00027
00028 static inline unsigned int packet_read_int16(mpeg3_demuxer_t *demuxer)
00029 {
00030 unsigned int a, b, result;
00031
00032 a = demuxer->raw_data[demuxer->raw_offset++];
00033 b = demuxer->raw_data[demuxer->raw_offset++];
00034 result = (a << 8) | b;
00035
00036 return result;
00037 }
00038
00039 static inline unsigned int packet_next_int24(mpeg3_demuxer_t *demuxer)
00040 {
00041 unsigned int a, b, c, result;
00042
00043 a = demuxer->raw_data[demuxer->raw_offset];
00044 b = demuxer->raw_data[demuxer->raw_offset + 1];
00045 c = demuxer->raw_data[demuxer->raw_offset + 2];
00046 result = (a << 16) | (b << 8) | c;
00047
00048 return result;
00049 }
00050
00051 static inline unsigned int packet_read_int24(mpeg3_demuxer_t *demuxer)
00052 {
00053 unsigned int a, b, c, result;
00054
00055 a = demuxer->raw_data[demuxer->raw_offset++];
00056 b = demuxer->raw_data[demuxer->raw_offset++];
00057 c = demuxer->raw_data[demuxer->raw_offset++];
00058 result = (a << 16) | (b << 8) | c;
00059
00060 return result;
00061 }
00062
00063 static inline unsigned int packet_read_int32(mpeg3_demuxer_t *demuxer)
00064 {
00065 unsigned int a, b, c, d, result;
00066 a = demuxer->raw_data[demuxer->raw_offset++];
00067 b = demuxer->raw_data[demuxer->raw_offset++];
00068 c = demuxer->raw_data[demuxer->raw_offset++];
00069 d = demuxer->raw_data[demuxer->raw_offset++];
00070 result = (a << 24) | (b << 16) | (c << 8) | d;
00071
00072 return result;
00073 }
00074
00075 static inline unsigned int packet_skip(mpeg3_demuxer_t *demuxer, int length)
00076 {
00077 demuxer->raw_offset += length;
00078 return 0;
00079 }
00080
00081 static int get_adaptation_field(mpeg3_demuxer_t *demuxer)
00082 {
00083 int length;
00084 int pcr_flag;
00085
00086
00087 demuxer->adaptation_fields++;
00088
00089 length = packet_read_char(demuxer);
00090
00091 if(length > 0)
00092 {
00093
00094 pcr_flag = (packet_read_char(demuxer) >> 4) & 1;
00095
00096 if(pcr_flag)
00097 {
00098 unsigned int clk_ref_base = packet_read_int32(demuxer);
00099 unsigned int clk_ref_ext = packet_read_int16(demuxer);
00100
00101 if (clk_ref_base > 0x7fffffff)
00102 {
00103
00104 clk_ref_base = 0;
00105 clk_ref_ext = 0;
00106 }
00107 else
00108 {
00109
00110 clk_ref_base <<= 1;
00111 clk_ref_base |= (clk_ref_ext >> 15);
00112 clk_ref_ext &= 0x01ff;
00113 }
00114 demuxer->time = ((double)clk_ref_base + clk_ref_ext / 300) / 90000;
00115 if(length) packet_skip(demuxer, length - 7);
00116
00117 if(demuxer->dump)
00118 {
00119 printf(" pcr_flag=%x time=%f\n", pcr_flag, demuxer->time);
00120 }
00121 }
00122 else
00123 packet_skip(demuxer, length - 1);
00124 }
00125
00126 return 0;
00127 }
00128
00129 static int get_program_association_table(mpeg3_demuxer_t *demuxer)
00130 {
00131 demuxer->program_association_tables++;
00132 demuxer->table_id = packet_read_char(demuxer);
00133 demuxer->section_length = packet_read_int16(demuxer) & 0xfff;
00134 demuxer->transport_stream_id = packet_read_int16(demuxer);
00135 packet_skip(demuxer, demuxer->raw_size - demuxer->raw_offset);
00136 if(demuxer->dump)
00137 {
00138 printf(" table_id=0x%x section_length=%d transport_stream_id=0x%x\n",
00139 demuxer->table_id,
00140 demuxer->section_length,
00141 demuxer->transport_stream_id);
00142 }
00143 return 0;
00144 }
00145
00146 static int get_transport_payload(mpeg3_demuxer_t *demuxer,
00147 int is_audio,
00148 int is_video)
00149 {
00150 int bytes = demuxer->raw_size - demuxer->raw_offset;
00151
00152 if(bytes < 0)
00153 {
00154 fprintf(stderr, "get_transport_payload: got negative payload size!\n");
00155 return 1;
00156 }
00157
00158
00159
00160
00161
00162
00163 if(demuxer->read_all && is_audio)
00164 {
00165
00166
00167
00168
00169 memcpy(demuxer->audio_buffer + demuxer->audio_size,
00170 demuxer->raw_data + demuxer->raw_offset,
00171 bytes);
00172 demuxer->audio_size += bytes;
00173 }
00174 else
00175 if(demuxer->read_all && is_video)
00176 {
00177
00178 memcpy(demuxer->video_buffer + demuxer->video_size,
00179 demuxer->raw_data + demuxer->raw_offset,
00180 bytes);
00181 demuxer->video_size += bytes;
00182 }
00183 else
00184 {
00185 memcpy(demuxer->data_buffer + demuxer->data_size,
00186 demuxer->raw_data + demuxer->raw_offset,
00187 bytes);
00188 demuxer->data_size += bytes;
00189
00190
00191
00192
00193
00194
00195 }
00196
00197 demuxer->raw_offset += bytes;
00198 return 0;
00199 }
00200
00201 static int get_pes_packet_header(mpeg3_demuxer_t *demuxer,
00202 unsigned int *pts,
00203 unsigned int *dts)
00204 {
00205 unsigned int pes_header_bytes = 0;
00206 unsigned int pts_dts_flags;
00207 int pes_header_data_length;
00208
00209
00210 packet_read_char(demuxer);
00211 pts_dts_flags = (packet_read_char(demuxer) >> 6) & 0x3;
00212 pes_header_data_length = packet_read_char(demuxer);
00213
00214
00215
00216 if(pts_dts_flags == 2)
00217 {
00218 *pts = (packet_read_char(demuxer) >> 1) & 7;
00219 *pts <<= 15;
00220 *pts |= (packet_read_int16(demuxer) >> 1);
00221 *pts <<= 15;
00222 *pts |= (packet_read_int16(demuxer) >> 1);
00223 pes_header_bytes += 5;
00224 }
00225 else
00226 if(pts_dts_flags == 3)
00227 {
00228 *pts = (packet_read_char(demuxer) >> 1) & 7;
00229 *pts <<= 15;
00230 *pts |= (packet_read_int16(demuxer) >> 1);
00231 *pts <<= 15;
00232 *pts |= (packet_read_int16(demuxer) >> 1);
00233 *dts = (packet_read_char(demuxer) >> 1) & 7;
00234 *dts <<= 15;
00235 *dts |= (packet_read_int16(demuxer) >> 1);
00236 *dts <<= 15;
00237 *dts |= (packet_read_int16(demuxer) >> 1);
00238 pes_header_bytes += 10;
00239 }
00240
00241 demuxer->time = (double)*pts / 90000;
00242
00243 if(demuxer->dump)
00244 {
00245 printf(" pts_dts_flags=0x%02x pts=%f dts=%f\n",
00246 pts_dts_flags,
00247 (double)*pts / 90000,
00248 (double)*dts / 90000);
00249 }
00250
00251
00252
00253 packet_skip(demuxer, pes_header_data_length - pes_header_bytes);
00254 return 0;
00255 }
00256
00257 static int get_unknown_data(mpeg3_demuxer_t *demuxer)
00258 {
00259 int bytes = demuxer->raw_size - demuxer->raw_offset;
00260 memcpy(demuxer->data_buffer + demuxer->data_size,
00261 demuxer->raw_data + demuxer->raw_offset,
00262 bytes);
00263 demuxer->data_size += bytes;
00264 demuxer->raw_offset += bytes;
00265 return 0;
00266 }
00267
00268
00269
00270 static int get_transport_pes_packet(mpeg3_demuxer_t *demuxer)
00271 {
00272 unsigned int pts = 0, dts = 0;
00273 get_pes_packet_header(demuxer, &pts, &dts);
00274
00275
00276 if(demuxer->stream_id == 0xbd ||
00277
00278 demuxer->stream_id == 0xfd)
00279 {
00280
00281
00282 demuxer->stream_id = 0x0;
00283 demuxer->got_audio = 1;
00284 demuxer->custom_id = demuxer->pid;
00285
00286 if(demuxer->read_all)
00287 demuxer->astream_table[demuxer->custom_id] = AUDIO_AC3;
00288 if(demuxer->astream == -1)
00289 demuxer->astream = demuxer->custom_id;
00290
00291 if(demuxer->dump)
00292 {
00293 printf("get_transport_pes_packet: offset=%llx 0x%x bytes AC3 custom_id=0x%x astream=0x%x do_audio=%d\n",
00294 mpeg3io_tell(demuxer->titles[demuxer->current_title]->fs),
00295 demuxer->raw_size - demuxer->raw_offset,
00296 demuxer->custom_id,
00297 demuxer->astream,
00298 demuxer->do_audio);
00299 }
00300
00301 if((demuxer->custom_id == demuxer->astream &&
00302 demuxer->do_audio) ||
00303 demuxer->read_all)
00304 {
00305 demuxer->pes_audio_time = (double)pts / 90000;
00306 demuxer->audio_pid = demuxer->pid;
00307 return get_transport_payload(demuxer, 1, 0);
00308 }
00309
00310 }
00311 else
00312 if((demuxer->stream_id >> 4) == 12 || (demuxer->stream_id >> 4) == 13)
00313 {
00314
00315 demuxer->custom_id = demuxer->pid;
00316 demuxer->got_audio = 1;
00317
00318
00319 if(demuxer->read_all)
00320 demuxer->astream_table[demuxer->custom_id] = AUDIO_MPEG;
00321 if(demuxer->astream == -1)
00322 demuxer->astream = demuxer->custom_id;
00323
00324 if(demuxer->dump)
00325 {
00326 printf(" 0x%x bytes MP2 audio\n", demuxer->raw_size - demuxer->raw_offset);
00327 }
00328
00329 if((demuxer->custom_id == demuxer->astream &&
00330 demuxer->do_audio) ||
00331 demuxer->read_all)
00332 {
00333 demuxer->pes_audio_time = (double)pts / 90000;
00334 demuxer->audio_pid = demuxer->pid;
00335
00336 return get_transport_payload(demuxer, 1, 0);
00337 }
00338 }
00339 else
00340 if((demuxer->stream_id >> 4) == 14)
00341 {
00342
00343 demuxer->custom_id = demuxer->pid;
00344 demuxer->got_video = 1;
00345
00346
00347
00348 if(demuxer->read_all)
00349 demuxer->vstream_table[demuxer->custom_id] = 1;
00350 else
00351 if(demuxer->vstream == -1)
00352 demuxer->vstream = demuxer->custom_id;
00353
00354
00355 if(demuxer->dump)
00356 {
00357 printf(" 0x%x bytes video data\n", demuxer->raw_size - demuxer->raw_offset);
00358 }
00359
00360 if((demuxer->custom_id == demuxer->vstream &&
00361 demuxer->do_video) ||
00362 demuxer->read_all)
00363 {
00364 demuxer->pes_video_time = (double)pts / 90000;
00365 demuxer->video_pid = demuxer->pid;
00366
00367
00368 return get_transport_payload(demuxer, 0, 1);
00369 }
00370 }
00371
00372 packet_skip(demuxer, demuxer->raw_size - demuxer->raw_offset);
00373
00374 return 0;
00375 }
00376
00377 static int get_pes_packet(mpeg3_demuxer_t *demuxer)
00378 {
00379 demuxer->pes_packets++;
00380
00381
00382
00383
00384 packet_read_int24(demuxer);
00385 demuxer->stream_id = packet_read_char(demuxer);
00386
00387
00388 if(demuxer->dump)
00389 {
00390 printf(" stream_id=0x%02x\n", demuxer->stream_id);
00391 }
00392
00393
00394 packet_read_int16(demuxer);
00395
00396 if(demuxer->stream_id != MPEG3_PRIVATE_STREAM_2 &&
00397 demuxer->stream_id != MPEG3_PADDING_STREAM)
00398 {
00399 return get_transport_pes_packet(demuxer);
00400 }
00401 else
00402 if(demuxer->stream_id == MPEG3_PRIVATE_STREAM_2)
00403 {
00404 packet_skip(demuxer, demuxer->raw_size - demuxer->raw_offset);
00405 return 0;
00406 }
00407 else
00408 if(demuxer->stream_id == MPEG3_PADDING_STREAM)
00409 {
00410 packet_skip(demuxer, demuxer->raw_size - demuxer->raw_offset);
00411 return 0;
00412 }
00413 else
00414 {
00415 fprintf(stderr, "unknown stream_id in pes packet");
00416 return 1;
00417 }
00418 return 0;
00419 }
00420
00421 static int get_payload(mpeg3_demuxer_t *demuxer)
00422 {
00423
00424 if(demuxer->payload_unit_start_indicator)
00425 {
00426 if(demuxer->pid == 0)
00427 get_program_association_table(demuxer);
00428 else
00429 if(packet_next_int24(demuxer) == MPEG3_PACKET_START_CODE_PREFIX)
00430 get_pes_packet(demuxer);
00431 else
00432 packet_skip(demuxer, demuxer->raw_size - demuxer->raw_offset);
00433 }
00434 else
00435 {
00436 if(demuxer->dump)
00437 {
00438 printf(" 0x%x bytes elementary data\n", demuxer->raw_size - demuxer->raw_offset);
00439 }
00440
00441
00442
00443
00444 if(demuxer->pid == demuxer->audio_pid &&
00445 (demuxer->do_audio ||
00446 demuxer->read_all))
00447 {
00448 if(demuxer->do_audio) demuxer->got_audio = 1;
00449
00450 if(demuxer->dump)
00451 {
00452 printf("get_payload: offset=%llx 0x%x bytes AC3 pid=0x%x\n",
00453 mpeg3io_tell(demuxer->titles[demuxer->current_title]->fs),
00454 demuxer->raw_size - demuxer->raw_offset,
00455 demuxer->pid);
00456 }
00457
00458 get_transport_payload(demuxer, 1, 0);
00459 }
00460 else
00461 if(demuxer->pid == demuxer->video_pid &&
00462 (demuxer->do_video ||
00463 demuxer->read_all))
00464 {
00465 if(demuxer->do_video) demuxer->got_video = 1;
00466 get_transport_payload(demuxer, 0, 1);
00467 }
00468 else
00469 if(demuxer->read_all)
00470 {
00471 get_transport_payload(demuxer, 0, 0);
00472
00473 }
00474 }
00475 return 0;
00476 }
00477
00478
00479 static int read_transport(mpeg3_demuxer_t *demuxer)
00480 {
00481 demuxer->dump = 0;
00482 mpeg3_t *file = (mpeg3_t*)demuxer->file;
00483 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
00484 int result = 0;
00485 unsigned int bits;
00486 int table_entry;
00487
00488
00489 demuxer->raw_size = file->packet_size;
00490 demuxer->raw_offset = 0;
00491 demuxer->stream_id = 0;
00492 demuxer->got_audio = 0;
00493 demuxer->got_video = 0;
00494 demuxer->custom_id = -1;
00495
00496
00497 if(result)
00498 {
00499 perror("read_transport");
00500 return 1;
00501 }
00502
00503
00504
00505
00506 if(file->is_bd)
00507 mpeg3io_read_int32(title->fs);
00508
00509
00510 do
00511 {
00512 bits = mpeg3io_read_char(title->fs);
00513 }while(!mpeg3io_eof(title->fs) && !result && bits != MPEG3_SYNC_BYTE);
00514
00515
00516 if(mpeg3io_eof(title->fs) || result) return 1;
00517
00518 if(bits == MPEG3_SYNC_BYTE && !result)
00519 {
00520
00521 demuxer->raw_data[0] = MPEG3_SYNC_BYTE;
00522
00523
00524 int fragment_size = file->packet_size - 1;
00525
00526 if(file->is_bd)
00527 {
00528 fragment_size -= 4;
00529 demuxer->raw_size -= 4;
00530 }
00531 result = mpeg3io_read_data(demuxer->raw_data + 1,
00532 fragment_size,
00533 title->fs);
00534 }
00535 else
00536 {
00537
00538 demuxer->program_byte = mpeg3io_tell(title->fs) +
00539 title->start_byte;
00540 return 1;
00541 }
00542
00543
00544
00545 packet_read_char(demuxer);
00546 bits = packet_read_int24(demuxer) & 0x00ffffff;
00547 demuxer->transport_error_indicator = (bits >> 23) & 0x1;
00548 demuxer->payload_unit_start_indicator = (bits >> 22) & 0x1;
00549 demuxer->pid = demuxer->custom_id = (bits >> 8) & 0x00001fff;
00550
00551 demuxer->transport_scrambling_control = (bits >> 6) & 0x3;
00552 demuxer->adaptation_field_control = (bits >> 4) & 0x3;
00553 demuxer->continuity_counter = bits & 0xf;
00554
00555
00556
00557 if(demuxer->transport_error_indicator)
00558 {
00559
00560
00561 demuxer->program_byte = mpeg3io_tell(title->fs) +
00562 title->start_byte;
00563 return 0;
00564 }
00565
00566 if (demuxer->pid == 0x1fff)
00567 {
00568 demuxer->is_padding = 1;
00569 }
00570 else
00571 {
00572 demuxer->is_padding = 0;
00573 }
00574
00575
00576 for(table_entry = 0, result = 0;
00577 table_entry < demuxer->total_pids;
00578 table_entry++)
00579 {
00580 if(demuxer->pid == demuxer->pid_table[table_entry])
00581 {
00582 result = 1;
00583 break;
00584 }
00585 }
00586
00587
00588
00589
00590
00591 if(!result && demuxer->total_pids < MPEG3_PIDMAX)
00592 {
00593 demuxer->pid_table[table_entry] = demuxer->pid;
00594 demuxer->continuity_counters[table_entry] = demuxer->continuity_counter;
00595 demuxer->total_pids++;
00596 }
00597 result = 0;
00598
00599 if(demuxer->dump)
00600 {
00601 printf("offset=0x%llx pid=0x%02x continuity=0x%02x padding=%d adaptation=%d unit_start=%d\n",
00602 demuxer->program_byte,
00603 demuxer->pid,
00604 demuxer->continuity_counter,
00605 demuxer->is_padding,
00606 demuxer->adaptation_field_control,
00607 demuxer->payload_unit_start_indicator);
00608 }
00609
00610
00611
00612 if(demuxer->is_padding)
00613 {
00614 demuxer->program_byte = mpeg3io_tell(title->fs) +
00615 title->start_byte;
00616 return 0;
00617 }
00618
00619
00620
00621
00622 if(demuxer->adaptation_field_control & 0x2)
00623 result = get_adaptation_field(demuxer);
00624
00625
00626
00627 if(demuxer->adaptation_field_control & 0x1)
00628 result = get_payload(demuxer);
00629
00630 demuxer->program_byte = mpeg3io_tell(title->fs) +
00631 title->start_byte;
00632 return result;
00633 }
00634
00635 static int get_system_header(mpeg3_demuxer_t *demuxer)
00636 {
00637 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
00638 int length = mpeg3io_read_int16(title->fs);
00639 mpeg3io_seek_relative(title->fs, length);
00640 return 0;
00641 }
00642
00643 static unsigned int get_timestamp(mpeg3_demuxer_t *demuxer)
00644 {
00645 unsigned int timestamp;
00646 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
00647
00648
00649 timestamp = (mpeg3io_read_char(title->fs) >> 1) & 7;
00650 timestamp <<= 15;
00651 timestamp |= (mpeg3io_read_int16(title->fs) >> 1);
00652 timestamp <<= 15;
00653 timestamp |= (mpeg3io_read_int16(title->fs) >> 1);
00654 return timestamp;
00655 }
00656
00657 static int get_pack_header(mpeg3_demuxer_t *demuxer)
00658 {
00659 unsigned int i, j;
00660 unsigned int clock_ref, clock_ref_ext;
00661 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
00662
00663
00664 if((mpeg3io_next_char(title->fs) >> 4) == 2)
00665 {
00666
00667 demuxer->time = (double)get_timestamp(demuxer) / 90000;
00668
00669 mpeg3io_read_int24(title->fs);
00670 }
00671 else
00672 if(mpeg3io_next_char(title->fs) & 0x40)
00673 {
00674 i = mpeg3io_read_int32(title->fs);
00675 j = mpeg3io_read_int16(title->fs);
00676
00677 if(i & 0x40000000 || (i >> 28) == 2)
00678 {
00679 clock_ref = ((i & 0x38000000) << 3);
00680 clock_ref |= ((i & 0x03fff800) << 4);
00681 clock_ref |= ((i & 0x000003ff) << 5);
00682 clock_ref |= ((j & 0xf800) >> 11);
00683 clock_ref_ext = (j >> 1) & 0x1ff;
00684
00685 demuxer->time = (double)(clock_ref + clock_ref_ext / 300) / 90000;
00686
00687 mpeg3io_read_int24(title->fs);
00688 i = mpeg3io_read_char(title->fs) & 0x7;
00689
00690
00691 mpeg3io_seek_relative(title->fs, i);
00692 }
00693 }
00694 else
00695 {
00696 mpeg3io_seek_relative(title->fs, 2);
00697 }
00698 return 0;
00699 }
00700
00701
00702
00703 static int get_program_payload(mpeg3_demuxer_t *demuxer,
00704 int bytes,
00705 int is_audio,
00706 int is_video)
00707 {
00708 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
00709
00710 if(demuxer->read_all && is_audio)
00711 {
00712 mpeg3io_read_data(demuxer->audio_buffer + demuxer->audio_size,
00713 bytes,
00714 title->fs);
00715 demuxer->audio_size += bytes;
00716 }
00717 else
00718 if(demuxer->read_all && is_video)
00719 {
00720 mpeg3io_read_data(demuxer->video_buffer + demuxer->video_size,
00721 bytes,
00722 title->fs);
00723 demuxer->video_size += bytes;
00724 }
00725 else
00726 {
00727 mpeg3io_read_data(demuxer->data_buffer + demuxer->data_size,
00728 bytes,
00729 title->fs);
00730 demuxer->data_size += bytes;
00731 }
00732
00733
00734 return 0;
00735 }
00736
00737
00738
00739
00740
00741
00742 static int handle_scrambling(mpeg3_demuxer_t *demuxer,
00743 int decryption_offset)
00744 {
00745 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
00746
00747
00748
00749 if(demuxer->last_packet_start + 0x800 > mpeg3io_tell(title->fs))
00750 {
00751 mpeg3io_seek_relative(title->fs,
00752 demuxer->last_packet_start + 0x800 - mpeg3io_tell(title->fs));
00753 }
00754
00755
00756
00757
00758 if(demuxer->data_size ||
00759 demuxer->audio_size ||
00760 demuxer->video_size)
00761 {
00762 unsigned char *buffer_ptr = 0;
00763 if(demuxer->data_size) buffer_ptr = demuxer->data_buffer;
00764 else
00765 if(demuxer->audio_size) buffer_ptr = demuxer->audio_buffer;
00766 else
00767 if(demuxer->video_size) buffer_ptr = demuxer->video_buffer;
00768
00769
00770
00771 if(mpeg3_decrypt_packet(title->fs->css,
00772 buffer_ptr,
00773 decryption_offset))
00774 {
00775 fprintf(stderr, "handle_scrambling: Decryption not available\n");
00776 return 1;
00777 }
00778 }
00779
00780 return 0;
00781 }
00782
00783 static void remove_subtitle(mpeg3_demuxer_t *demuxer, int number)
00784 {
00785 int i, j;
00786 mpeg3_delete_subtitle(demuxer->subtitles[number]);
00787 for(j = number; j < demuxer->total_subtitles - 1; j++)
00788 {
00789 demuxer->subtitles[j] = demuxer->subtitles[j + 1];
00790 }
00791 demuxer->total_subtitles--;
00792 }
00793
00794 static void remove_subtitle_ptr(mpeg3_demuxer_t *demuxer, mpeg3_subtitle_t *ptr)
00795 {
00796 int i, number = demuxer->total_subtitles;
00797 for(i = 0; i < demuxer->total_subtitles; i++)
00798 {
00799 if(demuxer->subtitles[i] == ptr)
00800 {
00801 number = i;
00802 break;
00803 }
00804 }
00805
00806 for(i = number; i < demuxer->total_subtitles - 1; i++)
00807 {
00808 demuxer->subtitles[i] = demuxer->subtitles[i + 1];
00809 }
00810 demuxer->total_subtitles--;
00811 }
00812
00813
00814 static mpeg3_subtitle_t* new_subtitle(mpeg3_demuxer_t *demuxer,
00815 int id,
00816 int64_t offset)
00817 {
00818 mpeg3_subtitle_t *subtitle = 0;
00819 int i, j;
00820
00821
00822 int total = 0;
00823 int got_it = 0;
00824 for(i = 0; i < demuxer->total_subtitles; i++)
00825 {
00826 if(demuxer->subtitles[i]->id == id) total++;
00827
00828 if(demuxer->subtitles[i]->id == id &&
00829 !demuxer->subtitles[i]->done &&
00830 !got_it)
00831 {
00832 subtitle = demuxer->subtitles[i];
00833 got_it = 1;
00834 }
00835 }
00836
00837
00838 if(!subtitle)
00839 {
00840 demuxer->total_subtitles++;
00841 demuxer->subtitles = realloc(demuxer->subtitles,
00842 sizeof(mpeg3_subtitle_t*) * demuxer->total_subtitles);
00843 subtitle = demuxer->subtitles[demuxer->total_subtitles - 1] =
00844 calloc(sizeof(mpeg3_subtitle_t), 1);
00845 subtitle->id = id;
00846 subtitle->offset = offset;
00847 }
00848
00849
00850 if(total > MPEG3_MAX_SUBTITLES)
00851 {
00852 for(i = 0; i < demuxer->total_subtitles - 1; i++)
00853 {
00854 if(demuxer->subtitles[i]->id == id)
00855 {
00856 remove_subtitle(demuxer, i);
00857 break;
00858 }
00859 }
00860 }
00861
00862 return subtitle;
00863 }
00864
00865
00866 static void handle_subtitle(mpeg3_t *file,
00867 mpeg3_demuxer_t *demuxer,
00868 mpeg3_subtitle_t *subtitle,
00869 int bytes)
00870 {
00871 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
00872 int i;
00873
00874
00875 if(!subtitle->data)
00876 {
00877 subtitle->data = malloc(bytes);
00878 }
00879 else
00880 {
00881 subtitle->data = realloc(subtitle->data,
00882 subtitle->size + bytes);
00883 }
00884
00885
00886 mpeg3io_read_data(subtitle->data + subtitle->size,
00887 bytes,
00888 title->fs);
00889
00890
00891
00892
00893
00894
00895
00896 subtitle->size += bytes;
00897
00898
00899 for(i = 0; i < subtitle->size - 1; i++)
00900 {
00901
00902 unsigned char *ptr = subtitle->data + i;
00903 int packet_size = (ptr[0] << 8) | (ptr[1]);
00904
00905
00906 if(i + packet_size <= subtitle->size &&
00907 *(ptr + packet_size - 1) == 0xff)
00908 {
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927 memcpy(subtitle->data, subtitle->data + i, packet_size);
00928 subtitle->size = packet_size;
00929 subtitle->done = 1;
00930
00931 remove_subtitle_ptr(demuxer, subtitle);
00932 mpeg3_strack_t *strack = mpeg3_create_strack(file, subtitle->id);
00933 mpeg3_append_subtitle(strack, subtitle);
00934 demuxer->got_subtitle = 1;
00935
00936
00937
00938
00939
00940
00941
00942
00943 break;
00944 }
00945 }
00946 }
00947
00948
00949
00950 static int handle_pcm(mpeg3_demuxer_t *demuxer, int bytes)
00951 {
00952
00953
00954 unsigned char code;
00955 int bits_code;
00956 int bits;
00957 int samplerate_code;
00958 int samplerate;
00959 unsigned char *output = 0;
00960 unsigned char *data_buffer = 0;
00961 int data_start = 0;
00962 int *data_size = 0;
00963 int i, j;
00964
00965
00966
00967
00968 if(demuxer->read_all && demuxer->audio_size)
00969 {
00970 output = demuxer->audio_buffer + demuxer->audio_start;
00971 data_buffer = demuxer->audio_buffer;
00972 data_start = demuxer->audio_start;
00973 data_size = &demuxer->audio_size;
00974 }
00975 else
00976 {
00977 output = demuxer->data_buffer + demuxer->data_start;
00978 data_buffer = demuxer->data_buffer;
00979 data_start = demuxer->data_start;
00980 data_size = &demuxer->data_size;
00981 }
00982
00983
00984
00985
00986
00987 code = output[1];
00988 for(i = *data_size - 1, j = *data_size + PCM_HEADERSIZE - 3 - 1;
00989 i >= data_start;
00990 i--, j--)
00991 *(data_buffer + j) = *(data_buffer + i);
00992 *data_size += PCM_HEADERSIZE - 3;
00993
00994 bits_code = (code >> 6) & 3;
00995 samplerate_code = (code & 0x10);
00996
00997
00998 output[0] = 0x7f;
00999 output[1] = 0x7f;
01000 output[2] = 0x80;
01001 output[3] = 0x7f;
01002
01003 switch(samplerate_code)
01004 {
01005 case 1:
01006 samplerate = 96000;
01007 break;
01008 default:
01009 samplerate = 48000;
01010 break;
01011 }
01012
01013 *(int32_t*)(output + 4) = samplerate;
01014
01015 switch(bits_code)
01016 {
01017 case 0: bits = 16; break;
01018 case 1: bits = 20; break;
01019 case 2: bits = 24; break;
01020 default: bits = 16; break;
01021 }
01022 *(int32_t*)(output + 8) = bits;
01023
01024 *(int32_t*)(output + 12) = (code & 0x7) + 1;
01025
01026 *(int32_t*)(output + 16) = bytes -
01027 3 +
01028 PCM_HEADERSIZE;
01029
01030
01031
01032
01033
01034 }
01035
01036
01037
01038
01039
01040
01041
01042 static int get_program_pes_packet(mpeg3_demuxer_t *demuxer, unsigned int header)
01043 {
01044 unsigned int pts = 0, dts = 0;
01045 int pes_packet_length;
01046 int64_t pes_packet_start;
01047 int decryption_offset;
01048 int i;
01049 mpeg3_t *file = demuxer->file;
01050 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
01051 int scrambling = 0;
01052
01053 int do_pcm = 0;
01054
01055 demuxer->data_start = demuxer->data_size;
01056 demuxer->audio_start = demuxer->audio_size;
01057 demuxer->video_start = demuxer->video_size;
01058
01059 demuxer->stream_id = header & 0xff;
01060 pes_packet_length = mpeg3io_read_int16(title->fs);
01061 pes_packet_start = mpeg3io_tell(title->fs);
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076 if(demuxer->stream_id != MPEG3_PRIVATE_STREAM_2 &&
01077 demuxer->stream_id != MPEG3_PADDING_STREAM)
01078 {
01079 if((mpeg3io_next_char(title->fs) >> 6) == 0x02)
01080 {
01081
01082 int pes_header_bytes = 0;
01083 int pts_dts_flags;
01084 int pes_header_data_length;
01085
01086
01087 demuxer->last_packet_decryption = mpeg3io_tell(title->fs);
01088 scrambling = mpeg3io_read_char(title->fs) & 0x30;
01089
01090
01091
01092
01093 if(scrambling) pes_packet_length = 0x800 -
01094 pes_packet_start +
01095 demuxer->last_packet_start;
01096
01097
01098 pts_dts_flags = (mpeg3io_read_char(title->fs) >> 6) & 0x3;
01099 pes_header_data_length = mpeg3io_read_char(title->fs);
01100
01101
01102
01103
01104 if(pts_dts_flags == 2)
01105 {
01106 pts = get_timestamp(demuxer);
01107 if(demuxer->dump)
01108 {
01109 printf("pts=%d\n", pts);
01110 }
01111 pes_header_bytes += 5;
01112 }
01113 else
01114 if(pts_dts_flags == 3)
01115 {
01116 pts = get_timestamp(demuxer);
01117 dts = get_timestamp(demuxer);
01118 if(demuxer->dump)
01119 {
01120 printf("pts=%d dts=%d\n", pts, dts);
01121 }
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137 pes_header_bytes += 10;
01138 }
01139
01140
01141
01142
01143
01144 mpeg3io_seek_relative(title->fs,
01145 pes_header_data_length - pes_header_bytes);
01146 }
01147 else
01148 {
01149 int pts_dts_flags;
01150
01151 while(mpeg3io_next_char(title->fs) == 0xff)
01152 {
01153 mpeg3io_read_char(title->fs);
01154 }
01155
01156
01157 if((mpeg3io_next_char(title->fs) & 0x40) == 0x40)
01158 {
01159 mpeg3io_seek_relative(title->fs, 2);
01160 }
01161
01162
01163 pts_dts_flags = mpeg3io_next_char(title->fs);
01164
01165 if(pts_dts_flags >= 0x30)
01166 {
01167
01168 pts = get_timestamp(demuxer);
01169 dts = get_timestamp(demuxer);
01170 }
01171 else
01172 if(pts_dts_flags >= 0x20)
01173 {
01174
01175 pts = get_timestamp(demuxer);
01176 }
01177 else
01178 if(pts_dts_flags == 0x0f)
01179 {
01180
01181 mpeg3io_read_char(title->fs);
01182 }
01183 else
01184 {
01185 return 1;
01186 }
01187 }
01188
01189
01190 if((demuxer->stream_id >> 4) == 0xc || (demuxer->stream_id >> 4) == 0xd)
01191 {
01192
01193
01194 pes_packet_length -= mpeg3io_tell(title->fs) - pes_packet_start;
01195
01196 demuxer->got_audio = 1;
01197 demuxer->custom_id = demuxer->stream_id & 0x0f;
01198
01199
01200 if(demuxer->read_all)
01201 demuxer->astream_table[demuxer->custom_id] = AUDIO_MPEG;
01202 else
01203 if(demuxer->astream == -1)
01204 demuxer->astream = demuxer->custom_id;
01205
01206
01207
01208
01209 if(pts > 0) demuxer->pes_audio_time = (double)pts / 60000;
01210
01211
01212 if(demuxer->custom_id == demuxer->astream &&
01213 demuxer->do_audio ||
01214 demuxer->read_all)
01215 {
01216 decryption_offset = mpeg3io_tell(title->fs) - demuxer->last_packet_start;
01217 if(demuxer->dump)
01218 {
01219 printf(" MP2 audio data offset=%llx custom_id=%x size=%x\n",
01220 demuxer->program_byte,
01221 demuxer->custom_id,
01222 pes_packet_length);
01223 }
01224
01225 get_program_payload(demuxer, pes_packet_length, 1, 0);
01226 }
01227 else
01228 {
01229 mpeg3io_seek_relative(title->fs, pes_packet_length);
01230 }
01231 }
01232 else
01233 if((demuxer->stream_id >> 4) == 0xe)
01234 {
01235
01236
01237 pes_packet_length -= mpeg3io_tell(title->fs) - pes_packet_start;
01238
01239 demuxer->got_video = 1;
01240 demuxer->custom_id = demuxer->stream_id & 0x0f;
01241
01242
01243 if(demuxer->read_all)
01244 demuxer->vstream_table[demuxer->custom_id] = 1;
01245 else
01246 if(demuxer->vstream == -1)
01247 demuxer->vstream = demuxer->custom_id;
01248
01249 if(pts > 0) demuxer->pes_video_time = (double)pts / 60000;
01250
01251
01252
01253 if(demuxer->custom_id == demuxer->vstream &&
01254 demuxer->do_video ||
01255 demuxer->read_all)
01256 {
01257 decryption_offset = mpeg3io_tell(title->fs) - demuxer->last_packet_start;
01258 if(demuxer->dump)
01259 {
01260 printf(" video offset=%llx custom_id=%x size=%x\n",
01261 demuxer->program_byte,
01262 demuxer->custom_id,
01263 pes_packet_length);
01264 }
01265
01266
01267 get_program_payload(demuxer,
01268 pes_packet_length,
01269 0,
01270 1);
01271 }
01272 else
01273 {
01274 if(demuxer->dump)
01275 {
01276 printf(" skipping video size=%x\n", pes_packet_length);
01277 }
01278 mpeg3io_seek_relative(title->fs, pes_packet_length);
01279 }
01280 }
01281 else
01282 if((demuxer->stream_id == 0xbd || demuxer->stream_id == 0xbf) &&
01283 mpeg3io_next_char(title->fs) != 0xff &&
01284 ((mpeg3io_next_char(title->fs) & 0xf0) == 0x20))
01285 {
01286
01287 mpeg3_subtitle_t *subtitle = 0;
01288 int stream_id = demuxer->stream_id = mpeg3io_read_char(title->fs);
01289 subtitle = new_subtitle(demuxer,
01290 stream_id,
01291 demuxer->program_byte);
01292
01293
01294 pes_packet_length -= mpeg3io_tell(title->fs) - pes_packet_start;
01295
01296 handle_subtitle(file, demuxer, subtitle, pes_packet_length);
01297
01298
01299 }
01300 else
01301 if((demuxer->stream_id == 0xbd || demuxer->stream_id == 0xbf) &&
01302 mpeg3io_next_char(title->fs) != 0xff &&
01303 ((mpeg3io_next_char(title->fs) & 0xf0) == 0x80))
01304 {
01305 int format;
01306
01307
01308 if((mpeg3io_next_char(title->fs) & 0xf0) == 0xa0)
01309 format = AUDIO_PCM;
01310 else
01311 format = AUDIO_AC3;
01312
01313
01314
01315 demuxer->stream_id = mpeg3io_next_char(title->fs);
01316 if(pts > 0) demuxer->pes_audio_time = (double)pts / 60000;
01317
01318 demuxer->got_audio = 1;
01319 demuxer->custom_id = demuxer->stream_id;
01320
01321
01322
01323 if(demuxer->read_all)
01324 demuxer->astream_table[demuxer->custom_id] = format;
01325 else
01326 if(demuxer->astream == -1)
01327 demuxer->astream = demuxer->custom_id;
01328
01329
01330
01331
01332
01333
01334
01335 if(demuxer->custom_id == demuxer->astream &&
01336 demuxer->do_audio ||
01337 demuxer->read_all)
01338 {
01339 demuxer->aformat = format;
01340 mpeg3io_read_int32(title->fs);
01341
01342 pes_packet_length -= mpeg3io_tell(title->fs) - pes_packet_start;
01343 decryption_offset = mpeg3io_tell(title->fs) - demuxer->last_packet_start;
01344
01345 if(format == AUDIO_PCM) do_pcm = 1;
01346
01347
01348 if(demuxer->dump)
01349 {
01350 printf(" AC3 audio data size=%x\n", pes_packet_length);
01351 }
01352
01353 get_program_payload(demuxer,
01354 pes_packet_length,
01355 1,
01356 0);
01357 }
01358 else
01359 {
01360 pes_packet_length -= mpeg3io_tell(title->fs) - pes_packet_start;
01361 mpeg3io_seek_relative(title->fs, pes_packet_length);
01362 }
01363
01364 }
01365 else
01366 if(demuxer->stream_id == 0xbc || 1)
01367 {
01368 pes_packet_length -= mpeg3io_tell(title->fs) - pes_packet_start;
01369 mpeg3io_seek_relative(title->fs, pes_packet_length);
01370 }
01371 }
01372 else
01373 if(demuxer->stream_id == MPEG3_PRIVATE_STREAM_2 || demuxer->stream_id == MPEG3_PADDING_STREAM)
01374 {
01375 pes_packet_length -= mpeg3io_tell(title->fs) - pes_packet_start;
01376 mpeg3io_seek_relative(title->fs, pes_packet_length);
01377 }
01378
01379
01380
01381
01382 if(scrambling) handle_scrambling(demuxer, decryption_offset);
01383
01384
01385
01386 if(do_pcm) handle_pcm(demuxer, pes_packet_length);
01387
01388
01389
01390
01391
01392
01393
01394
01395 return 0;
01396 }
01397
01398 int mpeg3demux_read_program(mpeg3_demuxer_t *demuxer)
01399 {
01400 int result = 0;
01401 int count = 0;
01402 mpeg3_t *file = demuxer->file;
01403 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
01404 unsigned int header = 0;
01405 int pack_count = 0;
01406
01407 demuxer->got_audio = 0;
01408 demuxer->got_video = 0;
01409 demuxer->stream_id = 0;
01410 demuxer->custom_id = -1;
01411 demuxer->got_subtitle = 0;
01412
01413 if(mpeg3io_eof(title->fs)) return 1;
01414
01415
01416
01417
01418
01419
01420
01421
01422
01423
01424
01425 while(!result && !mpeg3io_eof(title->fs))
01426 {
01427 header = mpeg3io_read_int32(title->fs);
01428
01429
01430 if(header == MPEG3_PACK_START_CODE)
01431 {
01432
01433
01434
01435 if(pack_count)
01436 {
01437 mpeg3io_seek_relative(title->fs, -4);
01438 break;
01439 }
01440
01441 demuxer->last_packet_start = mpeg3io_tell(title->fs) - 4;
01442 result = get_pack_header(demuxer);
01443 pack_count++;
01444
01445
01446
01447 }
01448 else
01449 if(header == MPEG3_SYSTEM_START_CODE && pack_count)
01450 {
01451
01452
01453
01454 result = get_system_header(demuxer);
01455
01456
01457
01458 }
01459 else
01460 if((header >> 8) == MPEG3_PACKET_START_CODE_PREFIX && pack_count)
01461 {
01462
01463
01464 result = get_program_pes_packet(demuxer, header);
01465
01466
01467
01468 }
01469 else
01470 {
01471
01472 mpeg3io_seek_relative(title->fs, -3);
01473 }
01474 }
01475
01476
01477
01478
01479
01480
01481
01482
01483 result = 0;
01484
01485
01486
01487
01488
01489
01490 demuxer->last_packet_end = mpeg3io_tell(title->fs);
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500
01501
01502
01503
01504
01505
01506 demuxer->program_byte =
01507 mpeg3_absolute_to_program(demuxer, mpeg3io_tell(title->fs) +
01508 title->start_byte);
01509 return result;
01510 }
01511
01512
01513
01514
01515
01516 static int get_current_cell(mpeg3_demuxer_t *demuxer)
01517 {
01518 int got_it = 0;
01519 int result = 0;
01520
01521
01522 if(demuxer->reverse)
01523 {
01524 for(demuxer->current_title = demuxer->total_titles - 1;
01525 demuxer->current_title >= 0;
01526 demuxer->current_title--)
01527 {
01528 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
01529 for(demuxer->title_cell = title->cell_table_size - 1;
01530 demuxer->title_cell >= 0;
01531 demuxer->title_cell--)
01532 {
01533 mpeg3_cell_t *cell = &title->cell_table[demuxer->title_cell];
01534 if(cell->program_start < demuxer->program_byte &&
01535 cell->program == demuxer->current_program)
01536 {
01537 got_it = 1;
01538 if(demuxer->program_byte > cell->program_end)
01539 demuxer->program_byte = cell->program_end;
01540 break;
01541 }
01542 }
01543 if(got_it) break;
01544 }
01545
01546 if(!got_it)
01547 {
01548 demuxer->current_title = 0;
01549 demuxer->title_cell = 0;
01550 result = 1;
01551 }
01552 }
01553 else
01554 {
01555 for(demuxer->current_title = 0;
01556 demuxer->current_title < demuxer->total_titles;
01557 demuxer->current_title++)
01558 {
01559 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
01560 for(demuxer->title_cell = 0;
01561 demuxer->title_cell < title->cell_table_size;
01562 demuxer->title_cell++)
01563 {
01564 mpeg3_cell_t *cell = &title->cell_table[demuxer->title_cell];
01565 if(cell->program_end > demuxer->program_byte &&
01566 cell->program == demuxer->current_program)
01567 {
01568 got_it = 1;
01569 if(demuxer->program_byte < cell->program_start)
01570 demuxer->program_byte = cell->program_start;
01571 break;
01572 }
01573 }
01574 if(got_it) break;
01575 }
01576
01577 if(!got_it)
01578 {
01579 demuxer->current_title = demuxer->total_titles - 1;
01580 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
01581 demuxer->title_cell = title->cell_table_size - 1;
01582 result = 1;
01583 }
01584 }
01585
01586
01587
01588 return result;
01589 }
01590
01591
01592
01593
01594
01595 int mpeg3_seek_phys(mpeg3_demuxer_t *demuxer)
01596 {
01597 int result = 0;
01598
01599
01600
01601 if(demuxer->current_title < 0 ||
01602 demuxer->current_title >= demuxer->total_titles)
01603 {
01604 printf("mpeg3_seek_phys demuxer=%p read_all=%d do_audio=%d do_video=%d demuxer->current_title=%d\n",
01605 demuxer,
01606 demuxer->read_all,
01607 demuxer->do_audio,
01608 demuxer->do_video,
01609 demuxer->current_title);
01610 return 1;
01611 }
01612
01613 if(!demuxer->titles) return 1;
01614
01615 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
01616
01617
01618 if(!title->cell_table) return 1;
01619
01620 mpeg3_cell_t *cell = &title->cell_table[demuxer->title_cell];
01621
01622
01623
01624 if(demuxer->reverse)
01625 {
01626 if(demuxer->program_byte > cell->program_start &&
01627 demuxer->program_byte <= cell->program_end &&
01628 cell->program == demuxer->current_program)
01629 {
01630 goto do_phys_seek;
01631 }
01632 }
01633 else
01634 {
01635
01636
01637 if(demuxer->stream_end > 0 &&
01638 demuxer->program_byte >= demuxer->stream_end) return 1;
01639
01640
01641 if(demuxer->program_byte >= cell->program_start &&
01642 demuxer->program_byte < cell->program_end &&
01643 cell->program == demuxer->current_program)
01644 goto do_phys_seek;
01645 }
01646
01647
01648
01649
01650 int last_cell = demuxer->title_cell;
01651 int last_title = demuxer->current_title;
01652 int64_t last_byte = demuxer->program_byte;
01653 int got_it = 0;
01654
01655 result = get_current_cell(demuxer);
01656
01657 if(result) return 1;
01658
01659 if(demuxer->current_title != last_title)
01660 {
01661 mpeg3demux_open_title(demuxer, demuxer->current_title);
01662 }
01663
01664 title = demuxer->titles[demuxer->current_title];
01665 cell = &title->cell_table[demuxer->title_cell];
01666
01667
01668 do_phys_seek:
01669 mpeg3io_seek(title->fs,
01670 demuxer->program_byte - cell->program_start + cell->title_start);
01671
01672 return result;
01673 }
01674
01675
01676
01677
01678
01679
01680
01681 static int next_code(mpeg3_demuxer_t *demuxer,
01682 uint32_t code)
01683 {
01684 uint32_t result = 0;
01685 int error = 0;
01686 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
01687 mpeg3_fs_t *fd = title->fs;
01688
01689 while(result != code &&
01690 !error)
01691 {
01692 title = demuxer->titles[demuxer->current_title];
01693 result <<= 8;
01694 result |= (unsigned char)mpeg3io_read_char(title->fs);
01695 demuxer->program_byte++;
01696 error = mpeg3_seek_phys(demuxer);
01697 }
01698 return error;
01699 }
01700
01701
01702
01703
01704
01705
01706
01707
01708
01709
01710
01711 int mpeg3_read_next_packet(mpeg3_demuxer_t *demuxer)
01712 {
01713 if(demuxer->current_title < 0) return 1;
01714
01715 int result = 0;
01716 int current_position;
01717 mpeg3_t *file = demuxer->file;
01718 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
01719
01720
01721
01722 demuxer->data_size = 0;
01723 demuxer->data_position = 0;
01724 demuxer->audio_size = 0;
01725 demuxer->video_size = 0;
01726
01727
01728 if(demuxer->reverse)
01729 {
01730
01731 if(demuxer->program_byte < 0)
01732 {
01733 demuxer->program_byte = 0;
01734 result = mpeg3_seek_phys(demuxer);
01735
01736 result = 1;
01737 }
01738 else
01739
01740 if(file->packet_size > 0)
01741 {
01742 demuxer->program_byte += file->packet_size;
01743 result = mpeg3_seek_phys(demuxer);
01744 }
01745 else
01746 {
01747
01748 if(!result) result = next_code(demuxer,
01749 MPEG3_PACK_START_CODE);
01750
01751 if(!result) result = next_code(demuxer,
01752 MPEG3_PACK_START_CODE);
01753 }
01754
01755 demuxer->reverse = 0;
01756 }
01757
01758
01759
01760
01761
01762
01763
01764
01765
01766 if(!result)
01767 {
01768 do
01769 {
01770 title = demuxer->titles[demuxer->current_title];
01771
01772
01773 if(!result)
01774 {
01775 if(file->is_transport_stream)
01776 {
01777 result = mpeg3_seek_phys(demuxer);
01778 if(!result) result = read_transport(demuxer);
01779 }
01780 else
01781 if(file->is_program_stream)
01782 {
01783 result = mpeg3_seek_phys(demuxer);
01784 if(!result) result = mpeg3demux_read_program(demuxer);
01785 }
01786 else
01787 if(demuxer->read_all && file->is_audio_stream)
01788 {
01789
01790 result = mpeg3io_read_data(demuxer->audio_buffer,
01791 file->packet_size, title->fs);
01792 demuxer->audio_size = file->packet_size;
01793 demuxer->program_byte += file->packet_size;
01794 result |= mpeg3_seek_phys(demuxer);
01795 }
01796 else
01797 if(demuxer->read_all && file->is_video_stream)
01798 {
01799
01800 result = mpeg3io_read_data(demuxer->video_buffer,
01801 file->packet_size, title->fs);
01802 demuxer->video_size = file->packet_size;
01803 demuxer->program_byte += file->packet_size;
01804 result |= mpeg3_seek_phys(demuxer);
01805 }
01806 else
01807 {
01808 result = mpeg3io_read_data(demuxer->data_buffer,
01809 file->packet_size, title->fs);
01810 demuxer->data_size = file->packet_size;
01811 demuxer->program_byte += file->packet_size;
01812
01813 result |= mpeg3_seek_phys(demuxer);
01814
01815 }
01816 }
01817
01818
01819
01820
01821
01822 }while(!result &&
01823 demuxer->data_size == 0 &&
01824 (demuxer->do_audio || demuxer->do_video));
01825 }
01826
01827 return result;
01828 }
01829
01830
01831
01832
01833 static int prev_code(mpeg3_demuxer_t *demuxer,
01834 uint32_t code)
01835 {
01836 uint32_t result = 0;
01837 int error = 0;
01838 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
01839 mpeg3_fs_t *fd = title->fs;
01840
01841
01842 while(result != code &&
01843 demuxer->program_byte > 0 &&
01844 !error)
01845 {
01846 result >>= 8;
01847 title = demuxer->titles[demuxer->current_title];
01848 mpeg3io_seek(title->fs, demuxer->program_byte - title->start_byte - 1LL);
01849 result |= ((uint32_t)mpeg3io_read_char(title->fs)) << 24;
01850 demuxer->program_byte--;
01851 error = mpeg3_seek_phys(demuxer);
01852 }
01853 return error;
01854 }
01855
01856
01857
01858
01859
01860
01861 int mpeg3_read_prev_packet(mpeg3_demuxer_t *demuxer)
01862 {
01863 int result = 0;
01864 mpeg3_t *file = demuxer->file;
01865 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
01866
01867 demuxer->data_size = 0;
01868 demuxer->data_position = 0;
01869
01870
01871
01872
01873 if(!demuxer->reverse)
01874 {
01875 demuxer->reverse = 1;
01876
01877
01878 if(file->packet_size > 0)
01879 {
01880 demuxer->program_byte -= file->packet_size;
01881 result = mpeg3_seek_phys(demuxer);
01882 }
01883 else
01884
01885 {
01886 result = prev_code(demuxer,
01887 MPEG3_PACK_START_CODE);
01888 }
01889
01890 }
01891
01892
01893
01894
01895
01896
01897
01898
01899 do
01900 {
01901 title = demuxer->titles[demuxer->current_title];
01902
01903
01904 if(file->packet_size > 0)
01905 {
01906 printf("mpeg3_read_prev_packet 1 result=%d title=%d tell=%llx program_byte=%llx\n", result, demuxer->current_title, mpeg3io_tell(title->fs), demuxer->program_byte);
01907 demuxer->program_byte -= file->packet_size;
01908 result = mpeg3_seek_phys(demuxer);
01909 printf("mpeg3_read_prev_packet 100 result=%d title=%d tell=%llx program_byte=%llx\n", result, demuxer->current_title, mpeg3io_tell(title->fs), demuxer->program_byte);
01910 }
01911 else
01912 {
01913 if(!result) result = prev_code(demuxer,
01914 MPEG3_PACK_START_CODE);
01915 }
01916
01917
01918
01919
01920 title = demuxer->titles[demuxer->current_title];
01921 if(file->is_transport_stream && !result)
01922 {
01923 result = read_transport(demuxer);
01924
01925 if(demuxer->program_byte > 0)
01926 {
01927 demuxer->program_byte -= file->packet_size;
01928 result = mpeg3_seek_phys(demuxer);
01929 }
01930 }
01931 else
01932 if(file->is_program_stream && !result)
01933 {
01934 int64_t current_position = demuxer->program_byte;
01935
01936
01937 result = mpeg3demux_read_program(demuxer);
01938
01939
01940 while(demuxer->program_byte > current_position &&
01941 !result)
01942 {
01943 result = prev_code(demuxer,
01944 MPEG3_PACK_START_CODE);
01945 }
01946 }
01947 else
01948 if(!result)
01949 {
01950
01951
01952 result = mpeg3io_read_data(demuxer->data_buffer,
01953 file->packet_size,
01954 title->fs);
01955
01956 if(!result)
01957 {
01958 demuxer->data_size = file->packet_size;
01959 result = mpeg3io_seek(title->fs, demuxer->program_byte);
01960 }
01961 }
01962 }while(!result &&
01963 demuxer->data_size == 0 &&
01964 (demuxer->do_audio || demuxer->do_video));
01965
01966
01967 return result;
01968 }
01969
01970
01971
01972 int mpeg3demux_read_data(mpeg3_demuxer_t *demuxer,
01973 unsigned char *output,
01974 int size)
01975 {
01976 int result = 0;
01977 demuxer->error_flag = 0;
01978
01979
01980 if(demuxer->data_position >= 0)
01981 {
01982
01983 int i;
01984 for(i = 0; i < size && !result; )
01985 {
01986 int fragment_size = size - i;
01987 if(fragment_size > demuxer->data_size - demuxer->data_position)
01988 fragment_size = demuxer->data_size - demuxer->data_position;
01989 memcpy(output + i, demuxer->data_buffer + demuxer->data_position, fragment_size);
01990 demuxer->data_position += fragment_size;
01991 i += fragment_size;
01992
01993 if(i < size)
01994 {
01995 result = mpeg3_read_next_packet(demuxer);
01996 }
01997
01998
01999
02000
02001
02002
02003
02004 }
02005
02006 }
02007 else
02008 {
02009 int current_position;
02010
02011
02012
02013 current_position = demuxer->data_position;
02014 result = mpeg3_read_prev_packet(demuxer);
02015 if(!result) demuxer->data_position = demuxer->data_size + current_position;
02016 memcpy(output, demuxer->data_buffer + demuxer->data_position, size);
02017 demuxer->data_position += size;
02018 }
02019
02020
02021 demuxer->error_flag = result;
02022 return result;
02023 }
02024
02025 unsigned char mpeg3demux_read_char_packet(mpeg3_demuxer_t *demuxer)
02026 {
02027 demuxer->error_flag = 0;
02028 demuxer->next_char = -1;
02029
02030 if(demuxer->data_position >= demuxer->data_size)
02031 {
02032 demuxer->error_flag = mpeg3_read_next_packet(demuxer);
02033 }
02034
02035 if(!demuxer->error_flag)
02036 demuxer->next_char = demuxer->data_buffer[demuxer->data_position++];
02037
02038 return demuxer->next_char;
02039 }
02040
02041 unsigned char mpeg3demux_read_prev_char_packet(mpeg3_demuxer_t *demuxer)
02042 {
02043 demuxer->error_flag = 0;
02044 demuxer->data_position--;
02045 if(demuxer->data_position < 0)
02046 {
02047 demuxer->error_flag = mpeg3_read_prev_packet(demuxer);
02048 if(!demuxer->error_flag) demuxer->data_position = demuxer->data_size - 1;
02049 }
02050
02051 if(demuxer->data_position >= 0)
02052 {
02053 demuxer->next_char = demuxer->data_buffer[demuxer->data_position];
02054 }
02055 return demuxer->next_char;
02056 }
02057
02058
02059
02060 int mpeg3demux_open_title(mpeg3_demuxer_t *demuxer, int title_number)
02061 {
02062 mpeg3_title_t *title;
02063
02064 if(title_number < demuxer->total_titles &&
02065 title_number >= 0)
02066 {
02067 if(demuxer->current_title >= 0)
02068 {
02069 mpeg3io_close_file(demuxer->titles[demuxer->current_title]->fs);
02070 demuxer->current_title = -1;
02071 }
02072
02073 title = demuxer->titles[title_number];
02074
02075 if(mpeg3io_open_file(title->fs))
02076 {
02077 demuxer->error_flag = 1;
02078 fprintf(stderr, "mpeg3demux_open_title %s: %s", title->fs->path, strerror(errno));
02079 }
02080 else
02081 {
02082 demuxer->current_title = title_number;
02083 }
02084 }
02085 else
02086 {
02087 fprintf(stderr, "mpeg3demux_open_title title_number = %d\n",
02088 title_number);
02089 }
02090
02091
02092 return demuxer->error_flag;
02093 }
02094
02095 int mpeg3demux_copy_titles(mpeg3_demuxer_t *dst, mpeg3_demuxer_t *src)
02096 {
02097 int i;
02098 mpeg3_t *file = dst->file;
02099 mpeg3_title_t *dst_title, *src_title;
02100
02101 dst->total_titles = src->total_titles;
02102 dst->total_programs = src->total_programs;
02103
02104 for(i = 0; i < MPEG3_MAX_STREAMS; i++)
02105 {
02106 dst->astream_table[i] = src->astream_table[i];
02107 dst->vstream_table[i] = src->vstream_table[i];
02108 }
02109
02110 for(i = 0; i < src->total_titles; i++)
02111 {
02112 src_title = src->titles[i];
02113 dst_title = dst->titles[i] = mpeg3_new_title(file,
02114 src->titles[i]->fs->path);
02115 mpeg3_copy_title(dst_title, src_title);
02116 }
02117
02118 mpeg3demux_open_title(dst, src->current_title);
02119 dst->title_cell = 0;
02120 return 0;
02121 }
02122
02123
02124
02125
02126
02127 mpeg3_demuxer_t* mpeg3_new_demuxer(mpeg3_t *file, int do_audio, int do_video, int custom_id)
02128 {
02129 mpeg3_demuxer_t *demuxer = calloc(1, sizeof(mpeg3_demuxer_t));
02130 int i;
02131
02132
02133 demuxer->file = file;
02134 demuxer->do_audio = do_audio;
02135 demuxer->do_video = do_video;
02136
02137
02138 demuxer->raw_data = calloc(1, MPEG3_RAW_SIZE);
02139 demuxer->data_buffer = calloc(1, MPEG3_RAW_SIZE);
02140 demuxer->data_allocated = MPEG3_RAW_SIZE;
02141
02142 demuxer->audio_buffer = calloc(1, MPEG3_RAW_SIZE);
02143 demuxer->audio_allocated = MPEG3_RAW_SIZE;
02144
02145 demuxer->video_buffer = calloc(1, MPEG3_RAW_SIZE);
02146 demuxer->video_allocated = MPEG3_RAW_SIZE;
02147
02148
02149 demuxer->audio_pid = custom_id;
02150 demuxer->video_pid = custom_id;
02151 demuxer->astream = custom_id;
02152 demuxer->vstream = custom_id;
02153 demuxer->current_title = -1;
02154 demuxer->pes_audio_time = -1;
02155 demuxer->pes_video_time = -1;
02156
02157 demuxer->stream_end = -1;
02158
02159 return demuxer;
02160 }
02161
02162 int mpeg3_delete_demuxer(mpeg3_demuxer_t *demuxer)
02163 {
02164 int i;
02165
02166 if(demuxer->current_title >= 0)
02167 {
02168 mpeg3io_close_file(demuxer->titles[demuxer->current_title]->fs);
02169 }
02170
02171 for(i = 0; i < demuxer->total_titles; i++)
02172 {
02173 mpeg3_delete_title(demuxer->titles[i]);
02174 }
02175
02176 if(demuxer->data_buffer) free(demuxer->data_buffer);
02177 if(demuxer->raw_data) free(demuxer->raw_data);
02178 if(demuxer->audio_buffer) free(demuxer->audio_buffer);
02179 if(demuxer->video_buffer) free(demuxer->video_buffer);
02180 for(i = 0; i < demuxer->total_subtitles; i++)
02181 {
02182 mpeg3_delete_subtitle(demuxer->subtitles[i]);
02183 }
02184 if(demuxer->subtitles) free(demuxer->subtitles);
02185 free(demuxer);
02186 return 0;
02187 }
02188
02189
02190 int mpeg3demux_eof(mpeg3_demuxer_t *demuxer)
02191 {
02192 mpeg3_t *file = demuxer->file;
02193 if(file->seekable)
02194 {
02195 if(demuxer->current_title >= 0)
02196 {
02197 if(mpeg3io_eof(demuxer->titles[demuxer->current_title]->fs) &&
02198 demuxer->current_title >= demuxer->total_titles - 1)
02199 return 1;
02200 }
02201
02202
02203 if(demuxer->stream_end > 0 &&
02204 demuxer->program_byte >= demuxer->stream_end) return 1;
02205 }
02206 else
02207 {
02208 if(demuxer->data_position >= demuxer->data_size) return 1;
02209 }
02210
02211 return 0;
02212 }
02213
02214 int mpeg3demux_bof(mpeg3_demuxer_t *demuxer)
02215 {
02216 if(demuxer->current_title >= 0)
02217 {
02218 if(mpeg3io_bof(demuxer->titles[demuxer->current_title]->fs) &&
02219 demuxer->current_title <= 0)
02220 return 1;
02221 }
02222 return 0;
02223 }
02224
02225 void mpeg3demux_start_reverse(mpeg3_demuxer_t *demuxer)
02226 {
02227 demuxer->reverse = 1;
02228 }
02229
02230 void mpeg3demux_start_forward(mpeg3_demuxer_t *demuxer)
02231 {
02232 demuxer->reverse = 0;
02233 }
02234
02235
02236 int mpeg3demux_seek_byte(mpeg3_demuxer_t *demuxer, int64_t byte)
02237 {
02238 mpeg3_t *file = demuxer->file;
02239
02240
02241
02242
02243
02244
02245 demuxer->program_byte = byte;
02246 demuxer->data_position = 0;
02247 demuxer->data_size = 0;
02248
02249
02250 if(file->is_transport_stream &&
02251 file->packet_size)
02252 {
02253 demuxer->program_byte -= demuxer->program_byte % file->packet_size;
02254 }
02255
02256 int result = mpeg3_seek_phys(demuxer);
02257
02258
02259
02260
02261
02262 return result;
02263 }
02264
02265
02266 int mpeg3_finished_subtitles(mpeg3_demuxer_t *demuxer, int id)
02267 {
02268 int i;
02269 int total = 0;
02270 for(i = 0; i < demuxer->total_subtitles; i++)
02271 {
02272 if(demuxer->subtitles[i]->done &&
02273 (id < 0 ||
02274 demuxer->subtitles[i]->id == id)) total++;
02275 }
02276 return total;
02277 }
02278
02279
02280
02281
02282
02283
02284
02285 double mpeg3demux_get_time(mpeg3_demuxer_t *demuxer)
02286 {
02287 return demuxer->time;
02288 }
02289
02290 double mpeg3demux_audio_pts(mpeg3_demuxer_t *demuxer)
02291 {
02292 return demuxer->pes_audio_time;
02293 }
02294
02295 double mpeg3demux_video_pts(mpeg3_demuxer_t *demuxer)
02296 {
02297 return demuxer->pes_video_time;
02298 }
02299
02300 void mpeg3demux_reset_pts(mpeg3_demuxer_t *demuxer)
02301 {
02302 demuxer->pes_audio_time = -1;
02303 demuxer->pes_video_time = -1;
02304 }
02305
02306 double mpeg3demux_scan_pts(mpeg3_demuxer_t *demuxer)
02307 {
02308 int64_t start_position = mpeg3demux_tell_byte(demuxer);
02309 int64_t end_position = start_position + MPEG3_PTS_RANGE;
02310 int64_t current_position = start_position;
02311 int result = 0;
02312
02313 mpeg3demux_reset_pts(demuxer);
02314 while(!result &&
02315 current_position < end_position &&
02316 ((demuxer->do_audio && demuxer->pes_audio_time < 0) ||
02317 (demuxer->do_video && demuxer->pes_video_time < 0)))
02318 {
02319 result = mpeg3_read_next_packet(demuxer);
02320 current_position = mpeg3demux_tell_byte(demuxer);
02321 }
02322
02323
02324 mpeg3demux_seek_byte(demuxer, start_position);
02325
02326 if(demuxer->do_audio) return demuxer->pes_audio_time;
02327 if(demuxer->do_video) return demuxer->pes_video_time;
02328 }
02329
02330 int mpeg3demux_goto_pts(mpeg3_demuxer_t *demuxer, double pts)
02331 {
02332 int64_t start_position = mpeg3demux_tell_byte(demuxer);
02333 int64_t end_position = start_position + MPEG3_PTS_RANGE;
02334 int64_t current_position = start_position;
02335 int result = 0;
02336
02337
02338 mpeg3demux_reset_pts(demuxer);
02339 while(!result && current_position < end_position)
02340 {
02341 result = mpeg3_read_next_packet(demuxer);
02342 if(demuxer->pes_audio_time > pts) break;
02343 current_position = mpeg3demux_tell_byte(demuxer);
02344 }
02345
02346
02347 end_position = current_position - MPEG3_PTS_RANGE;
02348 mpeg3_read_prev_packet(demuxer);
02349 while(!result &&
02350 current_position > end_position)
02351 {
02352 result = mpeg3_read_prev_packet(demuxer);
02353 if(demuxer->pes_audio_time < pts) break;
02354 current_position = mpeg3demux_tell_byte(demuxer);
02355 }
02356 }
02357
02358
02359 int64_t mpeg3demux_tell_byte(mpeg3_demuxer_t *demuxer)
02360 {
02361 return demuxer->program_byte;
02362 }
02363
02364 int mpeg3demux_tell_program(mpeg3_demuxer_t *demuxer)
02365 {
02366 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
02367 if(!title->cell_table || !title->cell_table_size) return 0;
02368 mpeg3_cell_t *cell = &title->cell_table[demuxer->title_cell];
02369 return cell->program;
02370 }
02371
02372 int64_t mpeg3_absolute_to_program(mpeg3_demuxer_t *demuxer,
02373 int64_t byte)
02374 {
02375 int i, j;
02376
02377
02378
02379
02380 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
02381 mpeg3_cell_t *cell = &title->cell_table[demuxer->title_cell];
02382 return byte -
02383 cell->title_start -
02384 title->start_byte +
02385 cell->program_start;
02386 }
02387
02388 int64_t mpeg3demux_movie_size(mpeg3_demuxer_t *demuxer)
02389 {
02390 if(!demuxer->total_bytes)
02391 {
02392 int64_t result = 0;
02393 int i, j;
02394 for(i = 0; i < demuxer->total_titles; i++)
02395 {
02396 mpeg3_title_t *title = demuxer->titles[i];
02397 for(j = 0; j < title->cell_table_size; j++)
02398 {
02399 mpeg3_cell_t *cell = &title->cell_table[j];
02400 if(cell->program == demuxer->current_program)
02401 result += cell->program_end - cell->program_start;
02402 }
02403
02404 }
02405 demuxer->total_bytes = result;
02406 }
02407 return demuxer->total_bytes;
02408 }
02409
02410 int64_t mpeg3demuxer_title_bytes(mpeg3_demuxer_t *demuxer)
02411 {
02412 mpeg3_title_t *title = demuxer->titles[demuxer->current_title];
02413 return title->total_bytes;
02414 }
02415
02416 mpeg3_demuxer_t* mpeg3_get_demuxer(mpeg3_t *file)
02417 {
02418 if(file->is_program_stream || file->is_transport_stream)
02419 {
02420 if(file->total_astreams) return file->atrack[0]->demuxer;
02421 else
02422 if(file->total_vstreams) return file->vtrack[0]->demuxer;
02423 }
02424 return 0;
02425 }
02426
02427 void mpeg3demux_append_data(mpeg3_demuxer_t *demuxer,
02428 unsigned char *data,
02429 int bytes)
02430 {
02431 int new_data_size = demuxer->data_size + bytes;
02432 if(new_data_size >= demuxer->data_allocated)
02433 {
02434 demuxer->data_allocated = new_data_size * 2;
02435 demuxer->data_buffer = realloc(demuxer->data_buffer,
02436 demuxer->data_allocated);
02437 }
02438
02439 memcpy(demuxer->data_buffer + demuxer->data_size,
02440 data,
02441 bytes);
02442 demuxer->data_size += bytes;
02443 }
02444
02445 void mpeg3demux_shift_data(mpeg3_demuxer_t *demuxer,
02446 int bytes)
02447 {
02448 int i, j;
02449 for(i = 0, j = bytes; j < demuxer->data_size; i++, j++)
02450 {
02451 demuxer->data_buffer[i] = demuxer->data_buffer[j];
02452 }
02453 demuxer->data_size -= bytes;
02454 demuxer->data_position -= bytes;
02455 }
02456
02457
02458
02459
02460
02461