Mercurial > mplayer.hg
annotate libmpdemux/demux_rawdv.c @ 9009:f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
2) Put this code in a separated function: sub_pp_ssa
3) After recoding added a call to sub_pp_ssa. To be more acqurate: I
added a pointer to function to hold a postprocessing function to be
invoked after using iconv. There are one pointer for each format, if
this pointer isn.t NULL the post processing function is called.
patch by Salvador Eduardo Tropea <salvador@inti.gov.ar>
help by <hephooey@fastmail.fm>
author | arpi |
---|---|
date | Sun, 19 Jan 2003 00:54:55 +0000 |
parents | 7cd6450b3a2a |
children | 369a77dea470 |
rev | line source |
---|---|
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
1 /* |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
2 raw dv file parser for MPlayer |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
3 by Alexander Neundorf <neundorf@kde.org> |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
4 based on the fli demuxer |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
5 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
6 LGPL |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
7 */ |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
8 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
9 #include <stdio.h> |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
10 #include <stdlib.h> |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
11 #include <unistd.h> |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
12 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
13 #include "config.h" |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
14 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
15 #ifdef HAVE_LIBDV095 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
16 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
17 #include "mp_msg.h" |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
18 #include "help_mp.h" |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
19 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
20 #include "stream.h" |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
21 #include "demuxer.h" |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
22 #include "stheader.h" |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
23 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
24 #include <libdv/dv.h> |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
25 #include <libdv/dv_types.h> |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
26 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
27 #define DV_PAL_FRAME_SIZE 144000 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
28 #define DV_NTSC_FRAME_SIZE 122000 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
29 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
30 typedef struct |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
31 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
32 int current_frame; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
33 int frame_size; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
34 int current_filepos; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
35 int frame_number; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
36 dv_decoder_t *decoder; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
37 } rawdv_frames_t; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
38 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
39 void demux_seek_rawdv(demuxer_t *demuxer,float rel_seek_secs,int flags) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
40 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
41 rawdv_frames_t *frames = (rawdv_frames_t *)demuxer->priv; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
42 sh_video_t *sh_video = demuxer->video->sh; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
43 int newpos=(flags&1)?0:frames->current_frame; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
44 if(flags&2) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
45 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
46 // float 0..1 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
47 newpos+=rel_seek_secs*frames->frame_number; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
48 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
49 else |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
50 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
51 // secs |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
52 newpos+=rel_seek_secs*sh_video->fps; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
53 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
54 if(newpos<0) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
55 newpos=0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
56 else if(newpos>frames->frame_number) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
57 newpos=frames->frame_number; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
58 frames->current_frame=newpos; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
59 frames->current_filepos=newpos*frames->frame_size; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
60 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
61 |
7594
a715a0960762
This just corrects a function name to match the other demuxer's
arpi
parents:
6925
diff
changeset
|
62 int rawdv_check_file(demuxer_t *demuxer) |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
63 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
64 unsigned char tmp_buffer[DV_PAL_FRAME_SIZE]; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
65 int bytes_read=0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
66 int result=0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
67 dv_decoder_t *td; |
7594
a715a0960762
This just corrects a function name to match the other demuxer's
arpi
parents:
6925
diff
changeset
|
68 |
a715a0960762
This just corrects a function name to match the other demuxer's
arpi
parents:
6925
diff
changeset
|
69 mp_msg(MSGT_DEMUX,MSGL_V,"Checking for DV\n"); |
a715a0960762
This just corrects a function name to match the other demuxer's
arpi
parents:
6925
diff
changeset
|
70 |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
71 stream_reset(demuxer->stream); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
72 stream_seek(demuxer->stream, 0); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
73 bytes_read=stream_read(demuxer->stream,tmp_buffer,DV_PAL_FRAME_SIZE); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
74 if ((bytes_read!=DV_PAL_FRAME_SIZE) && (bytes_read!=DV_NTSC_FRAME_SIZE)) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
75 return 0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
76 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
77 td=dv_decoder_new(TRUE,TRUE,FALSE); |
8822 | 78 if (!td) |
79 return 0; | |
80 | |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
81 td->quality=DV_QUALITY_BEST; |
8822 | 82 result=dv_parse_header(td, tmp_buffer); |
83 if (result) | |
84 return 0; | |
85 | |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
86 if ((( td->num_dif_seqs==10) || (td->num_dif_seqs==12)) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
87 && (td->width==720) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
88 && ((td->height==576) || (td->height==480))) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
89 result=1; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
90 dv_decoder_free(td); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
91 return result; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
92 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
93 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
94 // return value: |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
95 // 0 = EOF or no stream found |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
96 // 1 = successfully read a packet |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
97 int demux_rawdv_fill_buffer(demuxer_t *demuxer) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
98 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
99 rawdv_frames_t *frames = (rawdv_frames_t *)demuxer->priv; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
100 demux_packet_t* dp_video=NULL; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
101 sh_video_t *sh_video = demuxer->video->sh; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
102 int bytes_read=0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
103 // fprintf(stderr,"demux_rawdv_fill_buffer() seek to %d, size: %d\n",frames->current_filepos,frames->frame_size); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
104 // fetch the frame from the file |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
105 // first, position the file properly since ds_read_packet() doesn't |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
106 // seem to do it, even though it takes a file offset as a parameter |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
107 stream_seek(demuxer->stream, frames->current_filepos); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
108 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
109 dp_video=new_demux_packet(frames->frame_size); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
110 bytes_read=stream_read(demuxer->stream,dp_video->buffer,frames->frame_size); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
111 if (bytes_read<frames->frame_size) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
112 return 0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
113 dp_video->pts=frames->current_frame/sh_video->fps; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
114 dp_video->pos=frames->current_filepos; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
115 dp_video->flags=0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
116 |
7673 | 117 if (demuxer->audio && demuxer->audio->id>=-1) |
118 { | |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
119 demux_packet_t* dp_audio=clone_demux_packet(dp_video); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
120 ds_add_packet(demuxer->audio,dp_audio); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
121 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
122 ds_add_packet(demuxer->video,dp_video); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
123 // get the next frame ready |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
124 frames->current_filepos+=frames->frame_size; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
125 frames->current_frame++; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
126 // fprintf(stderr," audio->packs: %d , video->packs: %d \n",demuxer->audio->packs, demuxer->video->packs); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
127 return 1; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
128 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
129 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
130 demuxer_t* demux_open_rawdv(demuxer_t* demuxer) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
131 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
132 unsigned char dv_frame[DV_PAL_FRAME_SIZE]; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
133 sh_video_t *sh_video = NULL; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
134 rawdv_frames_t *frames = (rawdv_frames_t *)malloc(sizeof(rawdv_frames_t)); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
135 dv_decoder_t *dv_decoder=NULL; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
136 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
137 mp_msg(MSGT_DEMUXER,MSGL_V,"demux_open_rawdv() end_pos %d\n",demuxer->stream->end_pos); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
138 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
139 // go back to the beginning |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
140 stream_reset(demuxer->stream); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
141 stream_seek(demuxer->stream, 0); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
142 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
143 //get the first frame |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
144 stream_read(demuxer->stream, dv_frame, DV_PAL_FRAME_SIZE); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
145 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
146 //read params from this frame |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
147 dv_decoder=dv_decoder_new(TRUE,TRUE,FALSE); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
148 dv_decoder->quality=DV_QUALITY_BEST; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
149 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
150 dv_parse_header(dv_decoder, dv_frame); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
151 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
152 // create a new video stream header |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
153 sh_video = new_sh_video(demuxer, 0); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
154 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
155 // make sure the demuxer knows about the new video stream header |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
156 // (even though new_sh_video() ought to take care of it) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
157 demuxer->seekable = 1; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
158 demuxer->video->sh = sh_video; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
159 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
160 // make sure that the video demuxer stream header knows about its |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
161 // parent video demuxer stream (this is getting wacky), or else |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
162 // video_read_properties() will choke |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
163 sh_video->ds = demuxer->video; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
164 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
165 // custom fourcc for internal MPlayer use |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
166 // sh_video->format = mmioFOURCC('R', 'A', 'D', 'V'); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
167 sh_video->format = mmioFOURCC('D', 'V', 'S', 'D'); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
168 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
169 sh_video->disp_w = dv_decoder->width; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
170 sh_video->disp_h = dv_decoder->height; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
171 mp_msg(MSGT_DEMUXER,MSGL_V,"demux_open_rawdv() frame_size: %d w: %d h: %d dif_seq: %d system: %d\n",dv_decoder->frame_size,dv_decoder->width, dv_decoder->height,dv_decoder->num_dif_seqs,dv_decoder->system); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
172 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
173 sh_video->fps= (dv_decoder->system==e_dv_system_525_60?29.97:25); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
174 sh_video->frametime = 1.0/sh_video->fps; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
175 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
176 // emulate BITMAPINFOHEADER for win32 decoders: |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
177 sh_video->bih=malloc(sizeof(BITMAPINFOHEADER)); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
178 memset(sh_video->bih,0,sizeof(BITMAPINFOHEADER)); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
179 sh_video->bih->biSize=40; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
180 sh_video->bih->biWidth = dv_decoder->width; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
181 sh_video->bih->biHeight = dv_decoder->height; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
182 sh_video->bih->biPlanes=1; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
183 sh_video->bih->biBitCount=24; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
184 sh_video->bih->biCompression=sh_video->format; // "DVSD" |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
185 sh_video->bih->biSizeImage=sh_video->bih->biWidth*sh_video->bih->biHeight*3; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
186 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
187 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
188 frames->current_filepos=0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
189 frames->current_frame=0; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
190 frames->frame_size=dv_decoder->frame_size; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
191 frames->frame_number=demuxer->stream->end_pos/frames->frame_size; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
192 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
193 mp_msg(MSGT_DEMUXER,MSGL_V,"demux_open_rawdv() seek to %d, size: %d, dv_dec->frame_size: %d\n",frames->current_filepos,frames->frame_size, dv_decoder->frame_size); |
7673 | 194 if (dv_decoder->audio != NULL && demuxer->audio->id>=-1){ |
6925
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
195 sh_audio_t *sh_audio = new_sh_audio(demuxer, 0); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
196 demuxer->audio->sh = sh_audio; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
197 sh_audio->ds = demuxer->audio; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
198 mp_msg(MSGT_DEMUXER,MSGL_V,"demux_open_rawdv() chan: %d samplerate: %d\n",dv_decoder->audio->num_channels,dv_decoder->audio->frequency ); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
199 // custom fourcc for internal MPlayer use |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
200 sh_audio->format = mmioFOURCC('R', 'A', 'D', 'V'); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
201 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
202 sh_audio->wf = malloc(sizeof(WAVEFORMATEX)); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
203 memset(sh_audio->wf, 0, sizeof(WAVEFORMATEX)); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
204 sh_audio->wf->wFormatTag = sh_audio->format; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
205 sh_audio->wf->nChannels = dv_decoder->audio->num_channels; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
206 sh_audio->wf->wBitsPerSample = 16; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
207 sh_audio->wf->nSamplesPerSec = dv_decoder->audio->frequency; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
208 // info about the input stream: |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
209 sh_audio->wf->nAvgBytesPerSec = sh_video->fps*dv_decoder->frame_size; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
210 sh_audio->wf->nBlockAlign = dv_decoder->frame_size; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
211 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
212 // sh_audio->context=(void*)dv_decoder; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
213 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
214 stream_reset(demuxer->stream); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
215 stream_seek(demuxer->stream, 0); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
216 dv_decoder_free(dv_decoder); //we keep this in the context of both stream headers |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
217 demuxer->priv=frames; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
218 return demuxer; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
219 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
220 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
221 void demux_close_rawdv(demuxer_t* demuxer) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
222 { |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
223 rawdv_frames_t *frames = (rawdv_frames_t *)demuxer->priv; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
224 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
225 if(frames==0) |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
226 return; |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
227 free(frames); |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
228 } |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
229 |
cc46462d0015
raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff
changeset
|
230 #endif |