packets_sync.cpp 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304
  1. // ***********************************************************/
  2. // packets_sync.cpp
  3. //
  4. // Copy Right @ Steven Huang. All rights reserved.
  5. //
  6. // packets A/V synchronization struct and operations definition.
  7. // This code is referenced from ffplay.c in Ffmpeg library.
  8. // ***********************************************************/
  9. #include "packets_sync.h"
  10. int framedrop = -1;
  11. // static int decoder_reorder_pts = -1;
  12. // static int display_disable = 1;
  13. // static int64_t audio_callback_time;
  14. int packet_queue_init(PacketQueue* q)
  15. {
  16. memset(q, 0, sizeof(PacketQueue));
  17. q->pkt_list = av_fifo_alloc2(1, sizeof(MyAVPacketList), AV_FIFO_FLAG_AUTO_GROW);
  18. if (!q->pkt_list)
  19. return AVERROR(ENOMEM);
  20. q->mutex = new QMutex();
  21. if (!q->mutex)
  22. {
  23. av_log(nullptr, AV_LOG_FATAL, "new QMutex() error.\n");
  24. return AVERROR(ENOMEM);
  25. }
  26. q->cond = new QWaitCondition();
  27. if (!q->cond)
  28. {
  29. av_log(nullptr, AV_LOG_FATAL, "new QWaitCondition() error.\n");
  30. return AVERROR(ENOMEM);
  31. }
  32. q->abort_request = 1;
  33. return 0;
  34. }
  35. void packet_queue_destroy(PacketQueue* q)
  36. {
  37. packet_queue_flush(q);
  38. av_fifo_freep2(&q->pkt_list);
  39. delete q->mutex;
  40. delete q->cond;
  41. }
  42. void packet_queue_flush(PacketQueue* q)
  43. {
  44. MyAVPacketList pkt1;
  45. q->mutex->lock();
  46. while (av_fifo_read(q->pkt_list, &pkt1, 1) >= 0)
  47. av_packet_free(&pkt1.pkt);
  48. q->nb_packets = 0;
  49. q->size = 0;
  50. q->duration = 0;
  51. q->serial++;
  52. q->mutex->unlock();
  53. }
  54. void packet_queue_start(PacketQueue* q)
  55. {
  56. q->mutex->lock();
  57. q->abort_request = 0;
  58. q->serial++;
  59. q->mutex->unlock();
  60. }
  61. void packet_queue_abort(PacketQueue* q)
  62. {
  63. q->mutex->lock();
  64. q->abort_request = 1;
  65. q->cond->wakeAll();
  66. q->mutex->unlock();
  67. }
  68. int packet_queue_get(PacketQueue* q, AVPacket* pkt, int block, int* serial)
  69. {
  70. #if PRINT_PACKETQUEUE_INFO
  71. // packet_queue_print(q, pkt, "packet_queue_get");
  72. #endif
  73. MyAVPacketList pkt1;
  74. int ret = 0;
  75. q->mutex->lock();
  76. for (;;)
  77. {
  78. if (q->abort_request)
  79. {
  80. ret = -1;
  81. break;
  82. }
  83. if (av_fifo_read(q->pkt_list, &pkt1, 1) >= 0)
  84. {
  85. q->nb_packets--;
  86. q->size -= pkt1.pkt->size + sizeof(pkt1);
  87. q->duration -= pkt1.pkt->duration;
  88. av_packet_move_ref(pkt, pkt1.pkt);
  89. if (serial)
  90. *serial = pkt1.serial;
  91. av_packet_free(&pkt1.pkt);
  92. ret = 1;
  93. break;
  94. }
  95. else if (!block)
  96. {
  97. ret = 0;
  98. break;
  99. }
  100. else
  101. {
  102. q->cond->wait(q->mutex);
  103. }
  104. }
  105. q->mutex->unlock();
  106. return ret;
  107. }
  108. void packet_queue_print(const PacketQueue* q, const AVPacket* pkt, const QString& prefix)
  109. {
  110. qDebug("[%s]Queue:[%p](nb_packets:%d, size:%d, dur:%d, serial:%d), "
  111. "pkt(pts:%lld,dts:%lld,size:%d,s_index:%d,dur:%lld,pos:%lld).",
  112. qUtf8Printable(prefix), q, q->nb_packets, q->size, q->duration,
  113. q->serial, pkt->pts, pkt->dts, pkt->size, pkt->stream_index,
  114. pkt->duration, pkt->pos);
  115. }
  116. int packet_queue_put(PacketQueue* q, AVPacket* pkt)
  117. {
  118. AVPacket* pkt1;
  119. int ret = -1;
  120. pkt1 = av_packet_alloc();
  121. if (!pkt1)
  122. {
  123. av_packet_unref(pkt);
  124. return ret;
  125. }
  126. av_packet_move_ref(pkt1, pkt);
  127. q->mutex->lock();
  128. ret = packet_queue_put_private(q, pkt1);
  129. q->mutex->unlock();
  130. if (ret < 0)
  131. av_packet_free(&pkt1);
  132. #if PRINT_PACKETQUEUE_INFO
  133. // packet_queue_print(q, pkt, "packet_queue_put");
  134. #endif
  135. return ret;
  136. }
  137. int packet_queue_put_nullpacket(PacketQueue* q, AVPacket* pkt, int stream_index)
  138. {
  139. pkt->stream_index = stream_index;
  140. return packet_queue_put(q, pkt);
  141. }
  142. int packet_queue_put_private(PacketQueue* q, AVPacket* pkt)
  143. {
  144. MyAVPacketList pkt1;
  145. int ret;
  146. if (q->abort_request)
  147. return -1;
  148. pkt1.pkt = pkt;
  149. pkt1.serial = q->serial;
  150. ret = av_fifo_write(q->pkt_list, &pkt1, 1);
  151. if (ret < 0)
  152. return ret;
  153. q->nb_packets++;
  154. q->size += pkt1.pkt->size + sizeof(pkt1);
  155. q->duration += pkt1.pkt->duration;
  156. /* XXX: should duplicate packet data in DV case */
  157. q->cond->wakeAll();
  158. return 0;
  159. }
  160. int frame_queue_init(FrameQueue* f, PacketQueue* pktq, int max_size, int keep_last)
  161. {
  162. int i;
  163. memset(f, 0, sizeof(FrameQueue));
  164. if (!(f->mutex = new QMutex()))
  165. {
  166. av_log(nullptr, AV_LOG_FATAL, "new QMutex() error!\n");
  167. return AVERROR(ENOMEM);
  168. }
  169. if (!(f->cond = new QWaitCondition()))
  170. {
  171. av_log(nullptr, AV_LOG_FATAL, "new QWaitCondition() error\n");
  172. return AVERROR(ENOMEM);
  173. }
  174. f->pktq = pktq;
  175. f->max_size = FFMIN(max_size, FRAME_QUEUE_SIZE);
  176. f->keep_last = !!keep_last;
  177. for (i = 0; i < f->max_size; i++)
  178. if (!(f->queue[i].frame = av_frame_alloc()))
  179. return AVERROR(ENOMEM);
  180. return 0;
  181. }
  182. void frame_queue_destory(FrameQueue* f)
  183. {
  184. int i;
  185. for (i = 0; i < f->max_size; i++)
  186. {
  187. Frame* vp = &f->queue[i];
  188. frame_queue_unref_item(vp);
  189. av_frame_free(&vp->frame);
  190. }
  191. delete f->mutex;
  192. delete f->cond;
  193. }
  194. void frame_queue_unref_item(Frame* vp)
  195. {
  196. av_frame_unref(vp->frame); // frame reference number reduce 1
  197. avsubtitle_free(&vp->sub); // sub
  198. }
  199. void frame_queue_signal(FrameQueue* f)
  200. {
  201. f->mutex->lock();
  202. f->cond->wakeAll();
  203. f->mutex->unlock();
  204. }
  205. Frame* frame_queue_peek(FrameQueue* f)
  206. {
  207. return &f->queue[(f->rindex + f->rindex_shown) % f->max_size];
  208. }
  209. Frame* frame_queue_peek_next(FrameQueue* f)
  210. {
  211. return &f->queue[(f->rindex + f->rindex_shown + 1) % f->max_size];
  212. }
  213. Frame* frame_queue_peek_last(FrameQueue* f) { return &f->queue[f->rindex]; }
  214. Frame* frame_queue_peek_writable(FrameQueue* f)
  215. {
  216. /* wait until we have space to put a new frame */
  217. f->mutex->lock();
  218. while (f->size >= f->max_size && !f->pktq->abort_request)
  219. {
  220. f->cond->wait(f->mutex);
  221. }
  222. f->mutex->unlock();
  223. if (f->pktq->abort_request)
  224. return nullptr;
  225. return &f->queue[f->windex];
  226. }
  227. Frame* frame_queue_peek_readable(FrameQueue* f)
  228. {
  229. /* wait until we have a readable a new frame */
  230. f->mutex->lock();
  231. while (f->size - f->rindex_shown <= 0 && !f->pktq->abort_request)
  232. {
  233. f->cond->wait(f->mutex);
  234. }
  235. f->mutex->unlock();
  236. if (f->pktq->abort_request)
  237. return nullptr;
  238. return &f->queue[(f->rindex + f->rindex_shown) % f->max_size];
  239. }
  240. void frame_queue_push(FrameQueue* f)
  241. {
  242. if (++f->windex == f->max_size)
  243. f->windex = 0;
  244. f->mutex->lock();
  245. f->size++;
  246. f->cond->wakeAll();
  247. f->mutex->unlock();
  248. }
  249. void frame_queue_next(FrameQueue* f)
  250. {
  251. if (f->keep_last && !f->rindex_shown)
  252. {
  253. f->rindex_shown = 1;
  254. return;
  255. }
  256. frame_queue_unref_item(&f->queue[f->rindex]);
  257. if (++f->rindex == f->max_size)
  258. f->rindex = 0;
  259. f->mutex->lock();
  260. f->size--;
  261. f->cond->wakeAll();
  262. f->mutex->unlock();
  263. }
  264. /* return the number of undisplayed frames in the queue */
  265. int frame_queue_nb_remaining(FrameQueue* f)
  266. {
  267. return f->size - f->rindex_shown;
  268. }
  269. /* return last shown position */
  270. int64_t frame_queue_last_pos(FrameQueue* f)
  271. {
  272. Frame* fp = &f->queue[f->rindex];
  273. if (f->rindex_shown && fp->serial == f->pktq->serial)
  274. return fp->pos;
  275. else
  276. return -1;
  277. }
  278. int queue_picture(VideoState* is, AVFrame* src_frame, double pts, double duration, int64_t pos, int serial)
  279. {
  280. #if PRINT_PACKETQUEUE_INFO
  281. // int64 lld, double lf
  282. qDebug("queue picture, w:%d, h:%d, nb:%d, ft:%d(%s), kf:%d, pic_t:%d(%c), "
  283. "pts:%lf, duration:%lf, pos:%lld, serial:%d",
  284. src_frame->width, src_frame->height, src_frame->nb_samples,
  285. src_frame->format,
  286. av_get_sample_fmt_name(AVSampleFormat(src_frame->format)),
  287. src_frame->key_frame, src_frame->pict_type,
  288. av_get_picture_type_char(src_frame->pict_type), pts, duration, pos,
  289. serial);
  290. #endif
  291. Frame* vp;
  292. if (!(vp = frame_queue_peek_writable(&is->pictq)))
  293. return -1;
  294. vp->sar = src_frame->sample_aspect_ratio;
  295. vp->uploaded = 0;
  296. vp->width = src_frame->width;
  297. vp->height = src_frame->height;
  298. vp->format = src_frame->format;
  299. vp->pts = pts;
  300. vp->duration = duration;
  301. vp->pos = pos;
  302. vp->serial = serial;
  303. av_frame_move_ref(vp->frame, src_frame);
  304. frame_queue_push(&is->pictq);
  305. return 0;
  306. }
  307. int get_video_frame(VideoState* is, AVFrame* frame)
  308. {
  309. int got_picture = -1;
  310. if ((got_picture = decoder_decode_frame(&is->viddec, frame, nullptr)) < 0)
  311. return -1;
  312. if (got_picture)
  313. {
  314. double dpts = NAN;
  315. if (frame->pts != AV_NOPTS_VALUE)
  316. dpts = av_q2d(is->video_st->time_base) * frame->pts;
  317. frame->sample_aspect_ratio =
  318. av_guess_sample_aspect_ratio(is->ic, is->video_st, frame);
  319. if (framedrop > 0 ||
  320. (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER))
  321. {
  322. if (frame->pts != AV_NOPTS_VALUE)
  323. {
  324. double diff = dpts - get_master_clock(is);
  325. if (!isnan(diff) && fabs(diff) < AV_NOSYNC_THRESHOLD &&
  326. diff - is->frame_last_filter_delay < 0 &&
  327. is->viddec.pkt_serial == is->vidclk.serial &&
  328. is->videoq.nb_packets)
  329. {
  330. is->frame_drops_early++;
  331. av_frame_unref(frame);
  332. got_picture = 0;
  333. }
  334. }
  335. }
  336. }
  337. return got_picture;
  338. }
  339. int decoder_init(Decoder* d, AVCodecContext* avctx, PacketQueue* queue, QWaitCondition* empty_queue_cond)
  340. {
  341. memset(d, 0, sizeof(Decoder));
  342. d->pkt = av_packet_alloc();
  343. if (!d->pkt)
  344. return AVERROR(ENOMEM);
  345. d->avctx = avctx;
  346. d->queue = queue;
  347. d->empty_queue_cond = empty_queue_cond;
  348. d->start_pts = AV_NOPTS_VALUE;
  349. d->pkt_serial = -1;
  350. return 0;
  351. }
  352. int decoder_start(Decoder* d, void* thread, const char* thread_name)
  353. {
  354. packet_queue_start(d->queue);
  355. d->decoder_tid = thread;
  356. d->decoder_name = av_strdup(thread_name);
  357. return 0;
  358. }
  359. void decoder_destroy(Decoder* d)
  360. {
  361. av_packet_free(&d->pkt);
  362. avcodec_free_context(&d->avctx);
  363. av_free(d->decoder_name);
  364. }
  365. void decoder_abort(Decoder* d, FrameQueue* fq)
  366. {
  367. packet_queue_abort(d->queue);
  368. frame_queue_signal(fq);
  369. // SDL_WaitThread(d->decoder_tid, nullptr);
  370. ((QThread*)(d->decoder_tid))->wait();
  371. d->decoder_tid = nullptr;
  372. packet_queue_flush(d->queue);
  373. }
  374. int decoder_decode_frame(Decoder* d, AVFrame* frame, AVSubtitle* sub)
  375. {
  376. int ret = AVERROR(EAGAIN);
  377. int decoder_reorder_pts = -1;
  378. for (;;)
  379. {
  380. if (d->queue->serial == d->pkt_serial)
  381. {
  382. do
  383. {
  384. if (d->queue->abort_request)
  385. return -1;
  386. switch (d->avctx->codec_type)
  387. {
  388. case AVMEDIA_TYPE_VIDEO:
  389. ret = avcodec_receive_frame(d->avctx, frame);
  390. if (ret >= 0)
  391. {
  392. if (decoder_reorder_pts == -1)
  393. {
  394. frame->pts = frame->best_effort_timestamp;
  395. }
  396. else if (!decoder_reorder_pts)
  397. {
  398. frame->pts = frame->pkt_dts;
  399. }
  400. }
  401. break;
  402. case AVMEDIA_TYPE_AUDIO:
  403. ret = avcodec_receive_frame(d->avctx, frame);
  404. if (ret >= 0)
  405. {
  406. AVRational tb = AVRational{1, frame->sample_rate};
  407. if (frame->pts != AV_NOPTS_VALUE)
  408. frame->pts = av_rescale_q(frame->pts, d->avctx->pkt_timebase, tb);
  409. else if (d->next_pts != AV_NOPTS_VALUE)
  410. frame->pts = av_rescale_q(d->next_pts, d->next_pts_tb, tb);
  411. if (frame->pts != AV_NOPTS_VALUE)
  412. {
  413. d->next_pts = frame->pts + frame->nb_samples;
  414. d->next_pts_tb = tb;
  415. }
  416. }
  417. break;
  418. }
  419. if (ret == AVERROR_EOF)
  420. {
  421. d->finished = d->pkt_serial;
  422. avcodec_flush_buffers(d->avctx);
  423. return 0;
  424. }
  425. if (ret >= 0)
  426. return 1;
  427. } while (ret != AVERROR(EAGAIN));
  428. }
  429. do
  430. {
  431. if (d->queue->nb_packets == 0)
  432. d->empty_queue_cond->wakeAll();
  433. if (d->packet_pending)
  434. {
  435. d->packet_pending = 0;
  436. }
  437. else
  438. {
  439. int old_serial = d->pkt_serial;
  440. if (packet_queue_get(d->queue, d->pkt, 1, &d->pkt_serial) < 0)
  441. return -1;
  442. if (old_serial != d->pkt_serial)
  443. {
  444. avcodec_flush_buffers(d->avctx);
  445. d->finished = 0;
  446. d->next_pts = d->start_pts;
  447. d->next_pts_tb = d->start_pts_tb;
  448. }
  449. }
  450. if (d->queue->serial == d->pkt_serial)
  451. break;
  452. av_packet_unref(d->pkt);
  453. } while (1);
  454. if (d->avctx->codec_type == AVMEDIA_TYPE_SUBTITLE)
  455. {
  456. int got_frame = 0;
  457. ret = avcodec_decode_subtitle2(d->avctx, sub, &got_frame, d->pkt);
  458. if (ret < 0)
  459. {
  460. ret = AVERROR(EAGAIN);
  461. }
  462. else
  463. {
  464. if (got_frame && !d->pkt->data)
  465. {
  466. d->packet_pending = 1;
  467. }
  468. ret = got_frame ? 0 : (d->pkt->data ? AVERROR(EAGAIN) : AVERROR_EOF);
  469. }
  470. av_packet_unref(d->pkt);
  471. }
  472. else
  473. {
  474. if (avcodec_send_packet(d->avctx, d->pkt) == AVERROR(EAGAIN))
  475. {
  476. av_log(d->avctx, AV_LOG_ERROR,
  477. "Receive_frame and send_packet both returned EAGAIN, which is "
  478. "an API violation.\n");
  479. d->packet_pending = 1;
  480. }
  481. else
  482. {
  483. av_packet_unref(d->pkt);
  484. }
  485. }
  486. }
  487. }
  488. void get_file_info(const char* filename, int64_t& duration)
  489. {
  490. AVFormatContext* pFormatCtx = avformat_alloc_context();
  491. if (avformat_open_input(&pFormatCtx, filename, NULL, NULL) == 0)
  492. {
  493. if (pFormatCtx->duration < 0)
  494. avformat_find_stream_info(pFormatCtx, NULL);
  495. duration = pFormatCtx->duration;
  496. }
  497. // etc
  498. avformat_close_input(&pFormatCtx);
  499. avformat_free_context(pFormatCtx);
  500. }
  501. void get_duration_time(const int64_t duration_us, int64_t& hours, int64_t& mins, int64_t& secs, int64_t& us)
  502. {
  503. int64_t duration = duration_us + (duration_us <= INT64_MAX - 5000 ? 5000 : 0);
  504. duration = duration < 0 ? 0 : duration;
  505. secs = duration / AV_TIME_BASE;
  506. us = duration % AV_TIME_BASE;
  507. us = (100 * us) / AV_TIME_BASE;
  508. mins = secs / 60;
  509. secs %= 60;
  510. hours = mins / 60;
  511. mins %= 60;
  512. }
  513. double get_clock(Clock* c)
  514. {
  515. if (*c->queue_serial != c->serial)
  516. return NAN;
  517. if (c->paused)
  518. {
  519. return c->pts;
  520. }
  521. else
  522. {
  523. double time = av_gettime_relative() / 1000000.0;
  524. return c->pts_drift + time - (time - c->last_updated) * (1.0 - c->speed);
  525. }
  526. }
  527. void set_clock_at(Clock* c, double pts, int serial, double time)
  528. {
  529. c->pts = pts;
  530. c->last_updated = time;
  531. c->pts_drift = c->pts - time;
  532. c->serial = serial;
  533. }
  534. void set_clock(Clock* c, double pts, int serial)
  535. {
  536. double time = av_gettime_relative() / 1000000.0;
  537. set_clock_at(c, pts, serial, time);
  538. }
  539. void set_clock_speed(Clock* c, double speed)
  540. {
  541. set_clock(c, get_clock(c), c->serial);
  542. c->speed = speed;
  543. }
  544. void init_clock(Clock* c, int* queue_serial)
  545. {
  546. c->speed = 1.0;
  547. c->paused = 0;
  548. c->queue_serial = queue_serial;
  549. set_clock(c, NAN, -1);
  550. }
  551. void sync_clock_to_slave(Clock* c, Clock* slave)
  552. {
  553. double clock = get_clock(c);
  554. double slave_clock = get_clock(slave);
  555. if (!isnan(slave_clock) &&
  556. (isnan(clock) || fabs(clock - slave_clock) > AV_NOSYNC_THRESHOLD))
  557. set_clock(c, slave_clock, slave->serial);
  558. }
  559. int stream_has_enough_packets(AVStream* st, int stream_id, PacketQueue* queue)
  560. {
  561. return stream_id < 0 || queue->abort_request ||
  562. (st->disposition & AV_DISPOSITION_ATTACHED_PIC) ||
  563. queue->nb_packets > MIN_FRAMES &&
  564. (!queue->duration ||
  565. av_q2d(st->time_base) * queue->duration > 1.0);
  566. }
  567. int is_realtime(AVFormatContext* s)
  568. {
  569. if (!strcmp(s->iformat->name, "rtp") || !strcmp(s->iformat->name, "rtsp") ||
  570. !strcmp(s->iformat->name, "sdp"))
  571. return 1;
  572. if (s->pb && (!strncmp(s->url, "rtp:", 4) || !strncmp(s->url, "udp:", 4)))
  573. return 1;
  574. return 0;
  575. }
  576. int get_master_sync_type(VideoState* is)
  577. {
  578. if (is->av_sync_type == AV_SYNC_VIDEO_MASTER)
  579. {
  580. if (is->video_st)
  581. return AV_SYNC_VIDEO_MASTER;
  582. else
  583. return AV_SYNC_AUDIO_MASTER;
  584. }
  585. else if (is->av_sync_type == AV_SYNC_AUDIO_MASTER)
  586. {
  587. if (is->audio_st)
  588. return AV_SYNC_AUDIO_MASTER;
  589. else
  590. return AV_SYNC_EXTERNAL_CLOCK;
  591. }
  592. else
  593. {
  594. return AV_SYNC_EXTERNAL_CLOCK;
  595. }
  596. }
  597. /* get the current master clock value */
  598. double get_master_clock(VideoState* is)
  599. {
  600. double val;
  601. switch (get_master_sync_type(is))
  602. {
  603. case AV_SYNC_VIDEO_MASTER:
  604. val = get_clock(&is->vidclk);
  605. break;
  606. case AV_SYNC_AUDIO_MASTER:
  607. val = get_clock(&is->audclk);
  608. break;
  609. default:
  610. val = get_clock(&is->extclk);
  611. break;
  612. }
  613. return val;
  614. }
  615. void check_external_clock_speed(VideoState* is)
  616. {
  617. if ((is->video_stream >= 0 &&
  618. is->videoq.nb_packets <= EXTERNAL_CLOCK_MIN_FRAMES) ||
  619. (is->audio_stream >= 0 &&
  620. is->audioq.nb_packets <= EXTERNAL_CLOCK_MIN_FRAMES))
  621. {
  622. set_clock_speed(&is->extclk,
  623. FFMAX(EXTERNAL_CLOCK_SPEED_MIN,
  624. is->extclk.speed - EXTERNAL_CLOCK_SPEED_STEP));
  625. }
  626. else if ((is->video_stream < 0 ||
  627. is->videoq.nb_packets > EXTERNAL_CLOCK_MAX_FRAMES) &&
  628. (is->audio_stream < 0 ||
  629. is->audioq.nb_packets > EXTERNAL_CLOCK_MAX_FRAMES))
  630. {
  631. set_clock_speed(&is->extclk,
  632. FFMIN(EXTERNAL_CLOCK_SPEED_MAX,
  633. is->extclk.speed + EXTERNAL_CLOCK_SPEED_STEP));
  634. }
  635. else
  636. {
  637. double speed = is->extclk.speed;
  638. if (speed != 1.0)
  639. set_clock_speed(&is->extclk, speed + EXTERNAL_CLOCK_SPEED_STEP *
  640. (1.0 - speed) /
  641. fabs(1.0 - speed));
  642. }
  643. }
  644. /* seek in the stream */
  645. void stream_seek(VideoState* is, int64_t pos, int64_t rel, int seek_by_bytes)
  646. {
  647. if (!is->seek_req)
  648. {
  649. is->seek_pos = pos;
  650. is->seek_rel = rel;
  651. is->seek_flags &= ~AVSEEK_FLAG_BYTE;
  652. if (seek_by_bytes)
  653. is->seek_flags |= AVSEEK_FLAG_BYTE;
  654. is->seek_req = 1;
  655. // SDL_CondSignal(is->continue_read_thread);
  656. is->continue_read_thread->wakeAll();
  657. }
  658. }
  659. /* pause or resume the video */
  660. // void stream_toggle_pause(VideoState* is, bool pause)
  661. //{
  662. // if (is->paused) {
  663. // is->frame_timer += av_gettime_relative() / 1000000.0 -
  664. //is->vidclk.last_updated; if (is->read_pause_return != AVERROR(ENOSYS)) {
  665. // is->vidclk.paused = 0;
  666. // }
  667. // set_clock(&is->vidclk, get_clock(&is->vidclk),
  668. //is->vidclk.serial);
  669. // }
  670. // set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);
  671. // is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused =
  672. //pause; // !is->paused; is->step = 0;
  673. //}
  674. void toggle_pause(VideoState* is, bool pause)
  675. {
  676. if (is->paused)
  677. {
  678. is->frame_timer +=
  679. av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;
  680. if (is->read_pause_return != AVERROR(ENOSYS))
  681. {
  682. is->vidclk.paused = 0;
  683. }
  684. set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);
  685. }
  686. set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);
  687. is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused =
  688. pause; // !is->paused;
  689. is->step = 0;
  690. }
  691. void toggle_mute(VideoState* is, bool mute)
  692. {
  693. bool muted = !!is->muted;
  694. if (muted != mute)
  695. {
  696. is->muted = mute;
  697. }
  698. }
  699. void update_volume(VideoState* is, int sign, double step)
  700. {
  701. double volume_level =
  702. is->audio_volume
  703. ? (20 * log(is->audio_volume / (double)SDL_MIX_MAXVOLUME) / log(10))
  704. : -1000.0;
  705. int new_volume =
  706. lrint(SDL_MIX_MAXVOLUME * pow(10.0, (volume_level + sign * step) / 20.0));
  707. is->audio_volume = av_clip(
  708. is->audio_volume == new_volume ? (is->audio_volume + sign) : new_volume,
  709. 0, SDL_MIX_MAXVOLUME);
  710. }
  711. void step_to_next_frame(VideoState* is)
  712. {
  713. /* if the stream is paused unpause it, then step */
  714. if (is->paused)
  715. toggle_pause(is, !is->paused);
  716. is->step = 1;
  717. }
  718. double compute_target_delay(double delay, VideoState* is)
  719. {
  720. double sync_threshold, diff = 0;
  721. /* update delay to follow master synchronisation source */
  722. if (get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)
  723. {
  724. /* if video is slave, we try to correct big delays by
  725. duplicating or deleting a frame */
  726. diff = get_clock(&is->vidclk) - get_master_clock(is);
  727. /* skip or repeat frame. We take into account the
  728. delay to compute the threshold. I still don't know
  729. if it is the best guess */
  730. sync_threshold =
  731. FFMAX(AV_SYNC_THRESHOLD_MIN, FFMIN(AV_SYNC_THRESHOLD_MAX, delay));
  732. if (!isnan(diff) && fabs(diff) < is->max_frame_duration)
  733. {
  734. if (diff <= -sync_threshold)
  735. delay = FFMAX(0, delay + diff);
  736. else if (diff >= sync_threshold && delay > AV_SYNC_FRAMEDUP_THRESHOLD)
  737. delay = delay + diff;
  738. else if (diff >= sync_threshold)
  739. delay = 2 * delay;
  740. }
  741. }
  742. av_log(nullptr, AV_LOG_TRACE, "video: delay=%0.3f A-V=%f\n", delay, -diff);
  743. return delay;
  744. }
  745. double vp_duration(VideoState* is, Frame* vp, Frame* nextvp)
  746. {
  747. if (vp->serial == nextvp->serial)
  748. {
  749. double duration = nextvp->pts - vp->pts;
  750. if (isnan(duration) || duration <= 0 || duration > is->max_frame_duration)
  751. return vp->duration;
  752. else
  753. return duration;
  754. }
  755. return 0.0;
  756. }
  757. void update_video_pts(VideoState* is, double pts, int64_t pos, int serial)
  758. {
  759. /* update current video pts */
  760. set_clock(&is->vidclk, pts, serial);
  761. sync_clock_to_slave(&is->extclk, &is->vidclk);
  762. }
  763. #if PRINT_PACKETQUEUE_INFO
  764. void print_state_info(VideoState* is)
  765. {
  766. if (is)
  767. {
  768. PacketQueue* pPacket = &is->videoq;
  769. qDebug("[VideoState] V PacketQueue[%p](nb_packets:%d,size:%d,dur:%lld, "
  770. "abort:%d, serial:%d)",
  771. pPacket, pPacket->nb_packets, pPacket->size, pPacket->duration,
  772. pPacket->abort_request, pPacket->serial);
  773. pPacket = &is->audioq;
  774. qDebug("[VideoState] A PacketQueue[%p](nb_packets:%d,size:%d,dur:%lld, "
  775. "abort:%d, serial:%d)",
  776. pPacket, pPacket->nb_packets, pPacket->size, pPacket->duration,
  777. pPacket->abort_request, pPacket->serial);
  778. pPacket = &is->subtitleq;
  779. qDebug("[VideoState] S PacketQueue[%p](nb_packets:%d,size:%d,dur:%lld, "
  780. "abort:%d, serial:%d)",
  781. pPacket, pPacket->nb_packets, pPacket->size, pPacket->duration,
  782. pPacket->abort_request, pPacket->serial);
  783. /*qDebug("[VideoState]FrameQueue(v:%p,a:%p,s:%p)",
  784. &is->pictq, &is->sampq, &is->subpq);
  785. qDebug("[VideoState]Decoder(v:%p,a:%p,s:%p)",
  786. &is->viddec, &is->auddec, &is->subdec);
  787. qDebug("[VideoState]Clock(v:%p,a:%p,s:%p)",
  788. &is->vidclk, &is->audclk, &is->extclk);*/
  789. }
  790. }
  791. #endif
  792. #if USE_AVFILTER_AUDIO
  793. void set_audio_playspeed(VideoState* is, double value)
  794. {
  795. if (value < 0 || value > 4)
  796. return;
  797. if (is->audio_speed == value)
  798. return;
  799. is->audio_speed = value;
  800. const size_t len = 32;
  801. if (!is->afilters)
  802. is->afilters = (char*)av_malloc(len);
  803. if (value <= 0.5)
  804. {
  805. snprintf(is->afilters, len, "atempo=0.5,");
  806. char tmp[128];
  807. snprintf(tmp, sizeof(tmp), "atempo=%lf", value / 0.5);
  808. // strncat(is->afilters, tmp, len - strlen(is->afilters) - 1);
  809. strncat_s(is->afilters, len, tmp, len - strlen(is->afilters) - 1);
  810. }
  811. else if (value <= 2.0)
  812. {
  813. snprintf(is->afilters, len, "atempo=%lf", value);
  814. }
  815. else
  816. {
  817. snprintf(is->afilters, len, "atempo=2.0,");
  818. char tmp[128];
  819. snprintf(tmp, sizeof(tmp), "atempo=%lf", value / 2.0);
  820. // strncat(is->afilters, tmp, len - strlen(is->afilters) - 1);
  821. strncat_s(is->afilters, len, tmp, len - strlen(is->afilters) - 1);
  822. }
  823. qDebug("changing audio filters to :%s", is->afilters);
  824. #if USE_AVFILTER_VIDEO
  825. set_video_playspeed(is);
  826. #endif
  827. is->audio_clock_old = is->audio_clock;
  828. is->req_afilter_reconfigure = 1;
  829. }
  830. void set_video_playspeed(VideoState* is)
  831. {
  832. double speed = is->audio_speed;
  833. size_t len = 32;
  834. if (!is->vfilters)
  835. is->vfilters = (char*)av_malloc(len);
  836. snprintf(is->vfilters, len, "setpts=%.4lf*PTS", 1.0 / speed);
  837. is->req_vfilter_reconfigure = 1;
  838. qDebug("changing video filters to :%s", is->vfilters);
  839. }
  840. int cmp_audio_fmts(enum AVSampleFormat fmt1, int64_t channel_count1,
  841. enum AVSampleFormat fmt2, int64_t channel_count2)
  842. {
  843. /* If channel count == 1, planar and non-planar formats are the same */
  844. if (channel_count1 == 1 && channel_count2 == 1)
  845. return av_get_packed_sample_fmt(fmt1) != av_get_packed_sample_fmt(fmt2);
  846. else
  847. return channel_count1 != channel_count2 || fmt1 != fmt2;
  848. }
  849. // int64_t get_valid_channel_layout(int64_t channel_layout, int channels)
  850. //{
  851. // if (channel_layout && av_get_channel_layout_nb_channels(channel_layout)
  852. //== channels) return channel_layout; else return 0;
  853. //}
  854. int configure_filtergraph(AVFilterGraph* graph, const char* filtergraph, AVFilterContext* source_ctx, AVFilterContext* sink_ctx)
  855. {
  856. int ret;
  857. int nb_filters = graph->nb_filters;
  858. AVFilterInOut *outputs = nullptr, *inputs = nullptr;
  859. if (filtergraph)
  860. {
  861. outputs = avfilter_inout_alloc();
  862. inputs = avfilter_inout_alloc();
  863. if (!outputs || !inputs)
  864. {
  865. ret = AVERROR(ENOMEM);
  866. goto fail;
  867. }
  868. outputs->name = av_strdup("in");
  869. outputs->filter_ctx = source_ctx;
  870. outputs->pad_idx = 0;
  871. outputs->next = nullptr;
  872. inputs->name = av_strdup("out");
  873. inputs->filter_ctx = sink_ctx;
  874. inputs->pad_idx = 0;
  875. inputs->next = nullptr;
  876. if ((ret = avfilter_graph_parse_ptr(graph, filtergraph, &inputs, &outputs,
  877. nullptr)) < 0)
  878. goto fail;
  879. }
  880. else
  881. {
  882. if ((ret = avfilter_link(source_ctx, 0, sink_ctx, 0)) < 0)
  883. goto fail;
  884. }
  885. /* Reorder the filters to ensure that inputs of the custom filters are merged
  886. * first */
  887. for (unsigned int i = 0; i < graph->nb_filters - nb_filters; i++)
  888. FFSWAP(AVFilterContext*, graph->filters[i],
  889. graph->filters[i + nb_filters]);
  890. ret = avfilter_graph_config(graph, nullptr);
  891. fail:
  892. avfilter_inout_free(&outputs);
  893. avfilter_inout_free(&inputs);
  894. return ret;
  895. }
  896. int configure_audio_filters(VideoState* is, const char* afilters, int force_output_format)
  897. {
  898. static const enum AVSampleFormat sample_fmts[] = {AV_SAMPLE_FMT_S16,
  899. AV_SAMPLE_FMT_NONE};
  900. int sample_rates[2] = {0, -1};
  901. // int64_t channel_layouts[2] = { 0, -1 };
  902. // AVChannelLayout channel_layouts[2] = {};
  903. // int channels[2] = { 0, -1 };
  904. AVFilterContext *filt_asrc = nullptr, *filt_asink = nullptr;
  905. // char aresample_swr_opts[512] = "";
  906. // const AVDictionaryEntry* e = nullptr;
  907. char asrc_args[256];
  908. int ret;
  909. AVBPrint bp;
  910. avfilter_graph_free(&is->agraph);
  911. if (!(is->agraph = avfilter_graph_alloc()))
  912. return AVERROR(ENOMEM);
  913. is->agraph->nb_threads = 0;
  914. /*while ((e = av_dict_get(swr_opts, "", e, AV_DICT_IGNORE_SUFFIX)))
  915. av_strlcatf(aresample_swr_opts, sizeof(aresample_swr_opts), "%s=%s:",
  916. e->key, e->value); if (strlen(aresample_swr_opts))
  917. aresample_swr_opts[strlen(aresample_swr_opts) - 1] = '\0';
  918. av_opt_set(is->agraph, "aresample_swr_opts", aresample_swr_opts, 0);*/
  919. av_bprint_init(&bp, 0, AV_BPRINT_SIZE_AUTOMATIC);
  920. av_channel_layout_describe_bprint(&is->audio_filter_src.ch_layout, &bp);
  921. snprintf(asrc_args, sizeof(asrc_args),
  922. "sample_rate=%d:sample_fmt=%s:time_base=%d/%d:channel_layout=%s",
  923. is->audio_filter_src.freq,
  924. av_get_sample_fmt_name(is->audio_filter_src.fmt), 1,
  925. is->audio_filter_src.freq, bp.str);
  926. ret = avfilter_graph_create_filter(
  927. &filt_asrc, avfilter_get_by_name("abuffer"), "ffplay_abuffer", asrc_args,
  928. nullptr, is->agraph);
  929. if (ret < 0)
  930. goto end;
  931. ret = avfilter_graph_create_filter(
  932. &filt_asink, avfilter_get_by_name("abuffersink"), "ffplay_abuffersink",
  933. nullptr, nullptr, is->agraph);
  934. if (ret < 0)
  935. goto end;
  936. if ((ret = av_opt_set_int_list(filt_asink, "sample_fmts", sample_fmts,
  937. AV_SAMPLE_FMT_NONE, AV_OPT_SEARCH_CHILDREN)) <
  938. 0)
  939. goto end;
  940. if ((ret = av_opt_set_int(filt_asink, "all_channel_counts", 1,
  941. AV_OPT_SEARCH_CHILDREN)) < 0)
  942. goto end;
  943. if (force_output_format)
  944. {
  945. sample_rates[0] = is->audio_filter_src.freq;
  946. // channel_layouts[0] = is->audio_filter_src.channel_layout;
  947. // channels[0] = is->audio_filter_src.channels;
  948. if ((ret = av_opt_set_int(filt_asink, "all_channel_counts", 0,
  949. AV_OPT_SEARCH_CHILDREN)) < 0)
  950. goto end;
  951. if ((ret = av_opt_set(filt_asink, "ch_layouts", bp.str,
  952. AV_OPT_SEARCH_CHILDREN)) < 0)
  953. goto end;
  954. /*if ((ret = av_opt_set_int_list(filt_asink, "channel_layouts",
  955. channel_layouts, -1, AV_OPT_SEARCH_CHILDREN)) < 0) goto end;*/
  956. /*if ((ret = av_opt_set_int_list(filt_asink, "channel_counts", channels, -1,
  957. AV_OPT_SEARCH_CHILDREN)) < 0) goto end;*/
  958. if ((ret = av_opt_set_int_list(filt_asink, "sample_rates", sample_rates, -1,
  959. AV_OPT_SEARCH_CHILDREN)) < 0)
  960. goto end;
  961. }
  962. if ((ret = configure_filtergraph(is->agraph, afilters, filt_asrc,
  963. filt_asink)) < 0)
  964. goto end;
  965. is->in_audio_filter = filt_asrc;
  966. is->out_audio_filter = filt_asink;
  967. end:
  968. if (ret < 0)
  969. avfilter_graph_free(&is->agraph);
  970. av_bprint_finalize(&bp, NULL);
  971. return ret;
  972. }
  973. int configure_video_filters(AVFilterGraph* graph, VideoState* is, const char* vfilters, AVFrame* frame)
  974. {
  975. enum AVPixelFormat pix_fmts[1]; // FF_ARRAY_ELEMS(sdl_texture_format_map)
  976. // char sws_flags_str[512] = "";
  977. char buffersrc_args[256];
  978. int ret;
  979. AVFilterContext *filt_src = nullptr, *filt_out = nullptr,
  980. *last_filter = nullptr;
  981. AVCodecParameters* codecpar = is->video_st->codecpar;
  982. AVRational fr = av_guess_frame_rate(is->ic, is->video_st, nullptr);
  983. // const AVDictionaryEntry* e = nullptr;
  984. int nb_pix_fmts = 0;
  985. /*
  986. int i, j;
  987. for (i = 0; i < renderer_info.num_texture_formats; i++) {
  988. for (j = 0; j < FF_ARRAY_ELEMS(sdl_texture_format_map) - 1; j++) {
  989. if (renderer_info.texture_formats[i] ==
  990. sdl_texture_format_map[j].texture_fmt) { pix_fmts[nb_pix_fmts++] =
  991. sdl_texture_format_map[j].format; break;
  992. }
  993. }
  994. }*/
  995. pix_fmts[nb_pix_fmts] = AV_PIX_FMT_NONE;
  996. /*while ((e = av_dict_get(sws_dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
  997. if (!strcmp(e->key, "sws_flags")) {
  998. av_strlcatf(sws_flags_str, sizeof(sws_flags_str), "%s=%s:",
  999. "flags", e->value);
  1000. }
  1001. else
  1002. av_strlcatf(sws_flags_str, sizeof(sws_flags_str), "%s=%s:",
  1003. e->key, e->value);
  1004. }
  1005. if (strlen(sws_flags_str))
  1006. sws_flags_str[strlen(sws_flags_str) - 1] = '\0';
  1007. graph->scale_sws_opts = av_strdup(sws_flags_str);*/
  1008. snprintf(buffersrc_args, sizeof(buffersrc_args),
  1009. "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
  1010. frame->width, frame->height, frame->format,
  1011. is->video_st->time_base.num, is->video_st->time_base.den,
  1012. codecpar->sample_aspect_ratio.num,
  1013. FFMAX(codecpar->sample_aspect_ratio.den, 1));
  1014. if (fr.num && fr.den)
  1015. av_strlcatf(buffersrc_args, sizeof(buffersrc_args), ":frame_rate=%d/%d",
  1016. fr.num, fr.den);
  1017. if ((ret = avfilter_graph_create_filter(
  1018. &filt_src, avfilter_get_by_name("buffer"), "ffplay_buffer",
  1019. buffersrc_args, nullptr, graph)) < 0)
  1020. goto fail;
  1021. ret = avfilter_graph_create_filter(
  1022. &filt_out, avfilter_get_by_name("buffersink"), "ffplay_buffersink",
  1023. nullptr, nullptr, graph);
  1024. if (ret < 0)
  1025. goto fail;
  1026. if ((ret = av_opt_set_int_list(filt_out, "pix_fmts", pix_fmts,
  1027. AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN)) < 0)
  1028. goto fail;
  1029. last_filter = filt_out;
  1030. #if 0
  1031. /* Note: this macro adds a filter before the lastly added filter, so the
  1032. * processing order of the filters is in reverse */
  1033. #define INSERT_FILT(name, arg) \
  1034. do \
  1035. { \
  1036. AVFilterContext* filt_ctx; \
  1037. \
  1038. ret = avfilter_graph_create_filter(&filt_ctx, avfilter_get_by_name(name), \
  1039. "ffplay_" name, arg, nullptr, graph); \
  1040. if (ret < 0) \
  1041. goto fail; \
  1042. \
  1043. ret = avfilter_link(filt_ctx, 0, last_filter, 0); \
  1044. if (ret < 0) \
  1045. goto fail; \
  1046. \
  1047. last_filter = filt_ctx; \
  1048. } while (0)
  1049. if (autorotate) {
  1050. int32_t* displaymatrix = (int32_t*)av_stream_get_side_data(is->video_st, AV_PKT_DATA_DISPLAYMATRIX, nullptr);
  1051. double theta = get_rotation(displaymatrix);
  1052. if (fabs(theta - 90) < 1.0) {
  1053. INSERT_FILT("transpose", "clock");
  1054. }
  1055. else if (fabs(theta - 180) < 1.0) {
  1056. INSERT_FILT("hflip", nullptr);
  1057. INSERT_FILT("vflip", nullptr);
  1058. }
  1059. else if (fabs(theta - 270) < 1.0) {
  1060. INSERT_FILT("transpose", "cclock");
  1061. }
  1062. else if (fabs(theta) > 1.0) {
  1063. char rotate_buf[64];
  1064. snprintf(rotate_buf, sizeof(rotate_buf), "%f*PI/180", theta);
  1065. INSERT_FILT("rotate", rotate_buf);
  1066. }
  1067. }
  1068. #endif
  1069. if ((ret = configure_filtergraph(graph, vfilters, filt_src, last_filter)) < 0)
  1070. goto fail;
  1071. is->in_video_filter = filt_src;
  1072. is->out_video_filter = filt_out;
  1073. fail:
  1074. return ret;
  1075. }
  1076. #if 0
  1077. int audio_open(void* opaque, int64_t wanted_channel_layout, int wanted_nb_channels, int wanted_sample_rate, struct AudioParams* audio_hw_params)
  1078. {
  1079. //SDL_AudioSpec wanted_spec, spec;
  1080. //const char* env;
  1081. static const int next_nb_channels[] = { 0, 0, 1, 6, 2, 6, 4, 6 };
  1082. static const int next_sample_rates[] = { 0, 44100, 48000, 96000, 192000 };
  1083. //int next_sample_rate_idx = FF_ARRAY_ELEMS(next_sample_rates) - 1;
  1084. /*env = SDL_getenv("SDL_AUDIO_CHANNELS");
  1085. if (env) {
  1086. wanted_nb_channels = atoi(env);
  1087. wanted_channel_layout = av_get_default_channel_layout(wanted_nb_channels);
  1088. }*/
  1089. if (!wanted_channel_layout || wanted_nb_channels != av_get_channel_layout_nb_channels(wanted_channel_layout)) {
  1090. wanted_channel_layout = av_get_default_channel_layout(wanted_nb_channels);
  1091. wanted_channel_layout &= ~AV_CH_LAYOUT_STEREO_DOWNMIX;
  1092. }
  1093. wanted_nb_channels = av_get_channel_layout_nb_channels(wanted_channel_layout);
  1094. /*
  1095. wanted_spec.channels = wanted_nb_channels;
  1096. wanted_spec.freq = wanted_sample_rate;
  1097. if (wanted_spec.freq <= 0 || wanted_spec.channels <= 0) {
  1098. av_log(nullptr, AV_LOG_ERROR, "Invalid sample rate or channel count!\n");
  1099. return -1;
  1100. }
  1101. while (next_sample_rate_idx && next_sample_rates[next_sample_rate_idx] >= wanted_spec.freq)
  1102. next_sample_rate_idx--;
  1103. wanted_spec.format = AUDIO_S16SYS;
  1104. wanted_spec.silence = 0;
  1105. wanted_spec.samples = FFMAX(SDL_AUDIO_MIN_BUFFER_SIZE, 2 << av_log2(wanted_spec.freq / SDL_AUDIO_MAX_CALLBACKS_PER_SEC));
  1106. wanted_spec.callback = sdl_audio_callback;
  1107. wanted_spec.userdata = opaque;
  1108. while (!(audio_dev = SDL_OpenAudioDevice(nullptr, 0, &wanted_spec, &spec, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE | SDL_AUDIO_ALLOW_CHANNELS_CHANGE))) {
  1109. av_log(nullptr, AV_LOG_WARNING, "SDL_OpenAudio (%d channels, %d Hz): %s\n",
  1110. wanted_spec.channels, wanted_spec.freq, SDL_GetError());
  1111. wanted_spec.channels = next_nb_channels[FFMIN(7, wanted_spec.channels)];
  1112. if (!wanted_spec.channels) {
  1113. wanted_spec.freq = next_sample_rates[next_sample_rate_idx--];
  1114. wanted_spec.channels = wanted_nb_channels;
  1115. if (!wanted_spec.freq) {
  1116. av_log(nullptr, AV_LOG_ERROR,
  1117. "No more combinations to try, audio open failed\n");
  1118. return -1;
  1119. }
  1120. }
  1121. wanted_channel_layout = av_get_default_channel_layout(wanted_spec.channels);
  1122. }
  1123. if (spec.format != AUDIO_S16SYS) {
  1124. av_log(nullptr, AV_LOG_ERROR,
  1125. "SDL advised audio format %d is not supported!\n", spec.format);
  1126. return -1;
  1127. }
  1128. if (spec.channels != wanted_spec.channels) {
  1129. wanted_channel_layout = av_get_default_channel_layout(spec.channels);
  1130. if (!wanted_channel_layout) {
  1131. av_log(nullptr, AV_LOG_ERROR,
  1132. "SDL advised channel count %d is not supported!\n", spec.channels);
  1133. return -1;
  1134. }
  1135. }*/
  1136. audio_hw_params->fmt = AV_SAMPLE_FMT_S16;
  1137. audio_hw_params->freq = wanted_sample_rate; // spec.freq;
  1138. audio_hw_params->channel_layout.nb_channels = wanted_channel_layout;
  1139. audio_hw_params->channels = wanted_nb_channels; // spec.channels;
  1140. audio_hw_params->frame_size = av_samples_get_buffer_size(nullptr, audio_hw_params->channels, 1, audio_hw_params->fmt, 1);
  1141. audio_hw_params->bytes_per_sec = av_samples_get_buffer_size(nullptr, audio_hw_params->channels, audio_hw_params->freq, audio_hw_params->fmt, 1);
  1142. if (audio_hw_params->bytes_per_sec <= 0 || audio_hw_params->frame_size <= 0) {
  1143. av_log(nullptr, AV_LOG_ERROR, "av_samples_get_buffer_size failed\n");
  1144. return -1;
  1145. }
  1146. return 0;// spec.size;
  1147. }
  1148. #endif
  1149. #endif