file_raw_sink.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000-2002.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  * Bill May  wmay@cisco.com
  21.  */
  22. #include "mp4live.h"
  23. #include "file_raw_sink.h"
  24. int CRawFileSink::ThreadMain(void) 
  25. {
  26. while (SDL_SemWait(m_myMsgQueueSemaphore) == 0) {
  27. CMsg* pMsg = m_myMsgQueue.get_message();
  28. if (pMsg != NULL) {
  29. switch (pMsg->get_value()) {
  30. case MSG_NODE_STOP_THREAD:
  31. DoStopSink();
  32. delete pMsg;
  33. return 0;
  34. case MSG_NODE_START:
  35. DoStartSink();
  36. break;
  37. case MSG_NODE_STOP:
  38. DoStopSink();
  39. break;
  40. case MSG_SINK_FRAME:
  41. size_t dontcare;
  42. DoWriteFrame((CMediaFrame*)pMsg->get_message(dontcare));
  43. break;
  44. }
  45. delete pMsg;
  46. }
  47. }
  48. return -1;
  49. }
  50. void CRawFileSink::DoStartSink()
  51. {
  52. if (m_sink) {
  53. return;
  54. }
  55. if (m_pConfig->GetBoolValue(CONFIG_AUDIO_ENABLE)) {
  56. m_pcmFile = OpenFile(
  57. m_pConfig->GetStringValue(CONFIG_RAW_PCM_FILE_NAME), 
  58. m_pConfig->GetBoolValue(CONFIG_RAW_PCM_FIFO));
  59. }
  60. if (m_pConfig->GetBoolValue(CONFIG_VIDEO_ENABLE)) {
  61. m_yuvFile = OpenFile(
  62. m_pConfig->GetStringValue(CONFIG_RAW_YUV_FILE_NAME), 
  63. m_pConfig->GetBoolValue(CONFIG_RAW_YUV_FIFO));
  64. }
  65. if (m_pcmFile != -1 || m_yuvFile != -1) {
  66. m_sink = true;
  67. }
  68. }
  69. int CRawFileSink::OpenFile(char* fileName, bool useFifo)
  70. {
  71. int fd = -1;
  72. int openFlags = O_CREAT | O_TRUNC | O_WRONLY;
  73. int mode = S_IRUSR | S_IWUSR | S_IRGRP;
  74. if (useFifo) {
  75. int rc;
  76. struct stat stats;
  77. rc = stat(fileName, &stats);
  78. if (rc == 0) {
  79. if (S_ISFIFO(stats.st_mode)) {
  80. openFlags = O_RDWR | O_NONBLOCK;
  81. } else {
  82. error_message(
  83. "Warning: %s exists but is not a fifo (named pipe)n",
  84. fileName);
  85. }
  86. } else {
  87. rc = mkfifo(fileName, mode);
  88. if (rc != 0) {
  89. error_message(
  90. "Can't create fifo (named pipe) %s: %sn",
  91. fileName, strerror(errno));
  92. return -1;
  93. }
  94. openFlags = O_RDWR | O_NONBLOCK;
  95. }
  96. }
  97. fd = open(fileName, openFlags, mode);
  98. if (fd == -1) {
  99. error_message("Failed to open %s: %s", 
  100. fileName, strerror(errno));
  101. }
  102. return fd;
  103. }
  104. void CRawFileSink::DoStopSink()
  105. {
  106. if (!m_sink) {
  107. return;
  108. }
  109. if (m_pcmFile != -1) {
  110. close(m_pcmFile);
  111. m_pcmFile = -1;
  112. }
  113. if (m_yuvFile != -1) {
  114. close(m_yuvFile);
  115. m_yuvFile = -1;
  116. }
  117. m_sink = false;
  118. }
  119. void CRawFileSink::DoWriteFrame(CMediaFrame* pFrame)
  120. {
  121. if (pFrame == NULL) {
  122. return;
  123. }
  124. if (m_sink) {
  125. if (pFrame->GetType() == CMediaFrame::PcmAudioFrame 
  126.   && m_pcmFile != -1) {
  127. write(m_pcmFile, pFrame->GetData(), pFrame->GetDataLength());
  128. } else if (pFrame->GetType() == CMediaFrame::YuvVideoFrame 
  129.   && m_yuvFile != -1) {
  130. write(m_yuvFile, pFrame->GetData(), pFrame->GetDataLength());
  131. }
  132. }
  133. delete pFrame;
  134. }