Changeset 4704


Ignore:
Timestamp:
Nov 3, 2010 10:31:38 PM (4 years ago)
Author:
sam
Message:

YUV support in dumpmovie and makemovie.

Location:
libpipi/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • libpipi/trunk/examples/dumpmovie.c

    r4703 r4704  
    3838    uint8_t *dst[4], *data = NULL;
    3939    char *parser;
    40     int stream, pitch[4], i, k = 0;
     40    int stream, pitch[4], i, k = 0, nframes = -1;
     41    double skip_seconds = 0.0;
    4142
    42     if(argc < 2)
     43    if (argc < 2)
    4344        return EXIT_FAILURE;
     45
     46    if (argc > 2)
     47        skip_seconds = atof(argv[2]);
     48    if (argc > 3)
     49        nframes = atoi(argv[3]);
    4450
    4551    /* Ensure our linear YUV values do not get gamma-corrected */
     
    7379        return EXIT_FAILURE;
    7480
     81    skip_seconds /= av_q2d(fmt->streams[stream]->time_base);
     82    av_seek_frame(fmt, stream, (int)(skip_seconds + 0.5), SEEK_SET);
     83    //avformat_seek_file(fmt, stream, skip_bytes, skip_bytes,
     84    //                   skip_bytes, AVSEEK_FLAG_BYTE);
     85
    7586    frame = avcodec_alloc_frame();
    7687
    77     for(;;)
     88    for (k = 0; k < nframes || nframes == -1; /* k incremented below */)
    7889    {
    7990        int finished, ret, x, y;
     
    113124        }
    114125
    115         sws_scale(sws, (uint8_t const **)frame->data, frame->linesize, 0,
    116                   ctx->height, dst, pitch);
    117 
    118         p = pipi_get_pixels(image, PIPI_PIXELS_RGBA_U8);
    119         data = (uint8_t *)p->pixels;
    120 
    121         for (y = 0; y < ctx->height; y++)
    122         {
    123             int off = y * ctx->width;
    124 
    125             for (x = 0; x < ctx->width; x++, off++)
    126             {
    127                 /* Reorder components to store YUVA */
    128                 data[4 * off] = dst[0][off];
    129                 data[4 * off + 1] = dst[2][off];
    130                 data[4 * off + 2] = dst[1][off];
    131                 data[4 * off + 3] = 0xff;
    132             }
    133         }
    134 
    135126        {
    136127            char buf[1024];
    137             sprintf(buf, fmtstr, k++);
     128            sprintf(buf, fmtstr, k);
    138129            printf("saving in %s\n", buf);
     130
     131            sws_scale(sws, (uint8_t const **)frame->data, frame->linesize, 0,
     132                      ctx->height, dst, pitch);
     133
     134            p = pipi_get_pixels(image, PIPI_PIXELS_RGBA_U8);
     135            data = (uint8_t *)p->pixels;
     136
     137            for (y = 0; y < ctx->height; y++)
     138            {
     139                int off = y * ctx->width;
     140
     141                for (x = 0; x < ctx->width; x++, off++)
     142                {
     143                    /* Reorder components to store YUVA */
     144                    data[4 * off] = dst[0][off];
     145                    data[4 * off + 1] = dst[2][off];
     146                    data[4 * off + 2] = dst[1][off];
     147                    data[4 * off + 3] = 0xff;
     148                }
     149            }
     150
    139151            pipi_save(image, buf);
    140152        }
    141153
    142154        av_free_packet(&packet);
     155
     156        k++;
    143157    }
    144158
  • libpipi/trunk/pipi/pipi_internals.h

    r3627 r4704  
    8686{
    8787    int w, h, fps;
     88    uint8_t *convert_buf;
    8889
    8990    void *codec_priv;
  • libpipi/trunk/pipi/sequence.c

    r4700 r4704  
    7070    seq->h = height;
    7171    seq->fps = fps;
     72    seq->convert_buf = NULL;
    7273
    7374    ff = malloc(sizeof(ffmpeg_codec_t));
     
    201202#if defined USE_FFMPEG
    202203    AVPacket packet;
     204    uint8_t const *buflist[3];
     205    int pitchlist[3];
    203206    size_t bytes;
    204     int pitch;
     207    int n;
    205208
    206209    ffmpeg_codec_t *ff = (ffmpeg_codec_t *)seq->codec_priv;
     
    216219
    217220    if (!ff->sws_ctx)
    218         ff->sws_ctx = sws_getContext(width, height, PIX_FMT_RGB32,
    219                                        ff->cod_ctx->width,
    220                                        ff->cod_ctx->height,
    221                                        ff->cod_ctx->pix_fmt, SWS_BICUBIC,
    222                                        NULL, NULL, NULL);
     221    {
     222        ff->sws_ctx = sws_getContext(width, height, PIX_FMT_YUV444P,
     223                                     ff->cod_ctx->width,
     224                                     ff->cod_ctx->height,
     225                                     ff->cod_ctx->pix_fmt, SWS_BICUBIC,
     226                                     NULL, NULL, NULL);
     227        if (seq->convert_buf)
     228        {
     229           free(seq->convert_buf);
     230           seq->convert_buf = NULL;
     231        }
     232    }
    223233    if (!ff->sws_ctx)
    224234        return -1;
    225235
    226     pitch = width * 4;
    227     sws_scale(ff->sws_ctx, &buffer, &pitch, 0, height,
     236    /* Convert interleaved YUV to planar YUV */
     237    if (!seq->convert_buf)
     238        seq->convert_buf = malloc(width * height * 3);
     239
     240    for (n = 0; n < width * height; n++)
     241    {
     242        seq->convert_buf[n] = buffer[4 * n];
     243        seq->convert_buf[n + width * height] = buffer[4 * n + 1];
     244        seq->convert_buf[n + 2 * width * height] = buffer[4 * n + 2];
     245    }
     246
     247    /* Feed the buffers to FFmpeg */
     248    buflist[0] = seq->convert_buf;
     249    buflist[1] = seq->convert_buf + 2 * width * height;
     250    buflist[2] = seq->convert_buf + width * height;
     251    pitchlist[0] = pitchlist[1] = pitchlist[2] = width;
     252    sws_scale(ff->sws_ctx, buflist, pitchlist, 0, height,
    228253              ff->frame->data, ff->frame->linesize);
    229254
Note: See TracChangeset for help on using the changeset viewer.