annotate libmpdemux/demux_rawdv.c @ 26109:e53dac3c60ee

Revert fixing illegal identifiers to fix compilation on MinGW. Unfortunately these identifiers appear in Windows system headers and are thus outside our direct control.
author diego
date Sun, 02 Mar 2008 19:38:50 +0000
parents baf32110d3fc
children 4d56038ec730
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 #include "mp_msg.h"
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
16 #include "help_mp.h"
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
17
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 20432
diff changeset
18 #include "stream/stream.h"
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
19 #include "demuxer.h"
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
20 #include "stheader.h"
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
21
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
22 #include <libdv/dv.h>
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
23 #include <libdv/dv_types.h>
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
24
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
25 #define DV_PAL_FRAME_SIZE 144000
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
26 #define DV_NTSC_FRAME_SIZE 122000
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
27
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
28 typedef struct
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 int current_frame;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
31 int frame_size;
9630
72870542a127 largefile support by Matthias Schwarzott <zzam@gmx.de>
alex
parents: 9032
diff changeset
32 off_t current_filepos;
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
33 int frame_number;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
34 dv_decoder_t *decoder;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
35 } rawdv_frames_t;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
36
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
37 static void demux_seek_rawdv(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags)
6925
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 rawdv_frames_t *frames = (rawdv_frames_t *)demuxer->priv;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
40 sh_video_t *sh_video = demuxer->video->sh;
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25707
diff changeset
41 off_t newpos=(flags&SEEK_ABSOLUTE)?0:frames->current_frame;
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25707
diff changeset
42 if(flags&SEEK_FACTOR)
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
43 {
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
44 // float 0..1
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
45 newpos+=rel_seek_secs*frames->frame_number;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
46 }
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
47 else
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 // secs
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
50 newpos+=rel_seek_secs*sh_video->fps;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
51 }
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
52 if(newpos<0)
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
53 newpos=0;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
54 else if(newpos>frames->frame_number)
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
55 newpos=frames->frame_number;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
56 frames->current_frame=newpos;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
57 frames->current_filepos=newpos*frames->frame_size;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
58 }
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
59
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
60 static int rawdv_check_file(demuxer_t *demuxer)
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
61 {
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
62 unsigned char tmp_buffer[DV_PAL_FRAME_SIZE];
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
63 int bytes_read=0;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
64 int result=0;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
65 dv_decoder_t *td;
7594
a715a0960762 This just corrects a function name to match the other demuxer's
arpi
parents: 6925
diff changeset
66
a715a0960762 This just corrects a function name to match the other demuxer's
arpi
parents: 6925
diff changeset
67 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
68
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
69 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
70 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
71 return 0;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
72
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
73 td=dv_decoder_new(TRUE,TRUE,FALSE);
8822
7cd6450b3a2a Sanity checks.
filon
parents: 7673
diff changeset
74 if (!td)
7cd6450b3a2a Sanity checks.
filon
parents: 7673
diff changeset
75 return 0;
7cd6450b3a2a Sanity checks.
filon
parents: 7673
diff changeset
76
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
77 td->quality=DV_QUALITY_BEST;
8822
7cd6450b3a2a Sanity checks.
filon
parents: 7673
diff changeset
78 result=dv_parse_header(td, tmp_buffer);
9032
arpi
parents: 8822
diff changeset
79 if (result<0)
8822
7cd6450b3a2a Sanity checks.
filon
parents: 7673
diff changeset
80 return 0;
7cd6450b3a2a Sanity checks.
filon
parents: 7673
diff changeset
81
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
82 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
83 && (td->width==720)
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
84 && ((td->height==576) || (td->height==480)))
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
85 result=1;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
86 dv_decoder_free(td);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
87 if (result)
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
88 return DEMUXER_TYPE_RAWDV;
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
89 else
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
90 return 0;
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
91 }
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 // return value:
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
94 // 0 = EOF or no stream found
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
95 // 1 = successfully read a packet
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
96 static int demux_rawdv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
97 {
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
98 rawdv_frames_t *frames = (rawdv_frames_t *)demuxer->priv;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
99 demux_packet_t* dp_video=NULL;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
100 sh_video_t *sh_video = demuxer->video->sh;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
101 int bytes_read=0;
9630
72870542a127 largefile support by Matthias Schwarzott <zzam@gmx.de>
alex
parents: 9032
diff changeset
102 // fprintf(stderr,"demux_rawdv_fill_buffer() seek to %qu, size: %d\n",frames->current_filepos,frames->frame_size);
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
103 // fetch the frame from the file
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
104 // 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
105 // 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
106 stream_seek(demuxer->stream, frames->current_filepos);
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
107
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
108 dp_video=new_demux_packet(frames->frame_size);
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
109 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
110 if (bytes_read<frames->frame_size)
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
111 return 0;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
112 dp_video->pts=frames->current_frame/sh_video->fps;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
113 dp_video->pos=frames->current_filepos;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
114 dp_video->flags=0;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
115
7673
a401a6ea5358 -nosound fix
arpi
parents: 7594
diff changeset
116 if (demuxer->audio && demuxer->audio->id>=-1)
a401a6ea5358 -nosound fix
arpi
parents: 7594
diff changeset
117 {
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
118 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
119 ds_add_packet(demuxer->audio,dp_audio);
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
120 }
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
121 ds_add_packet(demuxer->video,dp_video);
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
122 // get the next frame ready
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
123 frames->current_filepos+=frames->frame_size;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
124 frames->current_frame++;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
125 // 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
126 return 1;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
127 }
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
128
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
129 static demuxer_t* demux_open_rawdv(demuxer_t* demuxer)
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
130 {
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
131 unsigned char dv_frame[DV_PAL_FRAME_SIZE];
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
132 sh_video_t *sh_video = NULL;
19062
83c3afeab35d drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents: 18922
diff changeset
133 rawdv_frames_t *frames = malloc(sizeof(rawdv_frames_t));
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
134 dv_decoder_t *dv_decoder=NULL;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
135
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 16346
diff changeset
136 mp_msg(MSGT_DEMUXER,MSGL_V,"demux_open_rawdv() end_pos %"PRId64"\n",(int64_t)demuxer->stream->end_pos);
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
137
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
138 // go back to the beginning
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
139 stream_reset(demuxer->stream);
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
140 stream_seek(demuxer->stream, 0);
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
141
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
142 //get the first frame
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
143 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
144
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
145 //read params from this frame
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
146 dv_decoder=dv_decoder_new(TRUE,TRUE,FALSE);
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
147 dv_decoder->quality=DV_QUALITY_BEST;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
148
20432
972c93990379 add two missing checks - PATCH by Karolina Lindqvist AT kramnet-se
reynaldo
parents: 19062
diff changeset
149 if (dv_parse_header(dv_decoder, dv_frame) == -1)
972c93990379 add two missing checks - PATCH by Karolina Lindqvist AT kramnet-se
reynaldo
parents: 19062
diff changeset
150 return NULL;
6925
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);
20432
972c93990379 add two missing checks - PATCH by Karolina Lindqvist AT kramnet-se
reynaldo
parents: 19062
diff changeset
154 if (!sh_video)
972c93990379 add two missing checks - PATCH by Karolina Lindqvist AT kramnet-se
reynaldo
parents: 19062
diff changeset
155 return NULL;
6925
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
156
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
157 // 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
158 // (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
159 demuxer->seekable = 1;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
160 demuxer->video->sh = sh_video;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
161
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
162 // 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
163 // 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
164 // video_read_properties() will choke
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
165 sh_video->ds = demuxer->video;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
166
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
167 // custom fourcc for internal MPlayer use
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
168 // sh_video->format = mmioFOURCC('R', 'A', 'D', 'V');
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
169 sh_video->format = mmioFOURCC('D', 'V', 'S', 'D');
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
170
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
171 sh_video->disp_w = dv_decoder->width;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
172 sh_video->disp_h = dv_decoder->height;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
173 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
174
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
175 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
176 sh_video->frametime = 1.0/sh_video->fps;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
177
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
178 // emulate BITMAPINFOHEADER for win32 decoders:
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
179 sh_video->bih=malloc(sizeof(BITMAPINFOHEADER));
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
180 memset(sh_video->bih,0,sizeof(BITMAPINFOHEADER));
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
181 sh_video->bih->biSize=40;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
182 sh_video->bih->biWidth = dv_decoder->width;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
183 sh_video->bih->biHeight = dv_decoder->height;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
184 sh_video->bih->biPlanes=1;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
185 sh_video->bih->biBitCount=24;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
186 sh_video->bih->biCompression=sh_video->format; // "DVSD"
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
187 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
188
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
189
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
190 frames->current_filepos=0;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
191 frames->current_frame=0;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
192 frames->frame_size=dv_decoder->frame_size;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
193 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
194
9630
72870542a127 largefile support by Matthias Schwarzott <zzam@gmx.de>
alex
parents: 9032
diff changeset
195 mp_msg(MSGT_DEMUXER,MSGL_V,"demux_open_rawdv() seek to %qu, 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
196 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
197 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
198 demuxer->audio->sh = sh_audio;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
199 sh_audio->ds = demuxer->audio;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
200 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
201 // custom fourcc for internal MPlayer use
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
202 sh_audio->format = mmioFOURCC('R', 'A', 'D', 'V');
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
203
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
204 sh_audio->wf = malloc(sizeof(WAVEFORMATEX));
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
205 memset(sh_audio->wf, 0, sizeof(WAVEFORMATEX));
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
206 sh_audio->wf->wFormatTag = sh_audio->format;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
207 sh_audio->wf->nChannels = dv_decoder->audio->num_channels;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
208 sh_audio->wf->wBitsPerSample = 16;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
209 sh_audio->wf->nSamplesPerSec = dv_decoder->audio->frequency;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
210 // info about the input stream:
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
211 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
212 sh_audio->wf->nBlockAlign = dv_decoder->frame_size;
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 // sh_audio->context=(void*)dv_decoder;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
215 }
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
216 stream_reset(demuxer->stream);
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
217 stream_seek(demuxer->stream, 0);
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
218 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
219 demuxer->priv=frames;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
220 return demuxer;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
221 }
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
222
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
223 static void demux_close_rawdv(demuxer_t* demuxer)
6925
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 rawdv_frames_t *frames = (rawdv_frames_t *)demuxer->priv;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
226
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
227 if(frames==0)
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
228 return;
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
229 free(frames);
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
230 }
cc46462d0015 raw .dv stream demuxer by Alexander Neundorf <neundorf@kde.org>
arpi
parents:
diff changeset
231
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
232 static int demux_rawdv_control(demuxer_t *demuxer,int cmd, void *arg) {
14934
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
233 rawdv_frames_t *frames = (rawdv_frames_t *)demuxer->priv;
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
234 sh_video_t *sh_video=demuxer->video->sh;
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
235
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
236 switch(cmd) {
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
237 case DEMUXER_CTRL_GET_TIME_LENGTH:
16346
6ff303d2876b Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents: 16175
diff changeset
238 *((double *)arg)=(double)frames->frame_number / sh_video->fps;
14934
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
239 return DEMUXER_CTRL_OK;
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
240
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
241 case DEMUXER_CTRL_GET_PERCENT_POS:
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
242 *((int *)arg)=(int)(frames->current_frame * 100. / frames->frame_number);
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
243 return DEMUXER_CTRL_OK;
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
244
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
245 default:
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
246 return DEMUXER_CTRL_NOTIMPL;
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
247 }
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
248 }
89031188b7b2 Rather simple patch for RAWDV demuxer which lets it say whats the total
rtognimp
parents: 10539
diff changeset
249
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
250
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 22605
diff changeset
251 const demuxer_desc_t demuxer_desc_rawdv = {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
252 "Raw DV demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
253 "rawdv",
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
254 "RAWDV",
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
255 "Alexander Neundorf",
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
256 "",
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
257 DEMUXER_TYPE_RAWDV,
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
258 0, // unsafe autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
259 rawdv_check_file,
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
260 demux_rawdv_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
261 demux_open_rawdv,
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
262 demux_close_rawdv,
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
263 demux_seek_rawdv,
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
264 demux_rawdv_control
6b86089c2edd Demuxer modularization
rtognimp
parents: 14934
diff changeset
265 };