Changeset 25444

Show
Ignore:
Timestamp:
05/10/08 21:07:01 (5 days ago)
Author:
dlmcpaul
Message:
fix issue 1779 - crash on mov with audio
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • haiku/trunk/src/add-ons/media/plugins/mov_reader/libMOV/MOVFileReader.cpp

    r18488 r25444  
    440440} 
    441441 
    442 const   AudioMetaData           *MOVFileReader::AudioFormat(uint32 stream_index, size_t *size
     442const   AudioMetaData           *MOVFileReader::AudioFormat(uint32 stream_index
    443443{ 
    444444        if (IsAudio(stream_index)) { 
  • haiku/trunk/src/add-ons/media/plugins/mov_reader/libMOV/MOVFileReader.h

    r13811 r25444  
    114114         
    115115        // Return all Audio Meta Data 
    116         const   AudioMetaData           *AudioFormat(uint32 stream_index, size_t *size = 0); 
     116        const   AudioMetaData           *AudioFormat(uint32 stream_index); 
    117117        // Return all Video Meta Data 
    118118        const   VideoMetaData           *VideoFormat(uint32 stream_index); 
  • haiku/trunk/src/add-ons/media/plugins/mov_reader/mov_reader.cpp

    r24471 r25444  
    253253                        format->u.raw_audio.buffer_size = stream_header->suggested_buffer_size; 
    254254                } else { 
     255                 
    255256                        description.family = B_QUICKTIME_FORMAT_FAMILY; 
    256257                        description.u.quicktime.codec = audio_format->compression; 
     
    279280                                        format->u.encoded_audio.output.channel_count = audio_format->NoOfChannels; 
    280281                                        break; 
     282                                case AUDIO_IMA4: 
     283                                 
    281284                                default: 
    282285                                        TRACE("OTHER\n"); 
     
    288291                } 
    289292 
    290 /*              if (audio_format->compression == 0x0001) { 
    291                         // a raw PCM format 
    292                         description.family = B_BEOS_FORMAT_FAMILY; 
    293                         description.u.beos.format = B_BEOS_FORMAT_RAW_AUDIO; 
    294                         if (B_OK != formats.GetFormatFor(description, format))  
    295                                 format->type = B_MEDIA_RAW_AUDIO; 
    296                         format->u.raw_audio.frame_rate = audio_format->SampleRate; 
    297                         format->u.raw_audio.channel_count = audio_format->NoOfChannels; 
    298                         if (audio_format->bits_per_sample <= 8) 
    299                                 format->u.raw_audio.format = B_AUDIO_FORMAT_UINT8; 
    300                         else if (audio_format->bits_per_sample <= 16) 
    301                                 format->u.raw_audio.format = B_AUDIO_FORMAT_INT16; 
    302                         else if (audio_format->bits_per_sample <= 24) 
    303                                 format->u.raw_audio.format = B_AUDIO_FORMAT_INT24; 
    304                         else if (audio_format->bits_per_sample <= 32) 
    305                                 format->u.raw_audio.format = B_AUDIO_FORMAT_INT32; 
    306                         else { 
    307                                 ERROR("movReader::AllocateCookie: unhandled bits per sample %d\n", audio_format->bits_per_sample); 
    308                                 return B_ERROR; 
    309                         } 
    310                         format->u.raw_audio.format |= B_AUDIO_FORMAT_CHANNEL_ORDER_WAVE; 
    311                         format->u.raw_audio.byte_order = B_MEDIA_BIG_ENDIAN; 
    312                         format->u.raw_audio.buffer_size = stream_header->suggested_buffer_size; 
    313                 } else { 
    314                         // some encoded format 
    315                         description.family = B_WAV_FORMAT_FAMILY; 
    316                         description.u.wav.codec = audio_format->compression; 
    317                         if (B_OK != formats.GetFormatFor(description, format))  
    318                                 format->type = B_MEDIA_ENCODED_AUDIO; 
    319                         format->u.encoded_audio.bit_rate = 8 * audio_format->PacketSize; 
    320                         TRACE("bit_rate %.3f\n", format->u.encoded_audio.bit_rate); 
    321                         format->u.encoded_audio.output.frame_rate = audio_format->SampleRate; 
    322                         format->u.encoded_audio.output.channel_count = audio_format->NoOfChannels; 
    323                 } 
    324                 */ 
    325293                // this doesn't seem to work (it's not even a fourcc) 
    326294                format->user_data_type = B_CODEC_TYPE_INFO; 
    327295                *(uint32 *)format->user_data = audio_format->compression; format->user_data[4] = 0; 
    328296                 
    329                 // put the Audio struct, including extra data, into the format meta data. 
    330                 size_t size; 
    331                 const void *data = theFileReader->AudioFormat(cookie->stream, &size); 
    332                 format->SetMetaData(data, size); 
     297                // Some codecs have additional setup data that they need, put it in metadata 
     298                size_t size = audio_format->VOLSize; 
     299                const void *data = audio_format->theVOL; 
     300                if (size > 0) { 
     301                        format->SetMetaData(data, size); 
     302                } 
    333303 
    334304#ifdef TRACE_MOV_READER 
     
    383353                format->user_data_type = B_CODEC_TYPE_INFO; 
    384354                *(uint32 *)format->user_data = description.u.quicktime.codec; format->user_data[4] = 0; 
     355                 
    385356                format->u.encoded_video.max_bit_rate = 8 * theFileReader->MovMainHeader()->max_bytes_per_sec; 
    386357                format->u.encoded_video.avg_bit_rate = format->u.encoded_video.max_bit_rate / 2; // XXX fix this 
     
    392363                format->u.encoded_video.output.pixel_width_aspect = 1; 
    393364                format->u.encoded_video.output.pixel_height_aspect = 1; 
    394                 // format->u.encoded_video.output.display.format = 0; 
    395365                format->u.encoded_video.output.display.line_width = theFileReader->MovMainHeader()->width; 
    396366                format->u.encoded_video.output.display.line_count = cookie->line_count; 
     
    403373                TRACE("field_rate   %.3f\n", format->u.encoded_video.output.field_rate); 
    404374 
    405                 // Set the VOL 
    406                 if (video_format->VOLSize > 0) { 
    407                        TRACE("VOL SIZE  %ld\n", video_format->VOLSize)
    408                        size_t size = video_format->VOLSize; 
    409                         const void *data = video_format->theVOL
     375                // Some decoders need additional metadata passed via a special Atom 
     376                size_t size = video_format->VOLSize; 
     377                const void *data = video_format->theVOL
     378                if (size > 0) { 
     379                        TRACE("VOL SIZE  %ld\n", size)
    410380                        format->SetMetaData(data, size); 
    411381                } 
     
    440410        *duration = cookie->duration; 
    441411        *format = cookie->format; 
    442         *infoBuffer = 0; 
    443         *infoSize = 0; 
     412         
     413        // Copy metadata to infoBuffer 
     414        if (theFileReader->IsVideo(cookie->stream)) { 
     415                const VideoMetaData *video_format = theFileReader->VideoFormat(cookie->stream); 
     416                *infoBuffer = video_format->theVOL; 
     417                *infoSize = video_format->VOLSize; 
     418        } else { 
     419                const AudioMetaData *audio_format = theFileReader->AudioFormat(cookie->stream); 
     420                *infoBuffer = audio_format->theVOL; 
     421                *infoSize = audio_format->VOLSize; 
     422        } 
     423 
    444424        return B_OK; 
    445425}