comparison libmpdemux/demux_real.c @ 6369:63984a4cbbb6

export extra data for cook codec, some debug stuff
author arpi
date Mon, 10 Jun 2002 02:27:31 +0000
parents ecb9d82d1b64
children b2d5aeb72f95
comparison
equal deleted inserted replaced
6368:9511fffdb8c6 6369:63984a4cbbb6
6 Based on FFmpeg's libav/rm.c. 6 Based on FFmpeg's libav/rm.c.
7 7
8 TODO: fix the whole syncing mechanism 8 TODO: fix the whole syncing mechanism
9 9
10 $Log$ 10 $Log$
11 Revision 1.14 2002/06/10 02:27:31 arpi
12 export extra data for cook codec, some debug stuff
13
11 Revision 1.13 2002/06/09 01:07:22 arpi 14 Revision 1.13 2002/06/09 01:07:22 arpi
12 - multiple audio/video stream support fixed 15 - multiple audio/video stream support fixed
13 - aid/vid autodetection (asf style - use id of first packet received) 16 - aid/vid autodetection (asf style - use id of first packet received)
14 - rv20 sub-packets support 17 - rv20 sub-packets support
15 - exporting codec id and sub-id to the codec, in bitmapinfoheader 18 - exporting codec id and sub-id to the codec, in bitmapinfoheader
62 65
63 #include "stream.h" 66 #include "stream.h"
64 #include "demuxer.h" 67 #include "demuxer.h"
65 #include "stheader.h" 68 #include "stheader.h"
66 #include "bswap.h" 69 #include "bswap.h"
70
71 //#define mp_dbg(mod,lev, args... ) mp_msg_c((mod<<8)|lev, ## args )
67 72
68 #define MKTAG(a, b, c, d) (a | (b << 8) | (c << 16) | (d << 24)) 73 #define MKTAG(a, b, c, d) (a | (b << 8) | (c << 16) | (d << 24))
69 74
70 #define MAX_STREAMS 32 75 #define MAX_STREAMS 32
71 76
436 441
437 /* if DNET, swap bytes! */ 442 /* if DNET, swap bytes! */
438 if (sh_audio != NULL) { 443 if (sh_audio != NULL) {
439 dp = new_demux_packet(len); 444 dp = new_demux_packet(len);
440 stream_read(demuxer->stream, dp->buffer, len); 445 stream_read(demuxer->stream, dp->buffer, len);
446 fprintf(stderr,"audio block len=%d\n",len);
441 if (sh_audio->format == 0x2000) 447 if (sh_audio->format == 0x2000)
442 { 448 {
443 char *ptr = dp->buffer; 449 char *ptr = dp->buffer;
444 450
445 for (i = 0; i < len; i += 2) 451 for (i = 0; i < len; i += 2)
448 ptr[0] = ptr[1]; 454 ptr[0] = ptr[1];
449 ptr[1] = tmp; 455 ptr[1] = tmp;
450 ptr += 2; 456 ptr += 2;
451 } 457 }
452 } 458 }
453 dp->pts = timestamp/90000.0f; 459 dp->pts = timestamp/1000.0f;
454 dp->pos = demuxer->filepos; 460 dp->pos = demuxer->filepos;
455 dp->flags = (flags & 0x2) ? 0x10 : 0; 461 dp->flags = (flags & 0x2) ? 0x10 : 0;
456 ds_add_packet(ds, dp); 462 ds_add_packet(ds, dp);
457 } 463 } else
458 if (sh_video != NULL) { 464 if (sh_video != NULL) {
459 if (sh_video->format==0x30335652 || 465 if (sh_video->format==0x30335652 ||
460 sh_video->format==0x30325652 ) { 466 sh_video->format==0x30325652 ) {
461 // we need a more complicated demuxing 467 // we need a more complicated demuxing
462 // a block may contain multiple packets 468 // a block may contain multiple packets
528 if(ds->asf_packet){ 534 if(ds->asf_packet){
529 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "we have an incomplete packet (oldseq=%d new=%d)\n",ds->asf_seq,vpkg_seqnum); 535 mp_dbg(MSGT_DEMUX,MSGL_DBG2, "we have an incomplete packet (oldseq=%d new=%d)\n",ds->asf_seq,vpkg_seqnum);
530 // we have an incomplete packet: 536 // we have an incomplete packet:
531 if(ds->asf_seq!=vpkg_seqnum){ 537 if(ds->asf_seq!=vpkg_seqnum){
532 // this fragment is for new packet, close the old one 538 // this fragment is for new packet, close the old one
539 mp_msg(MSGT_DEMUX,MSGL_DBG2, "closing probably incomplete packet, len: %d \n",ds->asf_packet->len);
533 ds_add_packet(ds,ds->asf_packet); 540 ds_add_packet(ds,ds->asf_packet);
534 ds->asf_packet=NULL; 541 ds->asf_packet=NULL;
535 } else { 542 } else {
536 // append data to it! 543 // append data to it!
537 demux_packet_t* dp=ds->asf_packet; 544 demux_packet_t* dp=ds->asf_packet;
762 codec_data_size = stream_read_dword(demuxer->stream); 769 codec_data_size = stream_read_dword(demuxer->stream);
763 codec_pos = stream_tell(demuxer->stream); 770 codec_pos = stream_tell(demuxer->stream);
764 771
765 tmp = stream_read_dword(demuxer->stream); 772 tmp = stream_read_dword(demuxer->stream);
766 773
774 //#define stream_skip(st,siz) { int i; for(i=0;i<siz;i++) mp_msg(MSGT_DEMUX,MSGL_V," %02X",stream_read_char(st)); mp_msg(MSGT_DEMUX,MSGL_V,"\n");}
775
767 if (tmp == MKTAG(0xfd, 'a', 'r', '.')) 776 if (tmp == MKTAG(0xfd, 'a', 'r', '.'))
768 { 777 {
769 /* audio header */ 778 /* audio header */
770 sh_audio_t *sh = new_sh_audio(demuxer, stream_id); 779 sh_audio_t *sh = new_sh_audio(demuxer, stream_id);
771 char buf[128]; /* for codec name */ 780 char buf[128]; /* for codec name */
772 int frame_size; 781 int frame_size;
773 int version; 782 int version;
783 int flavor;
774 784
775 mp_msg(MSGT_DEMUX,MSGL_V,"Found audio stream!\n"); 785 mp_msg(MSGT_DEMUX,MSGL_V,"Found audio stream!\n");
776 version = stream_read_word(demuxer->stream); 786 version = stream_read_word(demuxer->stream);
777 mp_msg(MSGT_DEMUX,MSGL_V,"version: %d\n", version); 787 mp_msg(MSGT_DEMUX,MSGL_V,"version: %d\n", version);
778 // stream_skip(demuxer->stream, 2); /* version (4 or 5) */ 788 // stream_skip(demuxer->stream, 2); /* version (4 or 5) */
779 stream_skip(demuxer->stream, 2); 789 stream_skip(demuxer->stream, 2);
780 stream_skip(demuxer->stream, 4); /* .ra4 or .ra5 */ 790 stream_skip(demuxer->stream, 4); /* .ra4 or .ra5 */
781 stream_skip(demuxer->stream, 4); 791 stream_skip(demuxer->stream, 4);
782 stream_skip(demuxer->stream, 2); /* version (4 or 5) */ 792 stream_skip(demuxer->stream, 2); /* version (4 or 5) */
783 stream_skip(demuxer->stream, 4); /* header size */ 793 stream_skip(demuxer->stream, 4); /* header size */
784 stream_skip(demuxer->stream, 2); /* add codec info */ 794 flavor = stream_read_word(demuxer->stream);/* codec flavor id */
785 stream_skip(demuxer->stream, 4); /* coded frame size */ 795 stream_skip(demuxer->stream, 4); /* coded frame size */
786 stream_skip(demuxer->stream, 4); 796 stream_skip(demuxer->stream, 4); // big number
787 stream_skip(demuxer->stream, 4); 797 stream_skip(demuxer->stream, 4); // bigger number
788 stream_skip(demuxer->stream, 4); 798 stream_skip(demuxer->stream, 4); // 2
789 stream_skip(demuxer->stream, 2); /* 1 */ 799 stream_skip(demuxer->stream, 2); // 10
790 // stream_skip(demuxer->stream, 2); /* coded frame size */ 800 // stream_skip(demuxer->stream, 2); /* coded frame size */
791 frame_size = stream_read_word(demuxer->stream); 801 frame_size = stream_read_word(demuxer->stream);
792 mp_msg(MSGT_DEMUX,MSGL_V,"frame_size: %d\n", frame_size); 802 mp_msg(MSGT_DEMUX,MSGL_V,"frame_size: %d\n", frame_size);
793 stream_skip(demuxer->stream, 4); 803 stream_skip(demuxer->stream, 4); // 60,0
794 804
795 if (version == 5) 805 if (version == 5)
796 stream_skip(demuxer->stream, 6); 806 stream_skip(demuxer->stream, 6); //0,srate,0
797 807
798 sh->samplerate = stream_read_word(demuxer->stream); 808 sh->samplerate = stream_read_word(demuxer->stream);
799 stream_skip(demuxer->stream, 4); 809 stream_skip(demuxer->stream, 2); // 0
810 sh->samplesize = stream_read_word(demuxer->stream)/8;
800 sh->channels = stream_read_word(demuxer->stream); 811 sh->channels = stream_read_word(demuxer->stream);
801 mp_msg(MSGT_DEMUX,MSGL_V,"samplerate: %d, channels: %d\n", 812 mp_msg(MSGT_DEMUX,MSGL_V,"samplerate: %d, channels: %d\n",
802 sh->samplerate, sh->channels); 813 sh->samplerate, sh->channels);
803 814
804 if (version == 5) 815 if (version == 5)
805 { 816 {
806 stream_skip(demuxer->stream, 4); 817 stream_skip(demuxer->stream, 4); // "genr"
807 stream_read(demuxer->stream, buf, 4); 818 stream_read(demuxer->stream, buf, 4); // fourcc
808 buf[4] = 0; 819 buf[4] = 0;
809 } 820 }
810 else 821 else
811 { 822 {
812 /* Desc #1 */ 823 /* Desc #1 */
817 828
818 /* Emulate WAVEFORMATEX struct: */ 829 /* Emulate WAVEFORMATEX struct: */
819 sh->wf = malloc(sizeof(WAVEFORMATEX)); 830 sh->wf = malloc(sizeof(WAVEFORMATEX));
820 memset(sh->wf, 0, sizeof(WAVEFORMATEX)); 831 memset(sh->wf, 0, sizeof(WAVEFORMATEX));
821 sh->wf->nChannels = sh->channels; 832 sh->wf->nChannels = sh->channels;
822 sh->wf->wBitsPerSample = 16; 833 sh->wf->wBitsPerSample = sh->samplesize*8;
823 sh->wf->nSamplesPerSec = sh->samplerate; 834 sh->wf->nSamplesPerSec = sh->samplerate;
824 sh->wf->nAvgBytesPerSec = bitrate; 835 sh->wf->nAvgBytesPerSec = bitrate;
825 sh->wf->nBlockAlign = frame_size; 836 sh->wf->nBlockAlign = frame_size;
826 sh->wf->cbSize = 0; 837 sh->wf->cbSize = 0;
827 838
852 // sh->wf[sizeof(WAVEFORMATEX)+3] = 1; 863 // sh->wf[sizeof(WAVEFORMATEX)+3] = 1;
853 // sh->wf[sizeof(WAVEFORMATEX)+4] = 0; 864 // sh->wf[sizeof(WAVEFORMATEX)+4] = 0;
854 break; 865 break;
855 case MKTAG('c', 'o', 'o', 'k'): 866 case MKTAG('c', 'o', 'o', 'k'):
856 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Real's GeneralCooker (?) (RealAudio G2?) (unsupported)\n"); 867 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Real's GeneralCooker (?) (RealAudio G2?) (unsupported)\n");
857 tmp = 0; 868 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+2+24);
869 *((short*)(sh->wf+1))=flavor;
870 stream_read(demuxer->stream, ((char*)(sh->wf+1))+2, 24); // extras
871 // tmp = 0;
858 break; 872 break;
859 case MKTAG('a', 't', 'r', 'c'): 873 case MKTAG('a', 't', 'r', 'c'):
860 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Sony ATRAC3 (RealAudio 8) (unsupported)\n"); 874 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: Sony ATRAC3 (RealAudio 8) (unsupported)\n");
861 sh->format = 0x270; 875 sh->format = 0x270;
862 876
892 // priv->current_aid = stream_id; 906 // priv->current_aid = stream_id;
893 } 907 }
894 else 908 else
895 free(sh->wf); 909 free(sh->wf);
896 // break; 910 // break;
911
912 #undef stream_skip
913
897 } 914 }
898 else 915 else
899 // case MKTAG('V', 'I', 'D', 'O'): 916 // case MKTAG('V', 'I', 'D', 'O'):
900 { 917 {
901 /* video header */ 918 /* video header */