[FFmpeg-devel] [PATCH] libavformat/rtmppkt.c ff_rtmp_packet_write write RTMP_PS_ONEBYTE chunks based on hypothesis than channel_id < 64.
Steven Liu
lingjiujianke at gmail.com
Mon Jan 23 08:26:33 EET 2017
2017-01-23 13:55 GMT+08:00 Wentao Tang <wentao.t at hotmail.com>:
> Although ffmpeg use internel defined video and audio channel ids that are
> than less than 64, I think it's better to patch ff_rtmp_packet_write write
> chunk logic for more clearness?
>
> here is the patch(already tested by changing RTMP_VIDEO_CHANNEL >64 even
> >256):
>
> diff --git a/libavformat/rtmppkt.c b/libavformat/rtmppkt.c
> index cde0da7..51288ad 100644
> --- a/libavformat/rtmppkt.c
> +++ b/libavformat/rtmppkt.c
> @@ -310,6 +310,18 @@ int ff_rtmp_packet_read_internal(URLContext *h,
> RTMPPacket *p, int chunk_size,
> }
> }
>
> +static void ff_rtmp_packet_write_chunk_basic_header(uint8_t **p, int
> mode, int channel_id) {
> + if (channel_id < 64) {
> + bytestream_put_byte(p, channel_id | (mode << 6));
> + } else if (channel_id < 64 + 256) {
> + bytestream_put_byte(p, 0 | (mode << 6));
> + bytestream_put_byte(p, channel_id - 64);
> + } else {
> + bytestream_put_byte(p, 1 | (mode << 6));
> + bytestream_put_le16(p, channel_id - 64);
> + }
> +}
> +
> int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
> int chunk_size, RTMPPacket **prev_pkt_ptr,
> int *nb_prev_pkt)
> @@ -354,15 +366,8 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket
> *pkt,
> }
> }
>
> - if (pkt->channel_id < 64) {
> - bytestream_put_byte(&p, pkt->channel_id | (mode << 6));
> - } else if (pkt->channel_id < 64 + 256) {
> - bytestream_put_byte(&p, 0 | (mode << 6));
> - bytestream_put_byte(&p, pkt->channel_id - 64);
> - } else {
> - bytestream_put_byte(&p, 1 | (mode << 6));
> - bytestream_put_le16(&p, pkt->channel_id - 64);
> - }
> + ff_rtmp_packet_write_chunk_basic_header(&p, mode, pkt->channel_id);
> +
> if (mode != RTMP_PS_ONEBYTE) {
> bytestream_put_be24(&p, pkt->ts_field);
> if (mode != RTMP_PS_FOURBYTES) {
> @@ -391,10 +396,12 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket
> *pkt,
> return ret;
> off += towrite;
> if (off < pkt->size) {
> - uint8_t marker = 0xC0 | pkt->channel_id;
> - if ((ret = ffurl_write(h, &marker, 1)) < 0)
> + p = pkt_hdr;
> + ff_rtmp_packet_write_chunk_basic_header(&p, RTMP_PS_ONEBYTE,
> pkt->channel_id);
> + if ((ret = ffurl_write(h, pkt_hdr, p - pkt_hdr)) < 0)
> return ret;
> - written++;
> + written += p - pkt_hdr;
> +
> if (pkt->ts_field == 0xFFFFFF) {
> uint8_t ts_header[4];
> AV_WB32(ts_header, timestamp);
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
http://ffmpeg.org/git-howto.html
use git format-patch make patch please.
More information about the ffmpeg-devel
mailing list