正在显示
1 个修改的文件
包含
76 行增加
和
74 行删除
| @@ -1551,6 +1551,45 @@ int SrsSource::on_audio_imp(SrsSharedPtrMessage* msg) | @@ -1551,6 +1551,45 @@ int SrsSource::on_audio_imp(SrsSharedPtrMessage* msg) | ||
| 1551 | bool is_aac_sequence_header = SrsFlvCodec::audio_is_sequence_header(msg->payload, msg->size); | 1551 | bool is_aac_sequence_header = SrsFlvCodec::audio_is_sequence_header(msg->payload, msg->size); |
| 1552 | bool is_sequence_header = is_aac_sequence_header; | 1552 | bool is_sequence_header = is_aac_sequence_header; |
| 1553 | 1553 | ||
| 1554 | + // whether consumer should drop for the duplicated sequence header. | ||
| 1555 | + bool drop_for_reduce = false; | ||
| 1556 | + if (is_sequence_header && cache_sh_audio && _srs_config->get_reduce_sequence_header(_req->vhost)) { | ||
| 1557 | + if (cache_sh_audio->size == msg->size) { | ||
| 1558 | + drop_for_reduce = srs_bytes_equals(cache_sh_audio->payload, msg->payload, msg->size); | ||
| 1559 | + srs_warn("drop for reduce sh audio, size=%d", msg->size); | ||
| 1560 | + } | ||
| 1561 | + } | ||
| 1562 | + | ||
| 1563 | + // cache the sequence header if aac | ||
| 1564 | + // donot cache the sequence header to gop_cache, return here. | ||
| 1565 | + if (is_aac_sequence_header) { | ||
| 1566 | + // parse detail audio codec | ||
| 1567 | + SrsAvcAacCodec codec; | ||
| 1568 | + SrsCodecSample sample; | ||
| 1569 | + if ((ret = codec.audio_aac_demux(msg->payload, msg->size, &sample)) != ERROR_SUCCESS) { | ||
| 1570 | + srs_error("source codec demux audio failed. ret=%d", ret); | ||
| 1571 | + return ret; | ||
| 1572 | + } | ||
| 1573 | + | ||
| 1574 | + static int flv_sample_sizes[] = {8, 16, 0}; | ||
| 1575 | + static int flv_sound_types[] = {1, 2, 0}; | ||
| 1576 | + | ||
| 1577 | + // when got audio stream info. | ||
| 1578 | + SrsStatistic* stat = SrsStatistic::instance(); | ||
| 1579 | + if ((ret = stat->on_audio_info(_req, SrsCodecAudioAAC, sample.sound_rate, sample.sound_type, codec.aac_object)) != ERROR_SUCCESS) { | ||
| 1580 | + return ret; | ||
| 1581 | + } | ||
| 1582 | + | ||
| 1583 | + srs_trace("%dB audio sh, codec(%d, profile=%s, %dchannels, %dkbps, %dHZ), " | ||
| 1584 | + "flv(%dbits, %dchannels, %dHZ)", | ||
| 1585 | + msg->size, codec.audio_codec_id, | ||
| 1586 | + srs_codec_aac_object2str(codec.aac_object).c_str(), codec.aac_channels, | ||
| 1587 | + codec.audio_data_rate / 1000, aac_sample_rates[codec.aac_sample_rate], | ||
| 1588 | + flv_sample_sizes[sample.sound_size], flv_sound_types[sample.sound_type], | ||
| 1589 | + flv_sample_rates[sample.sound_rate]); | ||
| 1590 | + return ret; | ||
| 1591 | + } | ||
| 1592 | + | ||
| 1554 | #ifdef SRS_AUTO_HLS | 1593 | #ifdef SRS_AUTO_HLS |
| 1555 | if ((ret = hls->on_audio(msg)) != ERROR_SUCCESS) { | 1594 | if ((ret = hls->on_audio(msg)) != ERROR_SUCCESS) { |
| 1556 | // apply the error strategy for hls. | 1595 | // apply the error strategy for hls. |
| @@ -1604,13 +1643,6 @@ int SrsSource::on_audio_imp(SrsSharedPtrMessage* msg) | @@ -1604,13 +1643,6 @@ int SrsSource::on_audio_imp(SrsSharedPtrMessage* msg) | ||
| 1604 | #endif | 1643 | #endif |
| 1605 | 1644 | ||
| 1606 | // copy to all consumer | 1645 | // copy to all consumer |
| 1607 | - bool drop_for_reduce = false; | ||
| 1608 | - if (is_sequence_header && cache_sh_audio && _srs_config->get_reduce_sequence_header(_req->vhost)) { | ||
| 1609 | - if (cache_sh_audio->size == msg->size) { | ||
| 1610 | - drop_for_reduce = srs_bytes_equals(cache_sh_audio->payload, msg->payload, msg->size); | ||
| 1611 | - srs_warn("drop for reduce sh audio, size=%d", msg->size); | ||
| 1612 | - } | ||
| 1613 | - } | ||
| 1614 | if (!drop_for_reduce) { | 1646 | if (!drop_for_reduce) { |
| 1615 | for (int i = 0; i < (int)consumers.size(); i++) { | 1647 | for (int i = 0; i < (int)consumers.size(); i++) { |
| 1616 | SrsConsumer* consumer = consumers.at(i); | 1648 | SrsConsumer* consumer = consumers.at(i); |
| @@ -1641,37 +1673,6 @@ int SrsSource::on_audio_imp(SrsSharedPtrMessage* msg) | @@ -1641,37 +1673,6 @@ int SrsSource::on_audio_imp(SrsSharedPtrMessage* msg) | ||
| 1641 | srs_freep(cache_sh_audio); | 1673 | srs_freep(cache_sh_audio); |
| 1642 | cache_sh_audio = msg->copy(); | 1674 | cache_sh_audio = msg->copy(); |
| 1643 | } | 1675 | } |
| 1644 | - | ||
| 1645 | - // cache the sequence header if aac | ||
| 1646 | - // donot cache the sequence header to gop_cache, return here. | ||
| 1647 | - if (is_aac_sequence_header) { | ||
| 1648 | - // parse detail audio codec | ||
| 1649 | - SrsAvcAacCodec codec; | ||
| 1650 | - SrsCodecSample sample; | ||
| 1651 | - if ((ret = codec.audio_aac_demux(msg->payload, msg->size, &sample)) != ERROR_SUCCESS) { | ||
| 1652 | - srs_error("source codec demux audio failed. ret=%d", ret); | ||
| 1653 | - return ret; | ||
| 1654 | - } | ||
| 1655 | - | ||
| 1656 | - static int flv_sample_sizes[] = {8, 16, 0}; | ||
| 1657 | - static int flv_sound_types[] = {1, 2, 0}; | ||
| 1658 | - | ||
| 1659 | - // when got audio stream info. | ||
| 1660 | - SrsStatistic* stat = SrsStatistic::instance(); | ||
| 1661 | - if ((ret = stat->on_audio_info(_req, SrsCodecAudioAAC, sample.sound_rate, sample.sound_type, codec.aac_object)) != ERROR_SUCCESS) { | ||
| 1662 | - return ret; | ||
| 1663 | - } | ||
| 1664 | - | ||
| 1665 | - srs_trace("%dB audio sh, " | ||
| 1666 | - "codec(%d, profile=%s, %dchannels, %dkbps, %dHZ), " | ||
| 1667 | - "flv(%dbits, %dchannels, %dHZ)", | ||
| 1668 | - msg->size, codec.audio_codec_id, | ||
| 1669 | - srs_codec_aac_object2str(codec.aac_object).c_str(), codec.aac_channels, | ||
| 1670 | - codec.audio_data_rate / 1000, aac_sample_rates[codec.aac_sample_rate], | ||
| 1671 | - flv_sample_sizes[sample.sound_size], flv_sound_types[sample.sound_type], | ||
| 1672 | - flv_sample_rates[sample.sound_rate]); | ||
| 1673 | - return ret; | ||
| 1674 | - } | ||
| 1675 | 1676 | ||
| 1676 | // cache the last gop packets | 1677 | // cache the last gop packets |
| 1677 | if ((ret = gop_cache->cache(msg)) != ERROR_SUCCESS) { | 1678 | if ((ret = gop_cache->cache(msg)) != ERROR_SUCCESS) { |
| @@ -1761,6 +1762,43 @@ int SrsSource::on_video_imp(SrsSharedPtrMessage* msg) | @@ -1761,6 +1762,43 @@ int SrsSource::on_video_imp(SrsSharedPtrMessage* msg) | ||
| 1761 | 1762 | ||
| 1762 | bool is_sequence_header = SrsFlvCodec::video_is_sequence_header(msg->payload, msg->size); | 1763 | bool is_sequence_header = SrsFlvCodec::video_is_sequence_header(msg->payload, msg->size); |
| 1763 | 1764 | ||
| 1765 | + // whether consumer should drop for the duplicated sequence header. | ||
| 1766 | + bool drop_for_reduce = false; | ||
| 1767 | + if (is_sequence_header && cache_sh_video && _srs_config->get_reduce_sequence_header(_req->vhost)) { | ||
| 1768 | + if (cache_sh_video->size == msg->size) { | ||
| 1769 | + drop_for_reduce = srs_bytes_equals(cache_sh_video->payload, msg->payload, msg->size); | ||
| 1770 | + srs_warn("drop for reduce sh video, size=%d", msg->size); | ||
| 1771 | + } | ||
| 1772 | + } | ||
| 1773 | + | ||
| 1774 | + // cache the sequence header if h264 | ||
| 1775 | + // donot cache the sequence header to gop_cache, return here. | ||
| 1776 | + if (is_sequence_header) { | ||
| 1777 | + srs_freep(cache_sh_video); | ||
| 1778 | + cache_sh_video = msg->copy(); | ||
| 1779 | + | ||
| 1780 | + // parse detail audio codec | ||
| 1781 | + SrsAvcAacCodec codec; | ||
| 1782 | + SrsCodecSample sample; | ||
| 1783 | + if ((ret = codec.video_avc_demux(msg->payload, msg->size, &sample)) != ERROR_SUCCESS) { | ||
| 1784 | + srs_error("source codec demux video failed. ret=%d", ret); | ||
| 1785 | + return ret; | ||
| 1786 | + } | ||
| 1787 | + | ||
| 1788 | + // when got video stream info. | ||
| 1789 | + SrsStatistic* stat = SrsStatistic::instance(); | ||
| 1790 | + if ((ret = stat->on_video_info(_req, SrsCodecVideoAVC, codec.avc_profile, codec.avc_level)) != ERROR_SUCCESS) { | ||
| 1791 | + return ret; | ||
| 1792 | + } | ||
| 1793 | + | ||
| 1794 | + srs_trace("%dB video sh, codec(%d, profile=%s, level=%s, %dx%d, %dkbps, %dfps, %ds)", | ||
| 1795 | + msg->size, codec.video_codec_id, | ||
| 1796 | + srs_codec_avc_profile2str(codec.avc_profile).c_str(), | ||
| 1797 | + srs_codec_avc_level2str(codec.avc_level).c_str(), codec.width, codec.height, | ||
| 1798 | + codec.video_data_rate / 1000, codec.frame_rate, codec.duration); | ||
| 1799 | + return ret; | ||
| 1800 | + } | ||
| 1801 | + | ||
| 1764 | #ifdef SRS_AUTO_HLS | 1802 | #ifdef SRS_AUTO_HLS |
| 1765 | if ((ret = hls->on_video(msg)) != ERROR_SUCCESS) { | 1803 | if ((ret = hls->on_video(msg)) != ERROR_SUCCESS) { |
| 1766 | // apply the error strategy for hls. | 1804 | // apply the error strategy for hls. |
| @@ -1814,13 +1852,6 @@ int SrsSource::on_video_imp(SrsSharedPtrMessage* msg) | @@ -1814,13 +1852,6 @@ int SrsSource::on_video_imp(SrsSharedPtrMessage* msg) | ||
| 1814 | #endif | 1852 | #endif |
| 1815 | 1853 | ||
| 1816 | // copy to all consumer | 1854 | // copy to all consumer |
| 1817 | - bool drop_for_reduce = false; | ||
| 1818 | - if (is_sequence_header && cache_sh_video && _srs_config->get_reduce_sequence_header(_req->vhost)) { | ||
| 1819 | - if (cache_sh_video->size == msg->size) { | ||
| 1820 | - drop_for_reduce = srs_bytes_equals(cache_sh_video->payload, msg->payload, msg->size); | ||
| 1821 | - srs_warn("drop for reduce sh video, size=%d", msg->size); | ||
| 1822 | - } | ||
| 1823 | - } | ||
| 1824 | if (!drop_for_reduce) { | 1855 | if (!drop_for_reduce) { |
| 1825 | for (int i = 0; i < (int)consumers.size(); i++) { | 1856 | for (int i = 0; i < (int)consumers.size(); i++) { |
| 1826 | SrsConsumer* consumer = consumers.at(i); | 1857 | SrsConsumer* consumer = consumers.at(i); |
| @@ -1844,35 +1875,6 @@ int SrsSource::on_video_imp(SrsSharedPtrMessage* msg) | @@ -1844,35 +1875,6 @@ int SrsSource::on_video_imp(SrsSharedPtrMessage* msg) | ||
| 1844 | } | 1875 | } |
| 1845 | } | 1876 | } |
| 1846 | 1877 | ||
| 1847 | - // cache the sequence header if h264 | ||
| 1848 | - // donot cache the sequence header to gop_cache, return here. | ||
| 1849 | - if (is_sequence_header) { | ||
| 1850 | - srs_freep(cache_sh_video); | ||
| 1851 | - cache_sh_video = msg->copy(); | ||
| 1852 | - | ||
| 1853 | - // parse detail audio codec | ||
| 1854 | - SrsAvcAacCodec codec; | ||
| 1855 | - SrsCodecSample sample; | ||
| 1856 | - if ((ret = codec.video_avc_demux(msg->payload, msg->size, &sample)) != ERROR_SUCCESS) { | ||
| 1857 | - srs_error("source codec demux video failed. ret=%d", ret); | ||
| 1858 | - return ret; | ||
| 1859 | - } | ||
| 1860 | - | ||
| 1861 | - // when got video stream info. | ||
| 1862 | - SrsStatistic* stat = SrsStatistic::instance(); | ||
| 1863 | - if ((ret = stat->on_video_info(_req, SrsCodecVideoAVC, codec.avc_profile, codec.avc_level)) != ERROR_SUCCESS) { | ||
| 1864 | - return ret; | ||
| 1865 | - } | ||
| 1866 | - | ||
| 1867 | - srs_trace("%dB video sh, " | ||
| 1868 | - "codec(%d, profile=%s, level=%s, %dx%d, %dkbps, %dfps, %ds)", | ||
| 1869 | - msg->size, codec.video_codec_id, | ||
| 1870 | - srs_codec_avc_profile2str(codec.avc_profile).c_str(), | ||
| 1871 | - srs_codec_avc_level2str(codec.avc_level).c_str(), codec.width, codec.height, | ||
| 1872 | - codec.video_data_rate / 1000, codec.frame_rate, codec.duration); | ||
| 1873 | - return ret; | ||
| 1874 | - } | ||
| 1875 | - | ||
| 1876 | // cache the last gop packets | 1878 | // cache the last gop packets |
| 1877 | if ((ret = gop_cache->cache(msg)) != ERROR_SUCCESS) { | 1879 | if ((ret = gop_cache->cache(msg)) != ERROR_SUCCESS) { |
| 1878 | srs_error("gop cache msg failed. ret=%d", ret); | 1880 | srs_error("gop cache msg failed. ret=%d", ret); |
-
请 注册 或 登录 后发表评论