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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
7cd6450b3a2a Sanity checks.
filon
parents: 7673
diff changeset
78 if (!td)
7cd6450b3a2a Sanity checks.
filon
parents: 7673
diff changeset
79 return 0;
7cd6450b3a2a Sanity checks.
filon
parents: 7673
diff changeset
80
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
81 td->quality=DV_QUALITY_BEST;
8822
7cd6450b3a2a Sanity checks.
filon
parents: 7673
diff changeset
82 result=dv_parse_header(td, tmp_buffer);
7cd6450b3a2a Sanity checks.
filon
parents: 7673
diff changeset
83 if (result)
7cd6450b3a2a Sanity checks.
filon
parents: 7673
diff changeset
84 return 0;
7cd6450b3a2a Sanity checks.
filon
parents: 7673
diff changeset
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
a401a6ea5358 -nosound fix
arpi
parents: 7594
diff changeset
117 if (demuxer->audio && demuxer->audio->id>=-1)
a401a6ea5358 -nosound fix
arpi
parents: 7594
diff changeset
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
a401a6ea5358 -nosound fix
arpi
parents: 7594
diff changeset
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