On Tue, Dec 08, 2015 at 02:10:32PM +0200, Andrey Utkin wrote: > This enables us to process pics larger than 2040 pixels in dimensions, > overcoming the limitation of RFC 2435. > > Signed-off-by: Andrey Utkin <[email protected]> > --- > libavformat/rtpdec_jpeg.c | 46 +++++++++++++++++++++++++++++++++++++++++++--- > 1 file changed, 43 insertions(+), 3 deletions(-) > > diff --git a/libavformat/rtpdec_jpeg.c b/libavformat/rtpdec_jpeg.c > index 6bf88f8..0a83468 100644 > --- a/libavformat/rtpdec_jpeg.c > +++ b/libavformat/rtpdec_jpeg.c > @@ -24,9 +24,11 @@ > #include "rtpdec.h" > #include "rtpdec_formats.h" > #include "libavutil/intreadwrite.h" > +#include "libavutil/avstring.h" > #include "libavcodec/jpegtables.h" > #include "libavcodec/mjpeg.h" > #include "libavcodec/bytestream.h" > +#include "libavformat/rtpdec_formats.h" > > /** > * RTP/JPEG specific private data. > @@ -35,6 +37,14 @@ struct PayloadContext { > AVIOContext *frame; ///< current frame buffer > uint32_t timestamp; ///< current frame timestamp > int hdr_size; ///< size of the current frame header > + /** > + * Flag, shows whether we got framesize explicitly from SDP. > + * If set, override dimensions from RTP header. > + * Workaround for dimensions larger than 2040 (limitation of RFC 2435). > + */ > + int sdp_framesize_set; > + int sdp_width; > + int sdp_height; > uint8_t qtables[128][128]; > uint8_t qtables_len[128]; > }; > @@ -215,7 +225,8 @@ static int jpeg_parse_packet(AVFormatContext *ctx, > PayloadContext *jpeg, > const uint8_t *buf, int len, uint16_t seq, > int flags) > { > - uint8_t type, q, width, height; > + uint8_t type, q; > + uint32_t width, height; > const uint8_t *qtables = NULL; > uint16_t qtable_len; > uint32_t off;
> @@ -230,8 +241,13 @@ static int jpeg_parse_packet(AVFormatContext *ctx,
> PayloadContext *jpeg,
> off = AV_RB24(buf + 1); /* fragment byte offset */
> type = AV_RB8(buf + 4); /* id of jpeg decoder params */
> q = AV_RB8(buf + 5); /* quantization factor (or table id) */
> - width = AV_RB8(buf + 6); /* frame width in 8 pixel blocks */
> - height = AV_RB8(buf + 7); /* frame height in 8 pixel blocks */
> + if (jpeg->sdp_framesize_set) {
> + width = FF_CEIL_RSHIFT(jpeg->sdp_width, 3);
> + height = FF_CEIL_RSHIFT(jpeg->sdp_height, 3);
i dont think the lowest 3 bits should be discarded
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Awnsering whenever a program halts or runs forever is
On a turing machine, in general impossible (turings halting problem).
On any real computer, always possible as a real computer has a finite number
of states N, and will either halt in less than N cycles or never halt.
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list [email protected] http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
