@ -3722,6 +3722,33 @@ static void mov_write_uuidprof_tag(AVIOContext *pb, AVFormatContext *s)
avio_wb32 ( pb , 0x010001 ) ; /* ? */
}
static int mov_write_identification ( AVIOContext * pb , AVFormatContext * s )
{
MOVMuxContext * mov = s - > priv_data ;
int i ;
mov_write_ftyp_tag ( pb , s ) ;
if ( mov - > mode = = MODE_PSP ) {
int video_streams_nb = 0 , audio_streams_nb = 0 , other_streams_nb = 0 ;
for ( i = 0 ; i < s - > nb_streams ; i + + ) {
AVStream * st = s - > streams [ i ] ;
if ( st - > codec - > codec_type = = AVMEDIA_TYPE_VIDEO )
video_streams_nb + + ;
else if ( st - > codec - > codec_type = = AVMEDIA_TYPE_AUDIO )
audio_streams_nb + + ;
else
other_streams_nb + + ;
}
if ( video_streams_nb ! = 1 | | audio_streams_nb ! = 1 | | other_streams_nb ) {
av_log ( s , AV_LOG_ERROR , " PSP mode need one video and one audio stream \n " ) ;
return AVERROR ( EINVAL ) ;
}
mov_write_uuidprof_tag ( pb , s ) ;
}
return 0 ;
}
static int mov_parse_mpeg2_frame ( AVPacket * pkt , uint32_t * flags )
{
uint32_t c = - 1 ;
@ -4590,25 +4617,8 @@ static int mov_write_header(AVFormatContext *s)
return AVERROR ( EINVAL ) ;
}
mov_write_ftyp_tag ( pb , s ) ;
if ( mov - > mode = = MODE_PSP ) {
int video_streams_nb = 0 , audio_streams_nb = 0 , other_streams_nb = 0 ;
for ( i = 0 ; i < s - > nb_streams ; i + + ) {
AVStream * st = s - > streams [ i ] ;
if ( st - > codec - > codec_type = = AVMEDIA_TYPE_VIDEO )
video_streams_nb + + ;
else if ( st - > codec - > codec_type = = AVMEDIA_TYPE_AUDIO )
audio_streams_nb + + ;
else
other_streams_nb + + ;
}
if ( video_streams_nb ! = 1 | | audio_streams_nb ! = 1 | | other_streams_nb ) {
av_log ( s , AV_LOG_ERROR , " PSP mode need one video and one audio stream \n " ) ;
return AVERROR ( EINVAL ) ;
}
mov_write_uuidprof_tag ( pb , s ) ;
}
if ( ( ret = mov_write_identification ( pb , s ) ) < 0 )
return ret ;
mov - > nb_streams = s - > nb_streams ;
if ( mov - > mode & ( MODE_MP4 | MODE_MOV | MODE_IPOD ) & & s - > nb_chapters )