Mercurial > mplayer.hg
comparison libmpdemux/muxer_mpeg.c @ 11223:b677b25a898d
update by Andriy N. Gritsenko <andrej@lucky.net>
author | alex |
---|---|
date | Wed, 22 Oct 2003 17:07:17 +0000 |
parents | 12fc55eb3373 |
children | 0db4a3a5b01d |
comparison
equal
deleted
inserted
replaced
11222:b82e3ecb11e0 | 11223:b677b25a898d |
---|---|
4 #include <string.h> | 4 #include <string.h> |
5 #include <sys/types.h> | 5 #include <sys/types.h> |
6 | 6 |
7 #include "config.h" | 7 #include "config.h" |
8 #include "../version.h" | 8 #include "../version.h" |
9 #include "../mp_msg.h" | |
9 | 10 |
10 #include "wine/mmreg.h" | 11 #include "wine/mmreg.h" |
11 #include "wine/avifmt.h" | 12 #include "wine/avifmt.h" |
12 #include "wine/vfw.h" | 13 #include "wine/vfw.h" |
13 #include "bswap.h" | 14 #include "bswap.h" |
58 memset(s,0,sizeof(muxer_stream_t)); | 59 memset(s,0,sizeof(muxer_stream_t)); |
59 if(!s) return NULL; // no mem!? | 60 if(!s) return NULL; // no mem!? |
60 if (!(s->b_buffer = malloc (MUXER_MPEG_BLOCKSIZE))) { | 61 if (!(s->b_buffer = malloc (MUXER_MPEG_BLOCKSIZE))) { |
61 free (s); | 62 free (s); |
62 return NULL; // no mem?! | 63 return NULL; // no mem?! |
63 } else if (type == MUXER_TYPE_VIDEO) { | |
64 s->ckid = be2me_32 (0x1e0 + muxer->num_videos); | |
65 muxer->num_videos++; | |
66 s->h.fccType=streamtypeVIDEO; | |
67 if(!muxer->def_v) muxer->def_v=s; | |
68 // printf ("Added video stream %d\n", muxer->num_videos); | |
69 } else { // MUXER_TYPE_AUDIO | |
70 s->ckid = be2me_32 (0x1c0 + s->id - muxer->num_videos); | |
71 s->h.fccType=streamtypeAUDIO; | |
72 // printf ("Added audio stream %d\n", s->id - muxer->num_videos + 1); | |
73 } | 64 } |
74 muxer->streams[muxer->avih.dwStreams]=s; | 65 muxer->streams[muxer->avih.dwStreams]=s; |
75 s->type=type; | 66 s->type=type; |
76 s->id=muxer->avih.dwStreams; | 67 s->id=muxer->avih.dwStreams; |
77 s->timer=0.0; | 68 s->timer=0.0; |
78 s->size=0; | 69 s->size=0; |
79 s->muxer=muxer; | 70 s->muxer=muxer; |
71 if (type == MUXER_TYPE_VIDEO) { | |
72 s->ckid = be2me_32 (0x1e0 + muxer->num_videos); | |
73 muxer->num_videos++; | |
74 s->h.fccType=streamtypeVIDEO; | |
75 if(!muxer->def_v) muxer->def_v=s; | |
76 mp_msg (MSGT_MUXER, MSGL_DBG2, "Added video stream %d, ckid=%X\n", muxer->num_videos, s->ckid); | |
77 } else { // MUXER_TYPE_AUDIO | |
78 s->ckid = be2me_32 (0x1c0 + s->id - muxer->num_videos); | |
79 s->h.fccType=streamtypeAUDIO; | |
80 mp_msg (MSGT_MUXER, MSGL_DBG2, "Added audio stream %d, ckid=%X\n", s->id - muxer->num_videos + 1, s->ckid); | |
81 } | |
80 muxer->avih.dwStreams++; | 82 muxer->avih.dwStreams++; |
81 return s; | 83 return s; |
82 } | 84 } |
83 | 85 |
84 static void write_mpeg_ts(unsigned char *b, unsigned int ts, char mod) { | 86 static void write_mpeg_ts(unsigned char *b, unsigned int ts, char mod) { |
117 size_t sz; // rest in block buffer | 119 size_t sz; // rest in block buffer |
118 unsigned char buff[12]; // 0x1ba header | 120 unsigned char buff[12]; // 0x1ba header |
119 unsigned int mints=0; | 121 unsigned int mints=0; |
120 uint16_t l1; | 122 uint16_t l1; |
121 | 123 |
124 mp_dbg(MSGT_MUXER, MSGL_DBG3, " MPEG block: size=%u, scr=%u, rate=%u, id=%X;", len, muxer->file_end, muxer->sysrate, s->ckid); | |
122 if (s->b_buffer_ptr == 0) { // 00001111 if no PTS | 125 if (s->b_buffer_ptr == 0) { // 00001111 if no PTS |
123 s->b_buffer[0] = 0xf; | 126 s->b_buffer[0] = 0xf; |
124 s->b_buffer_ptr = 1; | 127 s->b_buffer_ptr = 1; |
125 sz = MUXER_MPEG_DATASIZE-1; | 128 sz = MUXER_MPEG_DATASIZE-1; |
126 } else if (s->b_buffer_ptr > MUXER_MPEG_DATASIZE) { | 129 } else if (s->b_buffer_ptr > MUXER_MPEG_DATASIZE) { |
236 dts /= 2; // calculate average time | 239 dts /= 2; // calculate average time |
237 printf ("Warning: DTS to SCR delay is too small\n"); | 240 printf ("Warning: DTS to SCR delay is too small\n"); |
238 } | 241 } |
239 else | 242 else |
240 dts -= nts/2; // one frame :) | 243 dts -= nts/2; // one frame :) |
244 mp_dbg(MSGT_MUXER, MSGL_DBG3, ", dts=%u", dts); | |
241 write_mpeg_ts (s->b_buffer+7, dts, 0x10); | 245 write_mpeg_ts (s->b_buffer+7, dts, 0x10); |
242 } | 246 } |
243 | 247 |
244 static void mpegfile_write_chunk(muxer_stream_t *s,size_t len,unsigned int flags){ | 248 static void mpegfile_write_chunk(muxer_stream_t *s,size_t len,unsigned int flags){ |
245 size_t ptr=0, sz; | 249 size_t ptr=0, sz; |
314 if (len < 2*MUXER_MPEG_DATASIZE) | 318 if (len < 2*MUXER_MPEG_DATASIZE) |
315 sz = 2*MUXER_MPEG_DATASIZE; // min requirement | 319 sz = 2*MUXER_MPEG_DATASIZE; // min requirement |
316 else | 320 else |
317 sz = len; | 321 sz = len; |
318 } | 322 } |
323 mp_dbg(MSGT_MUXER, MSGL_DBG3, "\nMPEG chunk: size=%u, pts=%f", len, s->timer); | |
319 set_mpeg_pts (muxer, s, pts); | 324 set_mpeg_pts (muxer, s, pts); |
320 // alter counters: | 325 // alter counters: |
321 if (s->h.dwSampleSize) { | 326 if (s->h.dwSampleSize) { |
322 // CBR | 327 // CBR |
323 s->h.dwLength += len/s->h.dwSampleSize; | 328 s->h.dwLength += len/s->h.dwSampleSize; |
359 s->b_buffer_ptr = 12; | 364 s->b_buffer_ptr = 12; |
360 } | 365 } |
361 memcpy (s->b_buffer+s->b_buffer_ptr, s->buffer+ptr, len); | 366 memcpy (s->b_buffer+s->b_buffer_ptr, s->buffer+ptr, len); |
362 s->b_buffer_ptr += len; | 367 s->b_buffer_ptr += len; |
363 } | 368 } |
369 mp_dbg(MSGT_MUXER, MSGL_DBG3, " next pts=%f\n", s->timer); | |
364 } | 370 } |
365 | 371 |
366 static void mpegfile_write_header(muxer_t *muxer){ | 372 static void mpegfile_write_header(muxer_t *muxer){ |
367 unsigned int i; | 373 unsigned int i; |
368 size_t sz = MUXER_MPEG_BLOCKSIZE-24; | 374 size_t sz = MUXER_MPEG_BLOCKSIZE-24; |