4 * Created on: 2014. 6. 12.
15 #include <sys/ioctl.h>
22 //----------------------------------------------------------------------
24 Encoder::Encoder() throw(trap)
27 max_encodr_count = state = ENCODER_STAT_INIT;
29 DIR* d = opendir("/dev");
32 while ((de = readdir(d)) != 0) {
33 if (strncmp("bcm_enc", de->d_name, 7) == 0) {
44 mSemName = "/tsp_session_sem";
45 mShmName = "/tsp_session_shm";
46 mShmSize = sizeof(Session) * max_encodr_count;
49 throw(trap("session ctrl init fail."));
50 DEBUG("shm-info : fd [%d], name [%s], size [%d], data [%p]", mShmFd, mShmName.c_str(), mShmSize, mShmData);
51 DEBUG("sem-info : id [%p], name [%s]", mSemId, mSemName.c_str());
53 std::vector<int> pidlist = Util::find_process_by_name("transtreamproxy", 0);
55 session_dump("before init.");
58 for (int i = 0; i < max_encodr_count; i++) {
59 if (mShmData[i].pid != 0) {
60 int pid = mShmData[i].pid;
61 if(session_terminated(pidlist, pid)) {
69 std::string ipaddr = Util::host_addr();
70 if (session_already_exist(ipaddr) > 0) {
71 encoder_id = session_update(ipaddr, mypid);
74 encoder_id = session_register(ipaddr, mypid);
76 DEBUG("encoder_device_id : %d", encoder_id);
78 //----------------------------------------------------------------------
84 if (state == ENCODER_STAT_STARTED) {
85 DEBUG("stop transcoding..");
86 ioctl(IOCTL_STOP_TRANSCODING, 0);
92 //----------------------------------------------------------------------
94 bool Encoder::encoder_open()
96 std::string path = "/dev/bcm_enc" + Util::ultostr(encoder_id);
97 fd = ::open(path.c_str(), O_RDWR, 0);
99 state = ENCODER_STAT_OPENED;
101 DEBUG("open encoder : %s, fd : %d", path.c_str(), fd);
102 return (state == ENCODER_STAT_OPENED) ? true : false;
104 //----------------------------------------------------------------------
106 bool Encoder::retry_open(int retry_count, int sleep_time)
108 for (int i = 0; i < retry_count; ++i) {
109 if (encoder_open()) {
110 DEBUG("encoder-%d open success..", encoder_id);
113 WARNING("encoder%d open fail, retry count : %d/%d", encoder_id, i, retry_count);
116 ERROR("encoder open fail : %s (%d)", strerror(errno), errno);
119 //----------------------------------------------------------------------
121 bool Encoder::ioctl(int cmd, int value)
123 int result = ::ioctl(fd, cmd, value);
124 DEBUG("ioctl command : %d -> %x, result : %d", cmd, value, result);
128 case IOCTL_START_TRANSCODING: state = ENCODER_STAT_STARTED; break;
129 case IOCTL_STOP_TRANSCODING: state = ENCODER_STAT_STOPED; break;
133 return (result == 0) ? true : false;
135 //----------------------------------------------------------------------
137 int Encoder::get_fd()
141 //----------------------------------------------------------------------
143 void Encoder::session_dump(const char* aMessage)
145 if (Logger::instance()->get_level() >= Logger::INFO) {
146 DUMMY(" >> %s", aMessage);
147 DUMMY("-------- [ DUMP HOST INFO ] ---------");
148 for (int i = 0; i < max_encodr_count; i++) {
149 DUMMY("%d : ip [%s], pid [%d]", i, mShmData[i].ip, mShmData[i].pid);
151 DUMMY("-------------------------------------");
154 //----------------------------------------------------------------------
156 bool Encoder::session_terminated(std::vector<int>& aList, int aPid)
158 for (int i = 0; i < aList.size(); ++i) {
159 if (aList[i] == aPid) {
165 //----------------------------------------------------------------------
167 int Encoder::session_register(std::string aIpAddr, int aPid)
173 for (; i < max_encodr_count; i++) {
174 if (mShmData[i].pid == 0) {
176 mShmData[i].pid = aPid;
177 strcpy(mShmData[i].ip, aIpAddr.c_str());
182 session_dump("after register.");
184 return result ? i : -1;
186 //----------------------------------------------------------------------
188 void Encoder::session_unregister(std::string aIpAddr)
191 for (int i = 0; i < max_encodr_count; i++) {
192 if (strcmp(mShmData[i].ip, aIpAddr.c_str()) == 0) {
193 memset(mShmData[i].ip, 0, 16);
199 session_dump("after unregister.");
201 //----------------------------------------------------------------------
203 void Encoder::session_erase(int aPid)
205 for (int i = 0; i < max_encodr_count; i++) {
206 if (mShmData[i].pid == aPid) {
207 DEBUG("erase.. %s : %d", mShmData[i].ip, mShmData[i].pid);
208 memset(mShmData[i].ip, 0, 16);
214 //----------------------------------------------------------------------
216 int Encoder::session_update(std::string aIpAddr, int aPid)
221 session_dump("before update.");
223 for (; i < max_encodr_count; i++) {
224 if (strcmp(mShmData[i].ip, aIpAddr.c_str()) == 0) {
226 Util::kill_process(mShmData[i].pid);
227 memset(mShmData[i].ip, 0, 16);
233 session_register(aIpAddr, aPid);
234 return result ? i : -1;
236 //----------------------------------------------------------------------
238 int Encoder::session_already_exist(std::string aIpAddr)
242 for (int i = 0; i < max_encodr_count; i++) {
243 if (strcmp(mShmData[i].ip, aIpAddr.c_str()) == 0) {
250 //----------------------------------------------------------------------