[Ffmpeg-cvslog] CVS: ffmpeg/libavformat movenc.c, 1.52, 1.53 mov.c, 1.116, 1.117 mov.h, 1.1, 1.2
Michael Niedermayer CVS
michael
Thu Feb 23 00:46:22 CET 2006
Update of /cvsroot/ffmpeg/ffmpeg/libavformat
In directory mail:/var2/tmp/cvs-serv31475
Modified Files:
movenc.c mov.c mov.h
Log Message:
CTTS support patch by (Baptiste COUDURIER <baptiste.coudurier smartjog com>)
Index: movenc.c
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavformat/movenc.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- movenc.c 11 Feb 2006 18:27:57 -0000 1.52
+++ movenc.c 22 Feb 2006 23:46:20 -0000 1.53
@@ -41,6 +41,7 @@
unsigned int samplesInChunk;
char key_frame;
unsigned int entries;
+ int64_t cts;
} MOVIentry;
typedef struct MOVIndex {
@@ -54,6 +55,7 @@
long sampleCount;
long sampleDuration;
int hasKeyframes;
+ int hasBframes;
int language;
int trackID;
AVCodecContext *enc;
@@ -542,6 +544,41 @@
return updateSize(pb, pos);
}
+static int mov_write_ctts_tag(ByteIOContext *pb, MOVTrack* track)
+{
+ Time2Sample *ctts_entries;
+ uint32_t entries = 0;
+ uint32_t atom_size;
+ int i;
+
+ ctts_entries = av_malloc((track->entry + 1) * sizeof(*ctts_entries)); /* worst case */
+ ctts_entries[0].count = 1;
+ ctts_entries[0].duration = track->cluster[0][0].cts;
+ for (i=1; i<track->entry; i++) {
+ int cl = i / MOV_INDEX_CLUSTER_SIZE;
+ int id = i % MOV_INDEX_CLUSTER_SIZE;
+ if (track->cluster[cl][id].cts == ctts_entries[entries].duration) {
+ ctts_entries[entries].count++; /* compress */
+ } else {
+ entries++;
+ ctts_entries[entries].duration = track->cluster[cl][id].cts;
+ ctts_entries[entries].count = 1;
+ }
+ }
+ entries++; /* last one */
+ atom_size = 16 + (entries * 8);
+ put_be32(pb, atom_size); /* size */
+ put_tag(pb, "ctts");
+ put_be32(pb, 0); /* version & flags */
+ put_be32(pb, entries); /* entry count */
+ for (i=0; i<entries; i++) {
+ put_be32(pb, ctts_entries[i].count);
+ put_be32(pb, ctts_entries[i].duration);
+ }
+ av_free(ctts_entries);
+ return atom_size;
+}
+
/* TODO: */
/* Time to sample atom */
static int mov_write_stts_tag(ByteIOContext *pb, MOVTrack* track)
@@ -580,6 +617,9 @@
if (track->enc->codec_type == CODEC_TYPE_VIDEO &&
track->hasKeyframes)
mov_write_stss_tag(pb, track);
+ if (track->enc->codec_type == CODEC_TYPE_VIDEO &&
+ track->hasBframes)
+ mov_write_ctts_tag(pb, track);
mov_write_stsc_tag(pb, track);
mov_write_stsz_tag(pb, track);
mov_write_stco_tag(pb, track);
@@ -1352,7 +1392,8 @@
for(i=0; i<s->nb_streams; i++){
AVCodecContext *c= s->streams[i]->codec;
- if (c->codec_type == CODEC_TYPE_VIDEO){
+ if(c->codec_type == CODEC_TYPE_VIDEO){
+ av_set_pts_info(s->streams[i], 64, 1, c->time_base.den);
if (!codec_get_tag(codec_movvideo_tags, c->codec_id)){
if(!codec_get_tag(codec_bmp_tags, c->codec_id))
return -1;
@@ -1360,6 +1401,7 @@
av_log(s, AV_LOG_INFO, "Warning, using MS style video codec tag, the file may be unplayable!\n");
}
}else if(c->codec_type == CODEC_TYPE_AUDIO){
+ av_set_pts_info(s->streams[i], 64, 1, c->sample_rate);
if (!codec_get_tag(codec_movaudio_tags, c->codec_id)){
if(!codec_get_tag(codec_wav_tags, c->codec_id))
return -1;
@@ -1472,6 +1514,9 @@
trk->cluster[cl][id].size = size;
trk->cluster[cl][id].entries = samplesInChunk;
if(enc->codec_type == CODEC_TYPE_VIDEO) {
+ if (pkt->dts != pkt->pts)
+ trk->hasBframes = 1;
+ trk->cluster[cl][id].cts = pkt->pts - pkt->dts;
trk->cluster[cl][id].key_frame = !!(pkt->flags & PKT_FLAG_KEY);
if(trk->cluster[cl][id].key_frame)
trk->hasKeyframes = 1;
Index: mov.c
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavformat/mov.c,v
retrieving revision 1.116
retrieving revision 1.117
diff -u -d -r1.116 -r1.117
--- mov.c 19 Feb 2006 20:00:00 -0000 1.116
+++ mov.c 22 Feb 2006 23:46:20 -0000 1.117
@@ -283,11 +283,6 @@
struct MOVParseTableEntry;
-typedef struct Time2Sample{
- int count;
- int duration;
-}Time2Sample;
-
typedef struct MOVStreamContext {
int ffindex; /* the ffmpeg stream id */
int is_ff_stream; /* Is this stream presented to ffmpeg ? i.e. is this an audio or video stream ? */
Index: mov.h
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavformat/mov.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- mov.h 11 Feb 2006 18:27:57 -0000 1.1
+++ mov.h 22 Feb 2006 23:46:20 -0000 1.2
@@ -4,4 +4,9 @@
/* mov.c */
extern const CodecTag ff_mov_obj_type[];
+typedef struct Time2Sample{
+ int count;
+ int duration;
+}Time2Sample;
+
#endif /* FFMPEG_MOV_H */
More information about the ffmpeg-cvslog
mailing list