packets_sync.cpp 42 KB

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