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 //----------------------------------------------------------------------
83 if (state == ENCODER_STAT_STARTED) {
84 DEBUG("stop transcoding..");
85 ioctl(IOCTL_STOP_TRANSCODING, 0);
91 //----------------------------------------------------------------------
93 bool Encoder::encoder_open()
95 std::string path = "/dev/bcm_enc" + Util::ultostr(encoder_id);
96 fd = ::open(path.c_str(), O_RDWR, 0);
98 state = ENCODER_STAT_OPENED;
100 DEBUG("open encoder : %s, fd : %d", path.c_str(), fd);
101 return (state == ENCODER_STAT_OPENED) ? true : false;
103 //----------------------------------------------------------------------
105 bool Encoder::retry_open(int retry_count, int sleep_time)
107 for (int i = 0; i < retry_count; ++i) {
108 if (encoder_open()) {
109 DEBUG("encoder-%d open success..", encoder_id);
112 WARNING("encoder%d open fail, retry count : %d/%d", encoder_id, i, retry_count);
115 ERROR("encoder open fail : %s (%d)", strerror(errno), errno);
118 //----------------------------------------------------------------------
120 bool Encoder::ioctl(int cmd, int value)
122 int result = ::ioctl(fd, cmd, value);
123 DEBUG("ioctl command : %d -> %x, result : %d", cmd, value, result);
127 case IOCTL_START_TRANSCODING: state = ENCODER_STAT_STARTED; break;
128 case IOCTL_STOP_TRANSCODING: state = ENCODER_STAT_STOPED; break;
132 return (result == 0) ? true : false;
134 //----------------------------------------------------------------------
136 int Encoder::get_fd()
140 //----------------------------------------------------------------------
142 void Encoder::session_dump(const char* aMessage)
144 if (Logger::instance()->get_level() >= Logger::INFO) {
145 DUMMY(" >> %s", aMessage);
146 DUMMY("-------- [ DUMP HOST INFO ] ---------");
147 for (int i = 0; i < max_encodr_count; i++) {
148 DUMMY("%d : ip [%s], pid [%d]", i, mShmData[i].ip, mShmData[i].pid);
150 DUMMY("-------------------------------------");
153 //----------------------------------------------------------------------
155 bool Encoder::session_terminated(std::vector<int>& aList, int aPid)
157 for (int i = 0; i < aList.size(); ++i) {
158 if (aList[i] == aPid) {
164 //----------------------------------------------------------------------
166 int Encoder::session_register(std::string aIpAddr, int aPid)
172 for (; i < max_encodr_count; i++) {
173 if (mShmData[i].pid == 0) {
175 mShmData[i].pid = aPid;
176 strcpy(mShmData[i].ip, aIpAddr.c_str());
181 session_dump("after register.");
183 return result ? i : -1;
185 //----------------------------------------------------------------------
187 void Encoder::session_unregister(std::string aIpAddr)
190 for (int i = 0; i < max_encodr_count; i++) {
191 if (strcmp(mShmData[i].ip, aIpAddr.c_str()) == 0) {
192 memset(mShmData[i].ip, 0, 16);
198 session_dump("after unregister.");
200 //----------------------------------------------------------------------
202 void Encoder::session_erase(int aPid)
204 for (int i = 0; i < max_encodr_count; i++) {
205 if (mShmData[i].pid == aPid) {
206 DEBUG("erase.. %s : %d", mShmData[i].ip, mShmData[i].pid);
207 memset(mShmData[i].ip, 0, 16);
213 //----------------------------------------------------------------------
215 int Encoder::session_update(std::string aIpAddr, int aPid)
220 session_dump("before update.");
222 for (; i < max_encodr_count; i++) {
223 if (strcmp(mShmData[i].ip, aIpAddr.c_str()) == 0) {
225 Util::kill_process(mShmData[i].pid);
226 memset(mShmData[i].ip, 0, 16);
232 session_register(aIpAddr, aPid);
233 return result ? i : -1;
235 //----------------------------------------------------------------------
237 int Encoder::session_already_exist(std::string aIpAddr)
241 for (int i = 0; i < max_encodr_count; i++) {
242 if (strcmp(mShmData[i].ip, aIpAddr.c_str()) == 0) {
249 //----------------------------------------------------------------------