long time;
int64_t trackDuration;
long sampleCount;
- long sampleDuration;
long sampleSize;
int hasKeyframes;
int hasBframes;
static int mov_write_audio_tag(ByteIOContext *pb, MOVTrack* track)
{
offset_t pos = url_ftell(pb);
- int vbr= track->mode == MODE_MOV &&
- (track->enc->codec_id == CODEC_ID_AAC ||
- track->enc->codec_id == CODEC_ID_MP3 ||
- track->enc->codec_id == CODEC_ID_AMR_NB);
- int version = vbr ||
- track->enc->codec_id == CODEC_ID_PCM_S32LE ||
- track->enc->codec_id == CODEC_ID_PCM_S24LE;
+ int version = track->mode == MODE_MOV &&
+ (track->audio_vbr ||
+ track->enc->codec_id == CODEC_ID_PCM_S32LE ||
+ track->enc->codec_id == CODEC_ID_PCM_S24LE);
put_be32(pb, 0); /* size */
put_le32(pb, track->tag); // store it byteswapped
/* FIXME 8 bit for 'raw ' in mov */
put_be16(pb, 16); /* Reserved */
- put_be16(pb, vbr ? 0xfffe : 0); /* compression ID */
+ put_be16(pb, track->mode == MODE_MOV && track->audio_vbr ? -2 : 0); /* compression ID */
put_be16(pb, 0); /* packet size (= 0) */
put_be16(pb, track->timescale); /* Time scale */
put_be16(pb, 0); /* Reserved */
if(version == 1) { /* SoundDescription V1 extended info */
- if (vbr)
- track->sampleSize = 0;
put_be32(pb, track->enc->frame_size); /* Samples per packet */
put_be32(pb, track->sampleSize / track->enc->channels); /* Bytes per packet */
put_be32(pb, track->sampleSize); /* Bytes per frame */
return updateSize(pb, pos);
}
+static int utf8len(uint8_t *b){
+ int len=0;
+ int val;
+ while(*b){
+ GET_UTF8(val, *b++, return -1;)
+ len++;
+ }
+ return len;
+}
-static size_t ascii_to_wc (ByteIOContext *pb, char *b, size_t n)
+static int ascii_to_wc (ByteIOContext *pb, uint8_t *b)
{
- size_t i;
- unsigned char c;
- for (i = 0; i < n - 1; i++) {
- c = b[i];
- if (! (0x20 <= c && c <= 0x7f ))
- c = 0x3f; /* '?' */
- put_be16(pb, c);
+ int val;
+ while(*b){
+ GET_UTF8(val, *b++, return -1;)
+ put_be16(pb, val);
}
put_be16(pb, 0x00);
- return 2*n;
+ return 0;
}
static uint16_t language_code (const char *str)
size += 12;
// Encoder
- len = strlen(LIBAVCODEC_IDENT)+1;
+ len = utf8len(LIBAVCODEC_IDENT)+1;
+ if(len<=0)
+ goto not_utf8;
put_be16(pb, len*2+10); /* size */
put_be32(pb, 0x04); /* type */
put_be16(pb, language_code("eng")); /* language */
put_be16(pb, 0x01); /* ? */
- ascii_to_wc(pb, LIBAVCODEC_IDENT, len);
+ ascii_to_wc(pb, LIBAVCODEC_IDENT);
size += len*2+10;
// Title
- len = strlen(s->title)+1;
+ len = utf8len(s->title)+1;
+ if(len<=0)
+ goto not_utf8;
put_be16(pb, len*2+10); /* size */
put_be32(pb, 0x01); /* type */
put_be16(pb, language_code("eng")); /* language */
put_be16(pb, 0x01); /* ? */
- ascii_to_wc (pb, s->title, len);
+ ascii_to_wc (pb, s->title);
size += len*2+10;
// Date
// snprintf(dt,32,"%04d/%02d/%02d %02d:%02d:%02d",t_st->tm_year+1900,t_st->tm_mon+1,t_st->tm_mday,t_st->tm_hour,t_st->tm_min,t_st->tm_sec);
- len = strlen("2006/04/01 11:11:11")+1;
+ len = utf8len("2006/04/01 11:11:11")+1;
+ if(len<=0)
+ goto not_utf8;
put_be16(pb, len*2+10); /* size */
put_be32(pb, 0x03); /* type */
put_be16(pb, language_code("und")); /* language */
put_be16(pb, 0x01); /* ? */
- ascii_to_wc (pb, "2006/04/01 11:11:11", len);
+ ascii_to_wc (pb, "2006/04/01 11:11:11");
size += len*2+10;
// size
}
return size;
+not_utf8:
+ av_log(s, AV_LOG_ERROR, "not utf8\n");
+ return -1;
}
static int mov_write_moov_tag(ByteIOContext *pb, MOVContext *mov,
if (mov->mode == MODE_PSP)
mov_write_uuidusmt_tag(pb, s);
else
- mov_write_udta_tag(pb, mov, s);
+ mov_write_udta_tag(pb, mov, s);
return updateSize(pb, pos);
}
if(st->codec->codec_type == CODEC_TYPE_VIDEO){
track->tag = mov_find_video_codec_tag(s, track);
track->timescale = st->codec->time_base.den;
- track->sampleDuration = st->codec->time_base.num;
av_set_pts_info(st, 64, 1, st->codec->time_base.den);
}else if(st->codec->codec_type == CODEC_TYPE_AUDIO){
track->tag = mov_find_audio_codec_tag(s, track);
track->timescale = st->codec->sample_rate;
- track->sampleDuration = st->codec->frame_size;
av_set_pts_info(st, 64, 1, st->codec->sample_rate);
switch(track->enc->codec_id){
case CODEC_ID_MP3:
default:
track->sampleSize = (av_get_bits_per_sample(st->codec->codec_id) >> 3) * st->codec->channels;
}
- }
- if (!track->sampleDuration) {
- av_log(s, AV_LOG_ERROR, "track %d: sample duration is not set\n", i);
- return -1;
+ if (!st->codec->frame_size) {
+ av_log(s, AV_LOG_ERROR, "track %d: codec frame size is not set\n", i);
+ return -1;
+ }
}
}