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;