Commit b070c0fde045ac35b70e8e247273ed1f654b0c4f
1 parent
0bb99bec
修正m_recoderinfo_list的size为1时pop后会导致崩溃的问题
Showing
1 changed file
with
63 additions
and
55 deletions
src/decoder/dvpp/FFRecoderTaskManager.cpp
... | ... | @@ -180,72 +180,80 @@ void FFRecoderTaskManager::recode_thread() { |
180 | 180 | |
181 | 181 | auto it_param = m_recoderinfo_list.begin(); |
182 | 182 | RecoderInfo recoderinfo = *it_param; |
183 | - m_recoderinfo_list.pop_front(); | |
184 | 183 | m_recoderinfo_list_mtx.unlock(); |
185 | 184 | |
186 | - auto it_data = getStartIterator(recoderinfo.frame_nb); | |
187 | - if(it_data == m_pkt_list.end()) { | |
188 | - std::this_thread::sleep_for(std::chrono::milliseconds(3)); | |
189 | - continue; | |
190 | - } | |
185 | + do | |
186 | + { | |
187 | + auto it_data = getStartIterator(recoderinfo.frame_nb); | |
188 | + if(it_data == m_pkt_list.end()) { | |
189 | + std::this_thread::sleep_for(std::chrono::milliseconds(3)); | |
190 | + break; | |
191 | + } | |
191 | 192 | |
192 | - LOG_INFO("start frame_nb: {}", (*it_data)->frame_nb); | |
193 | + LOG_INFO("start frame_nb: {}", (*it_data)->frame_nb); | |
193 | 194 | |
194 | - m_pkt_list_mtx.lock(); | |
195 | - auto it = m_pkt_list.begin(); | |
196 | - while (it != it_data) { | |
197 | - DataPacket* dataPkt = m_pkt_list.front(); | |
198 | - delete dataPkt; | |
199 | - dataPkt = nullptr; | |
200 | - m_pkt_list.pop_front(); | |
201 | - it = m_pkt_list.begin(); | |
202 | - } | |
203 | - m_pkt_list_mtx.unlock(); | |
195 | + m_pkt_list_mtx.lock(); | |
196 | + auto it = m_pkt_list.begin(); | |
197 | + while (it != it_data) { | |
198 | + DataPacket* dataPkt = m_pkt_list.front(); | |
199 | + delete dataPkt; | |
200 | + dataPkt = nullptr; | |
201 | + m_pkt_list.pop_front(); | |
202 | + it = m_pkt_list.begin(); | |
203 | + } | |
204 | + m_pkt_list_mtx.unlock(); | |
204 | 205 | |
205 | - string file_name = recoderinfo.recoderPath; | |
206 | - | |
207 | - FFRecoder ffrecoder; | |
208 | - bool bInit = ffrecoder.init(m_inStream, m_avctx, file_name.c_str()); | |
209 | - if (!bInit) { | |
210 | - LOG_ERROR("ffrecoder init error : {} {} {}", recoderinfo.task_id, recoderinfo.object_id, recoderinfo.frame_nb); | |
211 | - ffrecoder.uninit(); | |
212 | - continue; | |
213 | - } | |
214 | - LOG_DEBUG("record start, pkt_list size: {} task_id: {} object_id:{} frame_nb: {}", m_pkt_list.size(), recoderinfo.task_id, recoderinfo.object_id, recoderinfo.frame_nb); | |
215 | - | |
216 | - int count = 0; | |
217 | - auto it_save = it_data; | |
218 | - unsigned long long start_frame_nb = (*it_data)->frame_nb; | |
219 | - unsigned long long end_frame_nb = (*it_data)->frame_nb; | |
220 | - for (; it_save != m_pkt_list.end() && count < 500; ++it_save) { | |
221 | - DataPacket* dataPkt = *it_save; | |
222 | - if(dataPkt->frame_nb > recoderinfo.frame_nb) { | |
206 | + string file_name = recoderinfo.recoderPath; | |
207 | + | |
208 | + FFRecoder ffrecoder; | |
209 | + bool bInit = ffrecoder.init(m_inStream, m_avctx, file_name.c_str()); | |
210 | + if (!bInit) { | |
211 | + LOG_ERROR("ffrecoder init error : {} {} {}", recoderinfo.task_id, recoderinfo.object_id, recoderinfo.frame_nb); | |
212 | + ffrecoder.uninit(); | |
223 | 213 | break; |
224 | 214 | } |
225 | - AVPacket* pkt = dataPkt->pkt; | |
226 | - if(pkt == nullptr) { | |
227 | - LOG_ERROR("{} pkt is nullptr", recoderinfo.task_id); | |
228 | - continue; | |
229 | - } else if (pkt->data == nullptr || pkt->size <= 0){ | |
230 | - LOG_ERROR("{} pkt data is nullptr", recoderinfo.task_id); | |
231 | - continue; | |
215 | + LOG_DEBUG("record start, pkt_list size: {} task_id: {} object_id:{} frame_nb: {}", m_pkt_list.size(), recoderinfo.task_id, recoderinfo.object_id, recoderinfo.frame_nb); | |
216 | + | |
217 | + int count = 0; | |
218 | + auto it_save = it_data; | |
219 | + unsigned long long start_frame_nb = (*it_data)->frame_nb; | |
220 | + unsigned long long end_frame_nb = (*it_data)->frame_nb; | |
221 | + for (; it_save != m_pkt_list.end() && count < 500; ++it_save) { | |
222 | + DataPacket* dataPkt = *it_save; | |
223 | + if(dataPkt->frame_nb > recoderinfo.frame_nb) { | |
224 | + break; | |
225 | + } | |
226 | + AVPacket* pkt = dataPkt->pkt; | |
227 | + if(pkt == nullptr) { | |
228 | + LOG_ERROR("{} pkt is nullptr", recoderinfo.task_id); | |
229 | + continue; | |
230 | + } else if (pkt->data == nullptr || pkt->size <= 0){ | |
231 | + LOG_ERROR("{} pkt data is nullptr", recoderinfo.task_id); | |
232 | + continue; | |
233 | + } | |
234 | + | |
235 | + ffrecoder.write_pkt(pkt); | |
236 | + count++; | |
237 | + end_frame_nb = (*it_save)->frame_nb; | |
232 | 238 | } |
233 | - | |
234 | - ffrecoder.write_pkt(pkt); | |
235 | - count++; | |
236 | - end_frame_nb = (*it_save)->frame_nb; | |
237 | - } | |
238 | 239 | |
239 | - ffrecoder.flush_pkt(); | |
240 | - ffrecoder.uninit(); | |
240 | + ffrecoder.flush_pkt(); | |
241 | + ffrecoder.uninit(); | |
241 | 242 | |
242 | - // 发送mq消息 | |
243 | - if(mq_publish_func && recoderinfo.mq_info.length() > 0) { | |
244 | - mq_publish_func(recoderinfo.mq_info.c_str()); | |
245 | - // LOG_INFO("record save: {}", recoderinfo.mq_info.c_str()); | |
246 | - } | |
243 | + // 发送mq消息 | |
244 | + if(mq_publish_func && recoderinfo.mq_info.length() > 0) { | |
245 | + mq_publish_func(recoderinfo.mq_info.c_str()); | |
246 | + // LOG_INFO("record save: {}", recoderinfo.mq_info.c_str()); | |
247 | + } | |
247 | 248 | |
248 | - LOG_INFO("record end, total save: {} start_frame_nb: {} end_frame_nb: {} file_path: {}", count, start_frame_nb, end_frame_nb, file_name); | |
249 | + LOG_INFO("record end, total save: {} start_frame_nb: {} end_frame_nb: {} file_path: {}", count, start_frame_nb, end_frame_nb, file_name); | |
250 | + } while (0); | |
251 | + | |
252 | + // m_recoderinfo_list 为空会触发 m_pkt_list size 大于1000时的删除操作, | |
253 | + // 因此应当在本次m_pkt_list操作都完成之后再pop,避免这边在用m_pkt_list, 另一边在删除,从而导致崩溃 | |
254 | + m_recoderinfo_list_mtx.lock(); | |
255 | + m_recoderinfo_list.pop_front(); | |
256 | + m_recoderinfo_list_mtx.unlock(); | |
249 | 257 | } |
250 | 258 | |
251 | 259 | LOG_INFO("recode_thread end."); | ... | ... |