annotate libmpdemux/muxer_rawvideo.c @ 16805:50fb26acbcba

processing audio is sometimes essential for a/v sync, so 1000l to whoever made rawvideo muxer disable audio!! with this patch, audio is processed but simply thrown away by the muxer. various 'error' conditions in rawvideo muxer are removed to make it work. feel free to re-add them if they can be done without breaking anything, but do not use printf !!!! btw old behavior can be obtained by manually specifying -nosound.
author rfelker
date Wed, 19 Oct 2005 05:44:27 +0000
parents 70c446099f40
children 6ff3379a0862
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12016
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
1
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
2 #include <stdio.h>
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
3 #include <stdlib.h>
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
4 #include <string.h>
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
5 #include <inttypes.h>
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
6 #include <unistd.h>
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
7
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
8 #include "config.h"
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
9 #include "../version.h"
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
10
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
11 //#include "stream.h"
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
12 //#include "demuxer.h"
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
13 //#include "stheader.h"
13183
ca4c07c87e6f use correct headers
rathann
parents: 12016
diff changeset
14 #include "aviheader.h"
ca4c07c87e6f use correct headers
rathann
parents: 12016
diff changeset
15 #include "ms_hdr.h"
12016
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
16
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
17 #include "bswap.h"
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
18
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
19 #include "muxer.h"
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
20
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
21 static muxer_stream_t* rawvideofile_new_stream(muxer_t *muxer,int type){
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
22 muxer_stream_t* s;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
23 if (!muxer) return NULL;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
24 s=malloc(sizeof(muxer_stream_t));
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
25 memset(s,0,sizeof(muxer_stream_t));
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
26 if(!s) return NULL; // no mem!?
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
27 muxer->streams[muxer->avih.dwStreams]=s;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
28 s->type=type;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
29 s->id=muxer->avih.dwStreams;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
30 s->timer=0.0;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
31 s->size=0;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
32 s->muxer=muxer;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
33 switch(type){
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
34 case MUXER_TYPE_VIDEO:
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
35 s->ckid=mmioFOURCC(('0'+s->id/10),('0'+(s->id%10)),'d','c');
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
36 s->h.fccType=streamtypeVIDEO;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
37 if(!muxer->def_v) muxer->def_v=s;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
38 break;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
39 }
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
40 muxer->avih.dwStreams++;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
41 return s;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
42 }
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
43
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
44 static void write_rawvideo_chunk(FILE *f,int len,void* data){
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
45 if(len>0){
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
46 if(data){
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
47 // DATA
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
48 fwrite(data,len,1,f);
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
49 }
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
50 }
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
51 }
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
52
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
53 static void rawvideofile_write_chunk(muxer_stream_t *s,size_t len,unsigned int flags){
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
54 muxer_t *muxer=s->muxer;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
55
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
56 // write out the chunk:
16805
50fb26acbcba processing audio is sometimes essential for a/v sync, so 1000l to
rfelker
parents: 14753
diff changeset
57 if (s->type == MUXER_TYPE_VIDEO)
12016
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
58 write_rawvideo_chunk(muxer->file,len,s->buffer); /* unsigned char */
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
59
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
60 // alter counters:
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
61 if(s->h.dwSampleSize){
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
62 // CBR
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
63 s->h.dwLength+=len/s->h.dwSampleSize;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
64 if(len%s->h.dwSampleSize) printf("Warning! len isn't divisable by samplesize!\n");
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
65 } else {
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
66 // VBR
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
67 s->h.dwLength++;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
68 }
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
69 s->timer=(double)s->h.dwLength*s->h.dwScale/s->h.dwRate;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
70 s->size+=len;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
71 // if((unsigned int)len>s->h.dwSuggestedBufferSize) s->h.dwSuggestedBufferSize=len;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
72
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
73 }
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
74
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
75 static void rawvideofile_write_header(muxer_t *muxer){
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
76 return;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
77 }
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
78
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
79 static void rawvideofile_write_index(muxer_t *muxer){
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
80 return;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
81 }
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
82
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 13183
diff changeset
83 int muxer_init_muxer_rawvideo(muxer_t *muxer){
12016
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
84 muxer->cont_new_stream = &rawvideofile_new_stream;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
85 muxer->cont_write_chunk = &rawvideofile_write_chunk;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
86 muxer->cont_write_header = &rawvideofile_write_header;
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
87 muxer->cont_write_index = &rawvideofile_write_index;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 13183
diff changeset
88 return 1;
12016
b962aaad2940 rawvideo muxer patch by John Earl <jwe21@cam.ac.uk>
ranma
parents:
diff changeset
89 }