Mercurial > mplayer.hg
annotate tremor/synthesis.c @ 19977:8ada6970000a
Add matroska v2 (SimpleBlock) support.
Patch by Federico Menarini (federico d menarini a gmail d com).
author | eugeni |
---|---|
date | Mon, 25 Sep 2006 21:17:43 +0000 |
parents | cd6b211be811 |
children | 8dfda4d651ec |
rev | line source |
---|---|
14280 | 1 /******************************************************************** |
2 * * | |
3 * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * | |
4 * * | |
19251
cd6b211be811
Replace tremor files that had old headers saying "ALL REDISTRIBUTION
uau
parents:
14280
diff
changeset
|
5 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * |
cd6b211be811
Replace tremor files that had old headers saying "ALL REDISTRIBUTION
uau
parents:
14280
diff
changeset
|
6 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * |
cd6b211be811
Replace tremor files that had old headers saying "ALL REDISTRIBUTION
uau
parents:
14280
diff
changeset
|
7 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * |
cd6b211be811
Replace tremor files that had old headers saying "ALL REDISTRIBUTION
uau
parents:
14280
diff
changeset
|
8 * * |
14280 | 9 * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * |
10 * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * | |
11 * * | |
12 ******************************************************************** | |
13 | |
14 function: single-block PCM synthesis | |
15 last mod: $Id$ | |
16 | |
17 ********************************************************************/ | |
18 | |
19 #include <stdio.h> | |
20 #include "ogg.h" | |
21 #include "ivorbiscodec.h" | |
22 #include "codec_internal.h" | |
23 #include "registry.h" | |
24 #include "misc.h" | |
25 #include "os.h" | |
26 | |
27 int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){ | |
28 vorbis_dsp_state *vd=vb->vd; | |
29 backend_lookup_state *b=(backend_lookup_state *)vd->backend_state; | |
30 vorbis_info *vi=vd->vi; | |
31 codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; | |
32 oggpack_buffer *opb=&vb->opb; | |
33 int type,mode,i; | |
34 | |
35 /* first things first. Make sure decode is ready */ | |
36 _vorbis_block_ripcord(vb); | |
37 oggpack_readinit(opb,op->packet,op->bytes); | |
38 | |
39 /* Check the packet type */ | |
40 if(oggpack_read(opb,1)!=0){ | |
41 /* Oops. This is not an audio data packet */ | |
42 return(OV_ENOTAUDIO); | |
43 } | |
44 | |
45 /* read our mode and pre/post windowsize */ | |
46 mode=oggpack_read(opb,b->modebits); | |
47 if(mode==-1)return(OV_EBADPACKET); | |
48 | |
49 vb->mode=mode; | |
50 vb->W=ci->mode_param[mode]->blockflag; | |
51 if(vb->W){ | |
52 vb->lW=oggpack_read(opb,1); | |
53 vb->nW=oggpack_read(opb,1); | |
54 if(vb->nW==-1) return(OV_EBADPACKET); | |
55 }else{ | |
56 vb->lW=0; | |
57 vb->nW=0; | |
58 } | |
59 | |
60 /* more setup */ | |
61 vb->granulepos=op->granulepos; | |
62 vb->sequence=op->packetno-3; /* first block is third packet */ | |
63 vb->eofflag=op->e_o_s; | |
64 | |
65 /* alloc pcm passback storage */ | |
66 vb->pcmend=ci->blocksizes[vb->W]; | |
67 vb->pcm=(ogg_int32_t **)_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels); | |
68 for(i=0;i<vi->channels;i++) | |
69 vb->pcm[i]=(ogg_int32_t *)_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i])); | |
70 | |
71 /* unpack_header enforces range checking */ | |
72 type=ci->map_type[ci->mode_param[mode]->mapping]; | |
73 | |
74 return(_mapping_P[type]->inverse(vb,b->mode[mode])); | |
75 } | |
76 | |
77 long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op){ | |
78 codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; | |
79 oggpack_buffer opb; | |
80 int mode; | |
81 | |
82 oggpack_readinit(&opb,op->packet,op->bytes); | |
83 | |
84 /* Check the packet type */ | |
85 if(oggpack_read(&opb,1)!=0){ | |
86 /* Oops. This is not an audio data packet */ | |
87 return(OV_ENOTAUDIO); | |
88 } | |
89 | |
90 { | |
91 int modebits=0; | |
92 int v=ci->modes; | |
93 while(v>1){ | |
94 modebits++; | |
95 v>>=1; | |
96 } | |
97 | |
98 /* read our mode and pre/post windowsize */ | |
99 mode=oggpack_read(&opb,modebits); | |
100 } | |
101 if(mode==-1)return(OV_EBADPACKET); | |
102 return(ci->blocksizes[ci->mode_param[mode]->blockflag]); | |
103 } | |
104 | |
105 |