Changeset e5fe2b341fad70233788ceb83533c8d1a5a91d87
- Timestamp:
- 29/08/03 03:11:43
(5 years ago)
- Author:
- Laurent Aimar <fenrir@videolan.org>
- git-committer:
- Laurent Aimar <fenrir@videolan.org> 1062119503 +0000
- git-parent:
[6c7682e327bb10893077397ab545c9f96dc8c221]
- git-author:
- Laurent Aimar <fenrir@videolan.org> 1062119503 +0000
- Message:
- asf: added stream infos object and fix a bug in packetization.
-> it seems that WMP plays it without problem :))) (tested with DIV3+mp3)
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r92a149b |
re5fe2b3 |
|
| 3 | 3 | ***************************************************************************** |
|---|
| 4 | 4 | * Copyright (C) 2003 VideoLAN |
|---|
| 5 | | * $Id: asf.c,v 1.5 2003/08/26 23:14:11 fenrir Exp $ |
|---|
| | 5 | * $Id: asf.c,v 1.6 2003/08/29 01:11:43 fenrir Exp $ |
|---|
| 6 | 6 | * |
|---|
| 7 | 7 | * Authors: Laurent Aimar <fenrir@via.ecp.fr> |
|---|
| … | … | |
| 65 | 65 | typedef struct |
|---|
| 66 | 66 | { |
|---|
| 67 | | int i_id; |
|---|
| 68 | | int i_cat; |
|---|
| 69 | | int i_sequence; |
|---|
| 70 | | |
|---|
| 71 | | int i_extra; |
|---|
| 72 | | uint8_t *p_extra; |
|---|
| | 67 | int i_id; |
|---|
| | 68 | int i_cat; |
|---|
| | 69 | |
|---|
| | 70 | /* codec informations */ |
|---|
| | 71 | uint16_t i_tag; /* for audio */ |
|---|
| | 72 | vlc_fourcc_t i_fourcc; /* for video */ |
|---|
| | 73 | char *psz_name; /* codec name */ |
|---|
| | 74 | |
|---|
| | 75 | int i_sequence; |
|---|
| | 76 | |
|---|
| | 77 | int i_extra; |
|---|
| | 78 | uint8_t *p_extra; |
|---|
| 73 | 79 | } asf_track_t; |
|---|
| 74 | 80 | |
|---|
| … | … | |
| 117 | 123 | static void bo_add_mem ( bo_t *, uint8_t *, int ); |
|---|
| 118 | 124 | |
|---|
| | 125 | static void bo_addle_str16( bo_t *, char * ); |
|---|
| 119 | 126 | |
|---|
| 120 | 127 | /***************************************************************************** |
|---|
| … | … | |
| 238 | 245 | case AUDIO_ES: |
|---|
| 239 | 246 | { |
|---|
| 240 | | uint16_t i_tag; |
|---|
| 241 | 247 | int i_blockalign = p_input->p_fmt->i_block_align; |
|---|
| 242 | 248 | int i_bitspersample = 0; |
|---|
| … | … | |
| 246 | 252 | { |
|---|
| 247 | 253 | case VLC_FOURCC( 'a', '5', '2', ' ' ): |
|---|
| 248 | | i_tag = WAVE_FORMAT_A52; |
|---|
| | 254 | tk->i_tag = WAVE_FORMAT_A52; |
|---|
| | 255 | tk->psz_name = "A/52"; |
|---|
| 249 | 256 | break; |
|---|
| 250 | 257 | case VLC_FOURCC( 'm', 'p', 'g', 'a' ): |
|---|
| 251 | 258 | #if 1 |
|---|
| 252 | | i_tag = WAVE_FORMAT_MPEGLAYER3; |
|---|
| | 259 | tk->psz_name = "MPEG Audio Layer 3"; |
|---|
| | 260 | tk->i_tag = WAVE_FORMAT_MPEGLAYER3; |
|---|
| 253 | 261 | i_blockalign = 1; |
|---|
| 254 | 262 | i_extra = 12; |
|---|
| 255 | 263 | break; |
|---|
| 256 | 264 | #else |
|---|
| 257 | | i_tag = WAVE_FORMAT_MPEG; |
|---|
| | 265 | tk->psz_name = "MPEG Audio Layer 1/2"; |
|---|
| | 266 | tk->i_tag = WAVE_FORMAT_MPEG; |
|---|
| 258 | 267 | i_blockalign = 1; |
|---|
| 259 | 268 | i_extra = 22; |
|---|
| … | … | |
| 261 | 270 | #endif |
|---|
| 262 | 271 | case VLC_FOURCC( 'w', 'm', 'a', '1' ): |
|---|
| 263 | | i_tag = WAVE_FORMAT_WMA1; |
|---|
| | 272 | tk->psz_name = "Windows Media Audio 1"; |
|---|
| | 273 | tk->i_tag = WAVE_FORMAT_WMA1; |
|---|
| 264 | 274 | break; |
|---|
| 265 | 275 | case VLC_FOURCC( 'w', 'm', 'a', '2' ): |
|---|
| 266 | | i_tag = WAVE_FORMAT_WMA2; |
|---|
| | 276 | tk->psz_name = "Windows Media Audio 2"; |
|---|
| | 277 | tk->i_tag = WAVE_FORMAT_WMA2; |
|---|
| 267 | 278 | break; |
|---|
| 268 | 279 | case VLC_FOURCC( 'w', 'm', 'a', '3' ): |
|---|
| 269 | | i_tag = WAVE_FORMAT_WMA3; |
|---|
| | 280 | tk->psz_name = "Windows Media Audio 3"; |
|---|
| | 281 | tk->i_tag = WAVE_FORMAT_WMA3; |
|---|
| 270 | 282 | break; |
|---|
| 271 | 283 | /* raw codec */ |
|---|
| 272 | 284 | case VLC_FOURCC( 'u', '8', ' ', ' ' ): |
|---|
| 273 | | i_tag = WAVE_FORMAT_PCM; |
|---|
| | 285 | tk->psz_name = "Raw audio 8bits"; |
|---|
| | 286 | tk->i_tag = WAVE_FORMAT_PCM; |
|---|
| 274 | 287 | i_blockalign= p_input->p_fmt->i_channels; |
|---|
| 275 | 288 | i_bitspersample = 8; |
|---|
| 276 | 289 | break; |
|---|
| 277 | 290 | case VLC_FOURCC( 's', '1', '6', 'l' ): |
|---|
| 278 | | i_tag = WAVE_FORMAT_PCM; |
|---|
| | 291 | tk->psz_name = "Raw audio 16bits"; |
|---|
| | 292 | tk->i_tag = WAVE_FORMAT_PCM; |
|---|
| 279 | 293 | i_blockalign= 2 * p_input->p_fmt->i_channels; |
|---|
| 280 | 294 | i_bitspersample = 16; |
|---|
| 281 | 295 | break; |
|---|
| 282 | 296 | case VLC_FOURCC( 's', '2', '4', 'l' ): |
|---|
| 283 | | i_tag = WAVE_FORMAT_PCM; |
|---|
| | 297 | tk->psz_name = "Raw audio 24bits"; |
|---|
| | 298 | tk->i_tag = WAVE_FORMAT_PCM; |
|---|
| 284 | 299 | i_blockalign= 3 * p_input->p_fmt->i_channels; |
|---|
| 285 | 300 | i_bitspersample = 24; |
|---|
| 286 | 301 | break; |
|---|
| 287 | 302 | case VLC_FOURCC( 's', '3', '2', 'l' ): |
|---|
| 288 | | i_tag = WAVE_FORMAT_PCM; |
|---|
| | 303 | tk->psz_name = "Raw audio 32bits"; |
|---|
| | 304 | tk->i_tag = WAVE_FORMAT_PCM; |
|---|
| 289 | 305 | i_blockalign= 4 * p_input->p_fmt->i_channels; |
|---|
| 290 | 306 | i_bitspersample = 32; |
|---|
| … | … | |
| 294 | 310 | } |
|---|
| 295 | 311 | |
|---|
| | 312 | |
|---|
| 296 | 313 | tk->i_extra = sizeof( WAVEFORMATEX ) + |
|---|
| 297 | 314 | p_input->p_fmt->i_extra_data + i_extra; |
|---|
| 298 | 315 | tk->p_extra = malloc( tk->i_extra ); |
|---|
| 299 | 316 | bo_init( &bo, tk->p_extra, tk->i_extra ); |
|---|
| 300 | | bo_addle_u16( &bo, i_tag ); |
|---|
| | 317 | bo_addle_u16( &bo, tk->i_tag ); |
|---|
| 301 | 318 | bo_addle_u16( &bo, p_input->p_fmt->i_channels ); |
|---|
| 302 | 319 | bo_addle_u32( &bo, p_input->p_fmt->i_sample_rate ); |
|---|
| … | … | |
| 313 | 330 | { |
|---|
| 314 | 331 | bo_addle_u16( &bo, i_extra ); |
|---|
| 315 | | if( i_tag == WAVE_FORMAT_MPEGLAYER3 ) |
|---|
| | 332 | if( tk->i_tag == WAVE_FORMAT_MPEGLAYER3 ) |
|---|
| 316 | 333 | { |
|---|
| 317 | 334 | msg_Dbg( p_mux, "adding mp3 header" ); |
|---|
| … | … | |
| 322 | 339 | bo_addle_u16( &bo, 1393 ); /* nCodecDelay */ |
|---|
| 323 | 340 | } |
|---|
| 324 | | else if( i_tag == WAVE_FORMAT_MPEG ) |
|---|
| | 341 | else if( tk->i_tag == WAVE_FORMAT_MPEG ) |
|---|
| 325 | 342 | { |
|---|
| 326 | 343 | msg_Dbg( p_mux, "adding mp2 header" ); |
|---|
| … | … | |
| 365 | 382 | if( p_input->p_fmt->i_fourcc == VLC_FOURCC('m','p','4','v') ) |
|---|
| 366 | 383 | { |
|---|
| 367 | | bo_add_mem( &bo, "MP4S", 4 ); |
|---|
| | 384 | tk->psz_name = "MPEG-4 Video"; |
|---|
| | 385 | tk->i_fourcc = VLC_FOURCC( 'M', 'P', '4', 'S' ); |
|---|
| 368 | 386 | } |
|---|
| 369 | 387 | else if( p_input->p_fmt->i_fourcc == VLC_FOURCC('D','I','V','3') ) |
|---|
| 370 | 388 | { |
|---|
| 371 | | bo_add_mem( &bo, "MP43", 4 ); |
|---|
| | 389 | tk->psz_name = "MSMPEG-4 V3 Video"; |
|---|
| | 390 | tk->i_fourcc = VLC_FOURCC( 'M', 'P', '4', '3' ); |
|---|
| 372 | 391 | } |
|---|
| 373 | 392 | else if( p_input->p_fmt->i_fourcc == VLC_FOURCC('D','I','V','2') ) |
|---|
| 374 | 393 | { |
|---|
| 375 | | bo_add_mem( &bo, "MP42", 4 ); |
|---|
| | 394 | tk->psz_name = "MSMPEG-4 V2 Video"; |
|---|
| | 395 | tk->i_fourcc = VLC_FOURCC( 'M', 'P', '4', '2' ); |
|---|
| 376 | 396 | } |
|---|
| 377 | 397 | else if( p_input->p_fmt->i_fourcc == VLC_FOURCC('D','I','V','1') ) |
|---|
| 378 | 398 | { |
|---|
| 379 | | bo_add_mem( &bo, "MPG4", 4 ); |
|---|
| | 399 | tk->psz_name = "MSMPEG-4 V1 Video"; |
|---|
| | 400 | tk->i_fourcc = VLC_FOURCC( 'M', 'P', 'G', '4' ); |
|---|
| | 401 | } |
|---|
| | 402 | else if( p_input->p_fmt->i_fourcc == VLC_FOURCC('W','M','V','1') ) |
|---|
| | 403 | { |
|---|
| | 404 | tk->psz_name = "Windows Media Video 1"; |
|---|
| | 405 | tk->i_fourcc = VLC_FOURCC( 'W', 'M', 'V', '1' ); |
|---|
| | 406 | } |
|---|
| | 407 | else if( p_input->p_fmt->i_fourcc == VLC_FOURCC('W','M','V','2') ) |
|---|
| | 408 | { |
|---|
| | 409 | tk->psz_name = "Windows Media Video 2"; |
|---|
| | 410 | tk->i_fourcc = VLC_FOURCC( 'W', 'M', 'V', '2' ); |
|---|
| 380 | 411 | } |
|---|
| 381 | 412 | else |
|---|
| 382 | 413 | { |
|---|
| 383 | | bo_add_mem( &bo, (uint8_t*)&p_input->p_fmt->i_fourcc, 4 ); |
|---|
| 384 | | } |
|---|
| | 414 | tk->psz_name = "Unknow Video"; |
|---|
| | 415 | tk->i_fourcc = p_input->p_fmt->i_fourcc; |
|---|
| | 416 | } |
|---|
| | 417 | bo_add_mem( &bo, (uint8_t*)&tk->i_fourcc, 4 ); |
|---|
| 385 | 418 | bo_addle_u32( &bo, 0 ); |
|---|
| 386 | 419 | bo_addle_u32( &bo, 0 ); |
|---|
| … | … | |
| 568 | 601 | } |
|---|
| 569 | 602 | |
|---|
| | 603 | static void bo_addle_str16( bo_t *bo, char *str ) |
|---|
| | 604 | { |
|---|
| | 605 | bo_addle_u16( bo, strlen( str ) + 1 ); |
|---|
| | 606 | for( ;; ) |
|---|
| | 607 | { |
|---|
| | 608 | uint16_t c; |
|---|
| | 609 | |
|---|
| | 610 | c = (uint8_t)*str++; |
|---|
| | 611 | bo_addle_u16( bo, c ); |
|---|
| | 612 | if( c == '\0' ) |
|---|
| | 613 | { |
|---|
| | 614 | break; |
|---|
| | 615 | } |
|---|
| | 616 | } |
|---|
| | 617 | } |
|---|
| | 618 | |
|---|
| 570 | 619 | /**************************************************************************** |
|---|
| 571 | 620 | * guid |
|---|
| … | … | |
| 659 | 708 | { 0x8E, 0xE6,0x00, 0xC0, 0x0C ,0x20, 0x53, 0x65 } |
|---|
| 660 | 709 | }; |
|---|
| | 710 | static const guid_t asf_object_comment_guid = |
|---|
| | 711 | { |
|---|
| | 712 | 0x86D15240, |
|---|
| | 713 | 0x311D, |
|---|
| | 714 | 0x11D0, |
|---|
| | 715 | { 0xA3, 0xA4, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 } |
|---|
| | 716 | }; |
|---|
| | 717 | static const guid_t asf_object_comment_reserved_guid = |
|---|
| | 718 | { |
|---|
| | 719 | 0x86D15241, |
|---|
| | 720 | 0x311D, |
|---|
| | 721 | 0x11D0, |
|---|
| | 722 | { 0xA3, 0xA4, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 } |
|---|
| | 723 | }; |
|---|
| 661 | 724 | |
|---|
| 662 | 725 | static void asf_chunk_add( bo_t *bo, |
|---|
| … | … | |
| 678 | 741 | mtime_t i_duration = 0; |
|---|
| 679 | 742 | int i_size; |
|---|
| | 743 | int i_ci_size; |
|---|
| 680 | 744 | sout_buffer_t *out; |
|---|
| 681 | 745 | bo_t bo; |
|---|
| … | … | |
| 693 | 757 | /* calculate header size */ |
|---|
| 694 | 758 | i_size = 30 + 104 + 46; |
|---|
| | 759 | i_ci_size = 44; |
|---|
| 695 | 760 | for( i = 1; i < p_sys->i_track; i++ ) |
|---|
| 696 | 761 | { |
|---|
| 697 | 762 | i_size += 78 + p_sys->track[i].i_extra; |
|---|
| 698 | | } |
|---|
| | 763 | i_ci_size += 8 + 2 * strlen( p_sys->track[i].psz_name ); |
|---|
| | 764 | if( p_sys->track[i].i_cat == AUDIO_ES ) |
|---|
| | 765 | { |
|---|
| | 766 | i_ci_size += 4; |
|---|
| | 767 | } |
|---|
| | 768 | else if( p_sys->track[i].i_cat == VIDEO_ES ) |
|---|
| | 769 | { |
|---|
| | 770 | i_ci_size += 6; |
|---|
| | 771 | } |
|---|
| | 772 | } |
|---|
| | 773 | |
|---|
| | 774 | i_size += i_ci_size; |
|---|
| 699 | 775 | |
|---|
| 700 | 776 | if( p_sys->b_asf_http ) |
|---|
| … | … | |
| 766 | 842 | } |
|---|
| 767 | 843 | |
|---|
| | 844 | /* Codec Infos */ |
|---|
| | 845 | bo_add_guid ( &bo, &asf_object_comment_guid ); |
|---|
| | 846 | bo_addle_u64( &bo, i_ci_size ); |
|---|
| | 847 | bo_add_guid ( &bo, &asf_object_comment_reserved_guid ); |
|---|
| | 848 | bo_addle_u32( &bo, p_sys->i_track - 1 ); |
|---|
| | 849 | for( i = 1; i < p_sys->i_track; i++ ) |
|---|
| | 850 | { |
|---|
| | 851 | tk = &p_sys->track[i]; |
|---|
| | 852 | |
|---|
| | 853 | bo_addle_u16( &bo, tk->i_id ); |
|---|
| | 854 | bo_addle_str16( &bo, tk->psz_name ); |
|---|
| | 855 | bo_addle_u16( &bo, 0 ); |
|---|
| | 856 | if( tk->i_cat == AUDIO_ES ) |
|---|
| | 857 | { |
|---|
| | 858 | bo_addle_u16( &bo, 2 ); |
|---|
| | 859 | bo_addle_u16( &bo, tk->i_tag ); |
|---|
| | 860 | } |
|---|
| | 861 | else if( tk->i_cat == VIDEO_ES ) |
|---|
| | 862 | { |
|---|
| | 863 | bo_addle_u16( &bo, 4 ); |
|---|
| | 864 | bo_add_mem ( &bo, (uint8_t*)&tk->i_fourcc, 4 ); |
|---|
| | 865 | |
|---|
| | 866 | } |
|---|
| | 867 | } |
|---|
| | 868 | |
|---|
| 768 | 869 | /* data object */ |
|---|
| 769 | 870 | bo_add_guid ( &bo, &asf_object_data_guid ); |
|---|
| … | … | |
| 825 | 926 | p_sys->i_pk_frame++; |
|---|
| 826 | 927 | |
|---|
| 827 | | if( p_sys->i_pk_used + 14 >= p_sys->i_packet_size ) |
|---|
| | 928 | if( p_sys->i_pk_used + 17 >= p_sys->i_packet_size ) |
|---|
| 828 | 929 | { |
|---|
| 829 | 930 | /* not enough data for another payload, flush the packet */ |
|---|