| 550 | } |
| 551 | |
| 552 | int av_frame_make_writable(AVFrame *frame) |
| 553 | { |
| 554 | AVFrame tmp; |
| 555 | int ret; |
| 556 | |
| 557 | if (av_frame_is_writable(frame)) |
| 558 | return 0; |
| 559 | |
| 560 | memset(&tmp, 0, sizeof(tmp)); |
| 561 | tmp.format = frame->format; |
| 562 | tmp.width = frame->width; |
| 563 | tmp.height = frame->height; |
| 564 | tmp.nb_samples = frame->nb_samples; |
| 565 | ret = av_channel_layout_copy(&tmp.ch_layout, &frame->ch_layout); |
| 566 | if (ret < 0) { |
| 567 | av_frame_unref(&tmp); |
| 568 | return ret; |
| 569 | } |
| 570 | |
| 571 | if (frame->hw_frames_ctx) |
| 572 | ret = av_hwframe_get_buffer(frame->hw_frames_ctx, &tmp, 0); |
| 573 | else |
| 574 | ret = av_frame_get_buffer(&tmp, 0); |
| 575 | if (ret < 0) |
| 576 | return ret; |
| 577 | |
| 578 | ret = av_frame_copy(&tmp, frame); |
| 579 | if (ret < 0) { |
| 580 | av_frame_unref(&tmp); |
| 581 | return ret; |
| 582 | } |
| 583 | |
| 584 | ret = av_frame_copy_props(&tmp, frame); |
| 585 | if (ret < 0) { |
| 586 | av_frame_unref(&tmp); |
| 587 | return ret; |
| 588 | } |
| 589 | |
| 590 | av_frame_unref(frame); |
| 591 | |
| 592 | *frame = tmp; |
| 593 | if (tmp.data == tmp.extended_data) |
| 594 | frame->extended_data = frame->data; |
| 595 | |
| 596 | return 0; |
| 597 | } |
| 598 | |
| 599 | int av_frame_copy_props(AVFrame *dst, const AVFrame *src) |
| 600 | { |