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

DVD

开发平台:

Unix_Linux

  1. /*
  2.  *  extract_mpeg2.c
  3.  *
  4.  *  Copyright (C) Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - Nov 1999
  5.  *
  6.  *  Extracts an MPEG-2 video stream from an MPEG-2 system stream
  7.  *  and writes it to stdout
  8.  *
  9.  *  Ideas and bitstream syntax info borrowed from code written 
  10.  *  by Nathan Laredo <laredo@gnu.org>
  11.  *
  12.  *  This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
  13.  *
  14.  *  mpeg2dec is free software; you can redistribute it and/or modify
  15.  *  it under the terms of the GNU General Public License as published by
  16.  *  the Free Software Foundation; either version 2, or (at your option)
  17.  *  any later version.
  18.  *   
  19.  *  mpeg2dec is distributed in the hope that it will be useful,
  20.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22.  *  GNU General Public License for more details.
  23.  *   
  24.  *  You should have received a copy of the GNU General Public License
  25.  *  along with GNU Make; see the file COPYING.  If not, write to
  26.  *  the Free Software Foundation, 
  27.  *
  28.  */
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <stdarg.h>
  32. #include <unistd.h>
  33. #include <string.h>
  34. #include <fcntl.h>
  35. #include <errno.h>
  36. #include <sys/stat.h>
  37. #include <sys/mman.h>
  38. #define BUFSIZE 512 /* needs to be as big as biggest header */
  39. static int input_file;
  40. static unsigned char buf[BUFSIZE];
  41. static unsigned char *cur_pos;
  42. static unsigned char *end_pos;
  43. void file_init(char file_name[])
  44. {
  45. if(file_name[0] == '-' && file_name[1] == '')
  46. {
  47.    input_file = STDIN_FILENO;
  48. }
  49. else if ((input_file = open(file_name, O_RDONLY)) < 0)
  50. {
  51. fprintf(stderr,"File not foundn");
  52. exit(1);
  53. }
  54. cur_pos = buf;
  55. end_pos = buf;
  56. }
  57. unsigned char sector[2048];
  58. int parse_sector(void)
  59. {
  60. int bytes_read;
  61. int header_length;
  62.   bytes_read = read(input_file, sector, 2048); 
  63. if(bytes_read != 2048)
  64. return 0;
  65. if (sector[0x00] || sector[0x01] || sector[0x0e] || sector[0x0f])
  66. return 1;
  67. if (sector[0x02] != 0x01 || sector[0x10] != 0x01)
  68. return 1;
  69. if (sector[0x11] >= 0xbc) 
  70. {
  71. //video elementary stream
  72. if ((sector[0x11] & 0xf0) == 0xe0) 
  73. {
  74. header_length = sector[14 + 8] + 6 + 3;
  75. fwrite(&sector[14 + header_length],1,2048 - 14 - header_length,stdout);
  76. }
  77. }
  78. return 1;
  79. }
  80. int main(int argc, char *argv[])
  81. {
  82. if (argc < 2) {
  83. fprintf(stderr, "usage: %s mpeg_streamn", argv[0]);
  84. exit(1);
  85. }
  86. file_init(argv[1]);
  87. while(parse_sector());
  88. if(input_file != STDIN_FILENO) close(input_file);
  89. return 0;
  90. }