diff --git a/libavformat/swf.c b/libavformat/swf.c
index f8b7c2675dc5c32a84fe542d06b379219fba33c9..21588fc01286f647f25e13acc863bba72752bc35 100644
--- a/libavformat/swf.c
+++ b/libavformat/swf.c
@@ -833,6 +833,16 @@ static int swf_read_header(AVFormatContext *s, AVFormatParameters *ap)
             if (len > 4)
                 url_fskip(pb,len-4);
 
+        } else if (tag == TAG_JPEG2 && !vst) {
+            vst = av_new_stream(s, -2); /* -2 to avoid clash with video stream and audio stream */
+            av_set_pts_info(vst, 24, 1, 1000); /* 24 bit pts in ms */
+            vst->codec->codec_type = CODEC_TYPE_VIDEO;
+            vst->codec->codec_id = CODEC_ID_MJPEG;
+            if (swf->samples_per_frame) {
+                vst->codec->time_base.den = 1000. / swf->ms_per_frame;
+                vst->codec->time_base.num = 1;
+            }
+            url_fskip(pb, len);
         } else {
             url_fskip(pb, len);
         }
@@ -874,6 +884,24 @@ static int swf_read_packet(AVFormatContext *s, AVPacket *pkt)
                 pkt->stream_index = st->index;
                 return pkt->size;
             }
+        } else if (tag == TAG_JPEG2) {
+            for (i=0; i<s->nb_streams; i++) {
+                st = s->streams[i];
+                if (st->id == -2) {
+                    get_le16(pb); /* BITMAP_ID */
+                    av_new_packet(pkt, len-2);
+                    get_buffer(pb, pkt->data, 4);
+                    if (BE_32(pkt->data) == 0xffd8ffd9) {
+                        /* old SWF files containing SOI/EOI as data start */
+                        pkt->size -= 4;
+                        get_buffer(pb, pkt->data, pkt->size);
+                    } else {
+                        get_buffer(pb, pkt->data + 4, pkt->size - 4);
+                    }
+                    pkt->stream_index = st->index;
+                    return pkt->size;
+                }
+            }
         }
         url_fskip(pb, len);
     }