ifo_audio.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:5k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * Copyright (C) 1998,1999  Thomas Mirlacher
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  * 
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  * 
  19.  * The author may be reached as dent@cosy.sbg.ac.at, or
  20.  * Thomas Mirlacher, Jakob-Haringerstr. 2, A-5020 Salzburg,
  21.  * Austria
  22.  *
  23.  *------------------------------------------------------------
  24.  *
  25.  */
  26. #ifdef PARSER
  27. #include <stdio.h>
  28. #endif
  29. #include <stdlib.h>
  30. #include <sys/types.h>
  31. #include <unistd.h>
  32. #include "ifo.h"
  33. #include "misc.h"
  34. #include "decode.h"
  35. /*
  36.  audio_struct [1..8] audio_table_struct
  37. */
  38. struct audio_struct {
  39. u_int foo : 24; // ???
  40. u_char num : 8; // number of subchannels
  41. };
  42. struct audio_sub_struct {
  43. #if 1 //#if BYTE_ORDER == LITTLE //BIG_ENDIAN
  44. u_char num_channels : 3; // number of channels (n+1)
  45. u_char sample_freq : 2; // sampling frequency
  46. u_char quantization : 2; // quantization
  47. u_char appl_mode2 : 1; // audio application mode
  48. u_char appl_mode1 : 1; //
  49. u_char type : 2; // audio type (language included?)
  50. u_char multichannel_extension: 1;
  51. u_char coding_mode : 2;
  52. #else
  53. u_char coding_mode : 2;
  54. u_char multichannel_extension: 1;
  55. u_char type : 2;
  56. u_char appl_mode1 : 1;
  57. u_char appl_mode2 : 1;
  58. u_char quantization : 2;
  59. u_char sample_freq : 2;
  60. u_char num_channels : 3;
  61. #endif
  62. u_short lang_code : 16; // <char> description
  63. u_int foo : 8; // 0x00000000 ?
  64. u_int caption : 8;
  65. u_int bar : 8; // 0x00000000 ?
  66. };
  67. /**
  68.  *
  69.  */
  70. ifo_audio_t *ifoGetAudio (u_char *ptr)
  71. {
  72. ifo_audio_t *audio;
  73. int i;
  74. if (!ptr)
  75. return NULL;
  76. if (!(audio = (ifo_audio_t *) malloc (sizeof (ifo_audio_t))))
  77. return NULL;
  78. printf ("audio unknown 1: %xn", ((struct audio_struct *)ptr)->foo);
  79. audio->num = ((struct audio_struct *)ptr)->num;
  80. audio->sub = NULL;
  81. printf ("number audio 1: %xn", audio->num);
  82. ptr += sizeof (struct audio_struct);
  83. if (!(audio->sub = (ifo_audio_sub_t *) calloc (audio->num, sizeof (ifo_audio_sub_t))))
  84. return NULL;
  85. for (i=0; i<audio->num; i++) {
  86. ifo_audio_sub_t *audio_sub = (ifo_audio_sub_t *) audio->sub + i;
  87. audio_sub->coding_mode = ((struct audio_sub_struct *)ptr)->coding_mode;
  88. audio_sub->multichannel_extension = ((struct audio_sub_struct *)ptr)->multichannel_extension;
  89. audio_sub->type = ((struct audio_sub_struct *)ptr)->type;
  90. audio_sub->appl_mode = ((struct audio_sub_struct *)ptr)->appl_mode1 <<1 | ((struct audio_sub_struct *)ptr)->appl_mode2;
  91. audio_sub->quantization = ((struct audio_sub_struct *)ptr)->quantization;
  92. audio_sub->sample_freq = ((struct audio_sub_struct *)ptr)->sample_freq;
  93. audio_sub->num_channels = ((struct audio_sub_struct *)ptr)->num_channels;
  94. audio_sub->lang_code = ((struct audio_sub_struct *)ptr)->lang_code;
  95. audio_sub->caption = ((struct audio_sub_struct *)ptr)->caption;
  96. printf ("audio unknown 2: %xn", ((struct audio_sub_struct *)ptr)->foo);
  97. printf ("audio unknown 3: %xn", ((struct audio_sub_struct *)ptr)->bar);
  98. ptr += sizeof (struct audio_sub_struct);
  99. }
  100. return audio;
  101. }
  102. #ifdef PARSER
  103. /**
  104.  *
  105.  */
  106. void ifoPrintAudio (ifo_audio_t *audio)
  107. {
  108. int i;
  109. if (!audio)
  110. return;
  111. printf ("nAUDIOn");
  112. printf ("---n");
  113. printf ("number of streams:t%dn", audio->num);
  114. for (i=0; i<audio->num; i++) {
  115. char *appl_mode;
  116. char *caption;
  117. ifo_audio_sub_t *audio_sub = (ifo_audio_sub_t *) audio->sub + i;
  118. // ??? if (audio_sub->type) // language included
  119. printf ("tlang_code:t%sn",   decode_lang (audio_sub->lang_code));
  120. // else
  121. // printf ("tno language specified in streamn");
  122. printf ("tmode:tt%s(%dCh)%sn",
  123. decode_audiomode (audio_sub->coding_mode),
  124. audio_sub->num_channels,
  125. audio_sub->multichannel_extension ? "+multichannel" : ""
  126. );
  127. printf ("tsampling:t%dkHzn", audio_sub->sample_freq ? 96 : 48);
  128. //printf ("tquantization:t%dkHzn", audio_sub->sample_freq ? 96 : 48);
  129. //if (MPEG) quantization=1 ... DRC exists
  130. //else  0=16bit, 1=20bit 2=24bit); 
  131. if ((appl_mode = decode_audiomodeappl (audio_sub->appl_mode)))
  132. printf ("tappl_mode:t%sn", appl_mode);
  133. if ((caption = decode_caption (audio_sub->caption)))
  134. printf ("tcaption:t%sn", caption);
  135. // printf ("tfreq:tt%xn",      audio_sub->freq);
  136. // printf ("tquant:tt%xn",     audio_sub->quant);
  137. printf ("n");
  138. }
  139. }
  140. #endif