home *** CD-ROM | disk | FTP | other *** search
/ Chip 2005 June / ccd0605.iso / LINUX / gopchop-1.1.7.tar.tar / gopchop-1.1.7.tar / gopchop-1.1.7 / src / FirstPack.cpp < prev    next >
C/C++ Source or Header  |  2005-05-01  |  5KB  |  172 lines

  1. /*
  2. #
  3. # FirstPack class create a dummy first pack length 2KB with a valid system header.
  4. # A valid system header is obtain by the first system header found in the program stream.
  5. # If no system header is found, nothing is done.
  6. #
  7. # Copyright (C) 2005 Tiziano Cappellari and Igor Baldachini
  8. # t1z1an0@tele2.it
  9. #
  10. # This program is free software; you can redistribute it and/or
  11. # modify it under the terms of the GNU General Public License
  12. # as published by the Free Software Foundation; either version 2
  13. # of the License, or (at your option) any later version.
  14. # This program is distributed in the hope that it will be useful,
  15. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. # GNU General Public License for more details.
  18. # You should have received a copy of the GNU General Public License
  19. # along with this program; if not, write to the Free Software
  20. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  21. # http://www.gnu.org/copyleft/gpl.html
  22. #
  23. */
  24.  
  25. #ifdef HAVE_CONFIG_H
  26. # include "config.h"
  27. #endif
  28.  
  29. #include <string.h>
  30.     
  31. #include "FirstPack.h"    
  32. #include "mpeg2consts.h"
  33.  
  34. FirstPack::FirstPack()
  35. {
  36.     memset((void *)&pack_header, 0, sizeof(pack_header));    
  37.     is_pack_header = false;
  38.     memset((void *)&system_header, 0, sizeof(system_header));    
  39.     pstream_id=NULL;
  40.     num_stream_id=0;
  41.     is_system_header=false;
  42.     
  43.     index_stream_ids=0;
  44. }
  45.  
  46.  
  47. FirstPack::~FirstPack()
  48. {
  49.     if (pstream_id) delete []pstream_id;
  50. }
  51.  
  52.  
  53. void FirstPack::setSystemHeader(system_header_t *header)
  54. {
  55.     if (!is_system_header)      //first system_header found
  56.     {
  57.         system_header=*header;  //save system header
  58.         
  59.         //get the number of stream ids
  60.         uint16_t header_length = system_header.header_length[0] * 256 + system_header.header_length[1];
  61.         num_stream_id = (header_length - sizeof(system_header.bits)) / sizeof(stream_id_t);
  62.  
  63.         if (num_stream_id)      //there are stream_id to save: alloc memory (addStreamId() do the job)
  64.         {
  65.             pstream_id = new stream_id_t[num_stream_id];
  66.         }
  67.  
  68.         is_system_header = true; //no more system headers to save
  69.     }
  70. }
  71.  
  72.  
  73. void FirstPack::addStreamId(stream_id_t *stream)
  74. {
  75.     if (index_stream_ids < num_stream_id)
  76.     {
  77.         pstream_id[index_stream_ids++] = *stream;  // save stream ids
  78.     }
  79. }
  80.  
  81.  
  82. void FirstPack::setPackHeader(pack_header_t *header)
  83. {
  84.     if (!is_pack_header)        //first pack header found
  85.     {
  86.         pack_header=*header;    //save pack header
  87.  
  88.         // force SCR to 0
  89.         pack_header.bits[0] = 0x44;
  90.         pack_header.bits[1] = 0x00;
  91.         pack_header.bits[2] = 0x04;
  92.         pack_header.bits[3] = 0x00;
  93.         pack_header.bits[4] = 0x04;
  94.         pack_header.bits[5] = 0x01;
  95.         
  96.         is_pack_header = true;  //no more pack headers to save
  97.     }
  98. }
  99.  
  100.  
  101. /*
  102.  * Save Dummy First Pack with a valid system header
  103.  */
  104. off_t FirstPack::saveFirstPack(FILE *mpeg2)
  105. {
  106.     off_t written_bytes = 0;
  107.  
  108.     if (is_system_header && is_pack_header)     //enough info to do the job
  109.     {
  110.         fwrite(&pack_header,sizeof(pack_header), 1, mpeg2);     //write pack header
  111.         written_bytes+=sizeof(pack_header);
  112.         
  113.         uint16_t data_length = pack_header.bits[9] & 0x07;      //get the num of stuffing bytes and...
  114.         written_bytes += data_length;
  115.         while (data_length--)                                   //...fill it
  116.         {
  117.             fputc(0xFF, mpeg2);
  118.         }
  119.         
  120.         fwrite(&system_header, sizeof(system_header), 1, mpeg2); //write system header
  121.         written_bytes+=sizeof(system_header);
  122.                     
  123.         if (num_stream_id)  //write (if any) stream ids
  124.         {
  125.             fwrite(pstream_id, sizeof(stream_id_t) * num_stream_id, 1, mpeg2);
  126.             written_bytes+=sizeof(stream_id_t) * num_stream_id;
  127.         }
  128.  
  129.         /* Fill what leaves to 2 KB */
  130.         /* with packet(s) stream id = 0xBF and with one packet length no more than 1KB */
  131.         if ((0x800 - written_bytes) > 1024) //more than 1 KB to fill, so make 2 packets
  132.         {
  133.             /* first packet: fill what leaves to 1 KB */
  134.             data_length = (0x800 - written_bytes) - 6 - 1024;
  135.             fwrite(private_stream2_buf,sizeof(private_stream2_buf),1,mpeg2);
  136.             fputc(data_length / 256, mpeg2);
  137.             fputc(data_length % 256, mpeg2);
  138.             while (data_length--)
  139.             {
  140.                 fputc(0x00, mpeg2);
  141.             }
  142.             
  143.             /* second packet: fill the remaining 1 KB */
  144.             data_length = 1018;
  145.             fwrite(private_stream2_buf,sizeof(private_stream2_buf),1,mpeg2);
  146.             fputc(data_length / 256, mpeg2);
  147.             fputc(data_length % 256, mpeg2);
  148.             while (data_length--)
  149.             {
  150.                 fputc(0x00, mpeg2);
  151.             }
  152.         }
  153.         else //less than 1 KB, so make just 1 packet
  154.         {
  155.             data_length = (0x800 - written_bytes) - 6;
  156.             fwrite(private_stream2_buf,sizeof(private_stream2_buf),1,mpeg2);
  157.             fputc(data_length / 256, mpeg2);
  158.             fputc(data_length % 256, mpeg2);
  159.             while (data_length--)
  160.             {
  161.                 fputc(0x00, mpeg2);
  162.             }
  163.         }
  164.         
  165.         written_bytes = 0x800;
  166.         }
  167.         return written_bytes;
  168. }
  169.  
  170.